文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 39.9Mb
PDF (A4) - 40.0Mb
Man Pages (TGZ) - 258.5Kb
Man Pages (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 參考手冊  /  ...  /  空間便利函數

14.16.13 空間便利函數

本節中的函數提供對幾何值進行便利操作的功能。

除非另有說明,否則本節中的函數會以下列方式處理其幾何引數

  • 如果任何引數為 NULL,則傳回值為 NULL

  • 如果任何幾何引數不是語法正確的幾何,則會發生 ER_GIS_INVALID_DATA 錯誤。

  • 如果任何幾何引數是未定義空間參考系統 (SRS) 中語法正確的幾何,則會發生 ER_SRS_NOT_FOUND 錯誤。

  • 對於採用多個幾何引數的函數,如果這些引數不在相同的 SRS 中,則會發生 ER_GIS_DIFFERENT_SRIDS 錯誤。

  • 否則,傳回值為非 NULL

提供下列便利函數

  • ST_Distance_Sphere(g1, g2 [, radius])

    傳回球面上 PointMultiPoint 引數之間的最小球面距離,以公尺為單位。(對於一般用途的距離計算,請參閱 ST_Distance() 函數。)選用的 radius 引數應以公尺為單位給定。

    如果兩個幾何參數都是 SRID 0 中有效的笛卡爾 PointMultiPoint 值,則傳回值是具有所提供半徑的球體上兩個幾何之間的最近距離。如果省略,則預設半徑為 6,370,986 公尺,點 X 和 Y 座標分別解釋為經度和緯度,以度為單位。

    如果兩個幾何參數都是地理空間參考系統 (SRS) 中有效的 PointMultiPoint 值,則傳回值是具有所提供半徑的球體上兩個幾何之間的最近距離。如果省略,則預設半徑等於平均半徑,定義為 (2a+b)/3,其中 a 是 SRS 的半長軸,b 是半短軸。

    ST_Distance_Sphere() 會如本節簡介中所述處理其引數,但有以下例外

    mysql> SET @pt1 = ST_GeomFromText('POINT(0 0)');
    mysql> SET @pt2 = ST_GeomFromText('POINT(180 0)');
    mysql> SELECT ST_Distance_Sphere(@pt1, @pt2);
    +--------------------------------+
    | ST_Distance_Sphere(@pt1, @pt2) |
    +--------------------------------+
    |             20015042.813723423 |
    +--------------------------------+
  • ST_IsValid(g)

    如果引數在幾何上有效,則傳回 1,如果引數在幾何上無效,則傳回 0。幾何有效性是由 OGC 規範定義。

    唯一有效的空幾何形狀以空幾何集合值的形式表示。在此情況下,ST_IsValid() 會傳回 1。MySQL 不支援 GIS 的 EMPTY 值,例如 POINT EMPTY

    ST_IsValid() 會依照本節簡介中的說明處理其引數,但有以下例外情況:

    • 如果幾何形狀具有超出範圍的經度或緯度的地理 SRS,則會發生錯誤。

      顯示的範圍以度為單位。如果 SRS 使用其他單位,則範圍會使用其單位中的對應值。由於浮點算術,精確的範圍限制會略有偏差。

    mysql> SET @ls1 = ST_GeomFromText('LINESTRING(0 0,-0.00 0,0.0 0)');
    mysql> SET @ls2 = ST_GeomFromText('LINESTRING(0 0, 1 1)');
    mysql> SELECT ST_IsValid(@ls1);
    +------------------+
    | ST_IsValid(@ls1) |
    +------------------+
    |                0 |
    +------------------+
    mysql> SELECT ST_IsValid(@ls2);
    +------------------+
    | ST_IsValid(@ls2) |
    +------------------+
    |                1 |
    +------------------+
  • ST_MakeEnvelope(pt1, pt2)

    傳回形成兩個點的包絡矩形,作為 PointLineStringPolygon

    計算使用笛卡爾坐標系統完成,而不是在球體、橢球體或地球上完成。

    給定兩個點 pt1pt2ST_MakeEnvelope() 會在如下的抽象平面上建立結果幾何形狀:

    • 如果 pt1pt2 相等,則結果為點 pt1

    • 否則,如果 (pt1, pt2) 是垂直或水平線段,則結果為線段 (pt1, pt2)

    • 否則,結果是一個多邊形,使用 pt1pt2 作為對角點。

    結果幾何形狀的 SRID 為 0。

    ST_MakeEnvelope() 會依照本節簡介中的說明處理其引數,但有以下例外情況:

    mysql> SET @pt1 = ST_GeomFromText('POINT(0 0)');
    mysql> SET @pt2 = ST_GeomFromText('POINT(1 1)');
    mysql> SELECT ST_AsText(ST_MakeEnvelope(@pt1, @pt2));
    +----------------------------------------+
    | ST_AsText(ST_MakeEnvelope(@pt1, @pt2)) |
    +----------------------------------------+
    | POLYGON((0 0,1 0,1 1,0 1,0 0))         |
    +----------------------------------------+
  • ST_Simplify(g, max_distance)

    使用 Douglas-Peucker 演算法簡化幾何形狀,並傳回相同類型的簡化值。

    幾何形狀可以是任何幾何形狀類型,儘管 Douglas-Peucker 演算法可能實際上不會處理每種類型。幾何形狀集合會透過將其元件逐一傳遞給簡化演算法來處理,而傳回的幾何形狀會作為結果放入幾何形狀集合中。

    max_distance 引數是要移除的頂點與其他線段的距離(以輸入坐標的單位為單位)。在此簡化線串距離內的頂點將被移除。

    根據 Boost.Geometry,幾何形狀可能會因簡化過程而變得無效,且該過程可能會產生自我相交。若要檢查結果的有效性,請將其傳遞給 ST_IsValid()

    ST_Simplify() 會依照本節簡介中的說明處理其引數,但有以下例外情況:

    • 如果 max_distance 引數不是正數或為 NaN,則會發生 ER_WRONG_ARGUMENTS 錯誤。

    mysql> SET @g = ST_GeomFromText('LINESTRING(0 0,0 1,1 1,1 2,2 2,2 3,3 3)');
    mysql> SELECT ST_AsText(ST_Simplify(@g, 0.5));
    +---------------------------------+
    | ST_AsText(ST_Simplify(@g, 0.5)) |
    +---------------------------------+
    | LINESTRING(0 0,0 1,1 1,2 3,3 3) |
    +---------------------------------+
    mysql> SELECT ST_AsText(ST_Simplify(@g, 1.0));
    +---------------------------------+
    | ST_AsText(ST_Simplify(@g, 1.0)) |
    +---------------------------------+
    | LINESTRING(0 0,3 3)             |
    +---------------------------------+
  • ST_Validate(g)

    根據 OGC 規範驗證幾何形狀。幾何形狀可能在語法上格式正確(WKB 值加上 SRID),但在幾何上無效。例如,這個多邊形在幾何上無效:POLYGON((0 0, 0 0, 0 0, 0 0, 0 0))

    如果幾何形狀在語法上格式正確且在幾何上有效,則 ST_Validate() 會傳回該幾何形狀;如果引數在語法上格式不正確、在幾何上無效或為 NULL,則傳回 NULL

    ST_Validate() 可用於過濾掉無效的幾何形狀資料,但需付出代價。對於需要更精確且未受無效資料影響的結果的應用程式,這種懲罰可能是值得的。

    如果幾何形狀引數有效,則會按原樣傳回,除非輸入的 PolygonMultiPolygon 具有順時針方向的環,否則這些環會在檢查有效性之前反轉。如果幾何形狀有效,則會傳回具有反轉環的值。

    唯一有效的空幾何形狀以空幾何集合值的形式表示。在此情況下,ST_Validate() 會直接傳回它,而無需進一步檢查。

    ST_Validate() 會依照本節簡介中的說明處理其引數,但有以下列出的例外情況:

    • 如果幾何形狀具有超出範圍的經度或緯度的地理 SRS,則會發生錯誤。

      顯示的範圍以度為單位。由於浮點運算,確切的範圍限制略有偏差。

    mysql> SET @ls1 = ST_GeomFromText('LINESTRING(0 0)');
    mysql> SET @ls2 = ST_GeomFromText('LINESTRING(0 0, 1 1)');
    mysql> SELECT ST_AsText(ST_Validate(@ls1));
    +------------------------------+
    | ST_AsText(ST_Validate(@ls1)) |
    +------------------------------+
    | NULL                         |
    +------------------------------+
    mysql> SELECT ST_AsText(ST_Validate(@ls2));
    +------------------------------+
    | ST_AsText(ST_Validate(@ls2)) |
    +------------------------------+
    | LINESTRING(0 0,1 1)          |
    +------------------------------+