文件首頁
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.9.1 使用物件形狀的空間關係函數

OpenGIS 規格定義了以下函數,使用精確的物件形狀來測試兩個幾何值 g1g2 之間的關係。傳回值 1 和 0 分別表示 true 和 false,但距離函數會傳回距離值。

本節中的函數會偵測笛卡爾或地理空間參考系統 (SRS) 中的引數,並傳回適用於該 SRS 的結果。

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

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

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

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

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

  • 如果任何幾何引數在幾何上無效,則結果為 true 或 false(未定義是哪個),或發生錯誤。

  • 對於地理 SRS 幾何引數,如果任何引數的經度或緯度超出範圍,則會發生錯誤

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

  • 否則,傳回值為非 NULL

本節中的某些函數允許使用單位引數來指定傳回值的長度單位。除非另有說明,函數會以下列方式處理其單位引數:

這些物件形狀函數可用於測試幾何關係:

  • ST_Contains(g1, g2)

    傳回 1 或 0,表示 g1 是否完全包含 g2。這會測試與 ST_Within() 相反的關係。

    ST_Contains() 會依本節引言中所述的方式處理其引數。

  • ST_Crosses(g1, g2)

    如果兩個幾何圖形的空間關係具有下列屬性,則表示它們在空間上交叉

    • 除非 g1g2 的維度均為 1:如果 g2 的內部與 g1 的內部有共同點,但 g2 並未涵蓋 g1 的整個內部,則 g1 會與 g2 交叉。

    • 如果 g1g2 的維度均為 1:如果線條在有限數量的點上相互交叉(也就是說,沒有共同的線段,只有共同的單一點)。

    此函數傳回 1 或 0,表示 g1 是否在空間上與 g2 交叉。

    ST_Crosses() 會依本節引言中所述的方式處理其引數,但對於以下其他條件,傳回值為 NULL

    • g1 的維度為 2 (PolygonMultiPolygon)。

    • g2 的維度為 1 (PointMultiPoint)。

  • ST_Disjoint(g1, g2)

    傳回 1 或 0,表示 g1 是否在空間上與 g2 不相交(不相交)。

    ST_Disjoint() 會依本節引言中所述的方式處理其引數。

  • ST_Distance(g1, g2 [, unit])

    傳回 g1g2 之間的距離,以幾何引數的空間參考系統 (SRS) 的長度單位測量,或者如果指定了可選的 unit 引數,則以該引數的單位測量。

    此函數會處理幾何集合,方式是傳回兩個幾何引數的元件所有組合中最短的距離。

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

    • ST_Distance() 函數會偵測地理 (橢圓體) 空間參考系統中的引數,並傳回橢圓體上的測地線距離。ST_Distance() 函數支援所有幾何類型地理 SRS 引數的距離計算。

    • 如果任何引數在幾何上無效,則結果會是未定義的距離(也就是可以是任何數字),或發生錯誤。

    • 如果中間或最終結果產生 NaN 或負數,則會發生 ER_GIS_INVALID_DATA 錯誤。

    ST_Distance() 函數允許使用可選的 unit 引數指定傳回距離值的線性單位,而 ST_Distance() 函數會依照本節簡介中的說明處理該引數。

    mysql> SET @g1 = ST_GeomFromText('POINT(1 1)');
    mysql> SET @g2 = ST_GeomFromText('POINT(2 2)');
    mysql> SELECT ST_Distance(@g1, @g2);
    +-----------------------+
    | ST_Distance(@g1, @g2) |
    +-----------------------+
    |    1.4142135623730951 |
    +-----------------------+
    
    mysql> SET @g1 = ST_GeomFromText('POINT(1 1)', 4326);
    mysql> SET @g2 = ST_GeomFromText('POINT(2 2)', 4326);
    mysql> SELECT ST_Distance(@g1, @g2);
    +-----------------------+
    | ST_Distance(@g1, @g2) |
    +-----------------------+
    |     156874.3859490455 |
    +-----------------------+
    mysql> SELECT ST_Distance(@g1, @g2, 'metre');
    +--------------------------------+
    | ST_Distance(@g1, @g2, 'metre') |
    +--------------------------------+
    |              156874.3859490455 |
    +--------------------------------+
    mysql> SELECT ST_Distance(@g1, @g2, 'foot');
    +-------------------------------+
    | ST_Distance(@g1, @g2, 'foot') |
    +-------------------------------+
    |             514679.7439273146 |
    +-------------------------------+

    對於球體上距離計算的特殊情況,請參閱 ST_Distance_Sphere() 函數。

  • ST_Equals(g1, g2)

    傳回 1 或 0,以指出 g1 在空間上是否等於 g2

    ST_Equals() 函數會依照本節簡介中的說明處理其引數,但空幾何引數不會傳回 NULL

    mysql> SET @g1 = Point(1,1), @g2 = Point(2,2);
    mysql> SELECT ST_Equals(@g1, @g1), ST_Equals(@g1, @g2);
    +---------------------+---------------------+
    | ST_Equals(@g1, @g1) | ST_Equals(@g1, @g2) |
    +---------------------+---------------------+
    |                   1 |                   0 |
    +---------------------+---------------------+
  • ST_FrechetDistance(g1, g2 [, unit])

    傳回兩個幾何圖形之間的離散 Fréchet 距離,反映幾何圖形的相似程度。結果是一個雙精度數字,以幾何引數的空間參考系統 (SRS) 的長度單位測量,或者如果給定 unit 引數,則以該引數的長度單位測量。

    此函數會實作離散 Fréchet 距離,這表示它僅限於幾何圖形點之間的距離。例如,給定兩個 LineString 引數,只會考慮幾何圖形中明確提及的點。不會考慮這些點之間線段上的點。

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

    ST_FrechetDistance() 函數會依照本節簡介中的說明處理其可選的 unit 引數。

    mysql> SET @ls1 = ST_GeomFromText('LINESTRING(0 0,0 5,5 5)');
    mysql> SET @ls2 = ST_GeomFromText('LINESTRING(0 1,0 6,3 3,5 6)');
    mysql> SELECT ST_FrechetDistance(@ls1, @ls2);
    +--------------------------------+
    | ST_FrechetDistance(@ls1, @ls2) |
    +--------------------------------+
    |             2.8284271247461903 |
    +--------------------------------+
    
    mysql> SET @ls1 = ST_GeomFromText('LINESTRING(0 0,0 5,5 5)', 4326);
    mysql> SET @ls2 = ST_GeomFromText('LINESTRING(0 1,0 6,3 3,5 6)', 4326);
    mysql> SELECT ST_FrechetDistance(@ls1, @ls2);
    +--------------------------------+
    | ST_FrechetDistance(@ls1, @ls2) |
    +--------------------------------+
    |              313421.1999416798 |
    +--------------------------------+
    mysql> SELECT ST_FrechetDistance(@ls1, @ls2, 'foot');
    +----------------------------------------+
    | ST_FrechetDistance(@ls1, @ls2, 'foot') |
    +----------------------------------------+
    |                     1028284.7767115477 |
    +----------------------------------------+
  • ST_HausdorffDistance(g1, g2 [, unit])

    傳回兩個幾何圖形之間的離散 Hausdorff 距離,反映幾何圖形的相似程度。結果是一個雙精度數字,以幾何引數的空間參考系統 (SRS) 的長度單位測量,或者如果給定 unit 引數,則以該引數的長度單位測量。

    此函數會實作離散 Hausdorff 距離,這表示它僅限於幾何圖形點之間的距離。例如,給定兩個 LineString 引數,只會考慮幾何圖形中明確提及的點。不會考慮這些點之間線段上的點。

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

    • 如果幾何引數位於相同的笛卡兒或地理 SRS 中,但並非位於支援的組合中,則會發生 ER_NOT_IMPLEMENTED_FOR_CARTESIAN_SRSER_NOT_IMPLEMENTED_FOR_GEOGRAPHIC_SRS 錯誤,具體取決於 SRS 類型。支援以下組合:

      • LineStringLineString

      • PointMultiPoint

      • LineStringMultiLineString

      • MultiPointMultiPoint

      • MultiLineStringMultiLineString

    ST_HausdorffDistance() 函數會依照本節簡介中的說明處理其可選的 unit 引數。

    mysql> SET @ls1 = ST_GeomFromText('LINESTRING(0 0,0 5,5 5)');
    mysql> SET @ls2 = ST_GeomFromText('LINESTRING(0 1,0 6,3 3,5 6)');
    mysql> SELECT ST_HausdorffDistance(@ls1, @ls2);
    +----------------------------------+
    | ST_HausdorffDistance(@ls1, @ls2) |
    +----------------------------------+
    |                                1 |
    +----------------------------------+
    
    mysql> SET @ls1 = ST_GeomFromText('LINESTRING(0 0,0 5,5 5)', 4326);
    mysql> SET @ls2 = ST_GeomFromText('LINESTRING(0 1,0 6,3 3,5 6)', 4326);
    mysql> SELECT ST_HausdorffDistance(@ls1, @ls2);
    +----------------------------------+
    | ST_HausdorffDistance(@ls1, @ls2) |
    +----------------------------------+
    |               111319.49079326246 |
    +----------------------------------+
    mysql> SELECT ST_HausdorffDistance(@ls1, @ls2, 'foot');
    +------------------------------------------+
    | ST_HausdorffDistance(@ls1, @ls2, 'foot') |
    +------------------------------------------+
    |                        365221.4264870815 |
    +------------------------------------------+
  • ST_Intersects(g1, g2)

    傳回 1 或 0,以指出 g1 是否在空間上與 g2 相交。

    ST_Intersects() 函數會依照本節簡介中的說明處理其引數。

  • ST_Overlaps(g1, g2)

    如果兩個幾何圖形相交,且其相交的結果為相同維度的幾何圖形,但不等於任何一個指定的幾何圖形,則這兩個幾何圖形會在空間上重疊

    此函數會傳回 1 或 0,以指出 g1 是否在空間上與 g2 重疊。

    ST_Overlaps() 函數會依照本節簡介中的說明處理其引數,但如果兩個幾何圖形的維度不相等,則傳回值為 NULL

  • ST_Touches(g1, g2)

    如果兩個幾何圖形的內部不相交,但其中一個幾何圖形的邊界與另一個幾何圖形的邊界或內部相交,則這兩個幾何圖形會在空間上接觸

    此函數會傳回 1 或 0,以指出 g1 是否在空間上與 g2 接觸。

    ST_Touches() 函數會依照本節簡介中的說明處理其引數,但如果兩個幾何圖形都是維度 0 (PointMultiPoint),則傳回值為 NULL

  • ST_Within(g1, g2)

    傳回 1 或 0,以指出 g1 是否在空間上位於 g2 內。此函數會測試與 ST_Contains() 相反的關係。

    ST_Within() 函數會依照本節簡介中的說明處理其引數。