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()
按照本節簡介中的描述處理其引數。