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_SCHEMA
ST_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
和LineString
Point
和MultiPoint
LineString
和MultiLineString
MultiPoint
和MultiPoint
MultiLineString
和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()
函數會依照本節簡介中的說明處理其引數。