OpenGIS 規格定義了以下函數,使用精確的物件形狀來測試兩個幾何值 g1 和 g2 之間的關係。傳回值 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 幾何引數,如果任何引數的經度或緯度超出範圍,則會發生錯誤
如果經度值不在 (−180, 180] 範圍內,則會發生
ER_GEOMETRY_PARAM_LONGITUDE_OUT_OF_RANGE錯誤。如果緯度值不在 [−90, 90] 範圍內,則會發生
ER_GEOMETRY_PARAM_LATITUDE_OUT_OF_RANGE錯誤。
顯示的範圍以度為單位。如果 SRS 使用其他單位,則範圍會使用其單位中對應的值。由於浮點運算,精確的範圍限制會略有偏差。
否則,傳回值為非
NULL。
本節中的某些函數允許使用單位引數來指定傳回值的長度單位。除非另有說明,函數會以下列方式處理其單位引數:
如果在
INFORMATION_SCHEMAST_UNITS_OF_MEASURE表格中找到單位,則支援該單位。請參閱 第 28.3.37 節,「INFORMATION_SCHEMA ST_UNITS_OF_MEASURE 表格」。如果指定了 MySQL 不支援的單位,則會發生
ER_UNIT_NOT_FOUND錯誤。如果指定了支援的線性單位,且 SRID 為 0,則會發生
ER_GEOMETRY_IN_UNKNOWN_LENGTH_UNIT錯誤。如果指定了支援的線性單位,且 SRID 不為 0,則結果會以該單位表示。
如果未指定單位,則結果會以幾何圖形的 SRS 單位表示,無論是笛卡爾或地理。目前,所有 MySQL SRS 都以公尺表示。
這些物件形狀函數可用於測試幾何關係:
傳回 1 或 0,表示
g1是否完全包含g2。這會測試與ST_Within()相反的關係。ST_Contains()會依本節引言中所述的方式處理其引數。如果兩個幾何圖形的空間關係具有下列屬性,則表示它們在空間上交叉:
除非
g1和g2的維度均為 1:如果g2的內部與g1的內部有共同點,但g2並未涵蓋g1的整個內部,則g1會與g2交叉。如果
g1和g2的維度均為 1:如果線條在有限數量的點上相互交叉(也就是說,沒有共同的線段,只有共同的單一點)。
此函數傳回 1 或 0,表示
g1是否在空間上與g2交叉。ST_Crosses()會依本節引言中所述的方式處理其引數,但對於以下其他條件,傳回值為NULL:g1的維度為 2 (Polygon或MultiPolygon)。g2的維度為 1 (Point或MultiPoint)。
傳回 1 或 0,表示
g1是否在空間上與g2不相交(不相交)。ST_Disjoint()會依本節引言中所述的方式處理其引數。傳回
g1和g2之間的距離,以幾何引數的空間參考系統 (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()函數。傳回 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()函數會依照本節簡介中的說明處理其幾何引數,但有以下例外情況:幾何圖形可能具有笛卡兒或地理 SRS,但僅支援
LineString值。如果引數位於相同的笛卡兒或地理 SRS 中,但任一引數不是LineString,則會發生ER_NOT_IMPLEMENTED_FOR_CARTESIAN_SRS或ER_NOT_IMPLEMENTED_FOR_GEOGRAPHIC_SRS錯誤,具體取決於 SRS 類型。
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_SRS或ER_NOT_IMPLEMENTED_FOR_GEOGRAPHIC_SRS錯誤,具體取決於 SRS 類型。支援以下組合:LineString和LineStringPoint和MultiPointLineString和MultiLineStringMultiPoint和MultiPointMultiLineString和MultiLineString
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 | +------------------------------------------+傳回 1 或 0,以指出
g1是否在空間上與g2相交。ST_Intersects()函數會依照本節簡介中的說明處理其引數。如果兩個幾何圖形相交,且其相交的結果為相同維度的幾何圖形,但不等於任何一個指定的幾何圖形,則這兩個幾何圖形會在空間上重疊。
此函數會傳回 1 或 0,以指出
g1是否在空間上與g2重疊。ST_Overlaps()函數會依照本節簡介中的說明處理其引數,但如果兩個幾何圖形的維度不相等,則傳回值為NULL。如果兩個幾何圖形的內部不相交,但其中一個幾何圖形的邊界與另一個幾何圖形的邊界或內部相交,則這兩個幾何圖形會在空間上接觸。
此函數會傳回 1 或 0,以指出
g1是否在空間上與g2接觸。ST_Touches()函數會依照本節簡介中的說明處理其引數,但如果兩個幾何圖形都是維度 0 (Point或MultiPoint),則傳回值為NULL。傳回 1 或 0,以指出
g1是否在空間上位於g2內。此函數會測試與ST_Contains()相反的關係。ST_Within()函數會依照本節簡介中的說明處理其引數。