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


MySQL 9.0 參考手冊  /  ...  /  空間便捷函數

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() 會如本節簡介中所述處理其引數,但有以下例外情況

    • 支援的幾何引數組合為 PointPoint,或 PointMultiPoint (以任何引數順序)。如果至少有一個幾何圖形既不是 Point 也不是 MultiPoint,且其 SRID 為 0,則會發生 ER_NOT_IMPLEMENTED_FOR_CARTESIAN_SRS 錯誤。如果至少有一個幾何圖形既不是 Point 也不是 MultiPoint,且其 SRID 指的是地理 SRS,則會發生 ER_NOT_IMPLEMENTED_FOR_GEOGRAPHIC_SRS 錯誤。如果任何幾何圖形指的是投影 SRS,則會發生 ER_NOT_IMPLEMENTED_FOR_PROJECTED_SRS 錯誤。

    • 如果任何引數的經度或緯度超出範圍,則會發生錯誤

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

    • 如果 radius 引數存在但非正數,則會發生 ER_NONPOSITIVE_RADIUS 錯誤。

    • 如果距離超出雙精度數的範圍,則會發生 ER_STD_OVERFLOW_ERROR 錯誤。

    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)          |
    +------------------------------+