本節中的函數提供幾何值的便捷運算。
除非另有指定,否則本節中的函數會以下列方式處理其幾何引數
如果任何引數為
NULL
,則傳回值為NULL
。如果任何幾何引數不是語法正確的幾何,則會發生
ER_GIS_INVALID_DATA
錯誤。如果任何幾何引數是未定義空間參考系統 (SRS) 中語法正確的幾何,則會發生
ER_SRS_NOT_FOUND
錯誤。對於採用多個幾何引數的函數,如果這些引數不在相同的 SRS 中,則會發生
ER_GIS_DIFFERENT_SRIDS
錯誤。否則,傳回值為非
NULL
。
這些便捷函數可用
ST_Distance_Sphere(
g1
,g2
[,radius
])傳回球體上
Point
或MultiPoint
引數之間的最小球面距離,以公尺為單位。(如需一般用途的距離計算,請參閱ST_Distance()
函數。) 可選的radius
引數應以公尺為單位給定。如果兩個幾何參數都是 SRID 0 中有效的笛卡爾
Point
或MultiPoint
值,則傳回值為具有所提供半徑的球體上兩個幾何圖形之間的最短距離。如果省略,則預設半徑為 6,370,986 公尺,點 X 和 Y 座標分別以度數解釋為經度和緯度。如果兩個幾何參數都是地理空間參考系統 (SRS) 中有效的
Point
或MultiPoint
值,則傳回值為具有所提供半徑的球體上兩個幾何圖形之間的最短距離。如果省略,則預設半徑等於平均半徑,定義為 (2a+b)/3,其中 a 是 SRS 的半長軸,b 是半短軸。ST_Distance_Sphere()
會如本節簡介中所述處理其引數,但有以下例外情況支援的幾何引數組合為
Point
和Point
,或Point
和MultiPoint
(以任何引數順序)。如果至少有一個幾何圖形既不是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
錯誤。如果任何引數的經度或緯度超出範圍,則會發生錯誤
如果經度值不在範圍 (−180, 180] 內,則會發生
ER_GEOMETRY_PARAM_LONGITUDE_OUT_OF_RANGE
錯誤。如果緯度值不在範圍 [−90, 90] 內,則會發生
ER_GEOMETRY_PARAM_LATITUDE_OUT_OF_RANGE
錯誤。
顯示的範圍以度為單位。如果 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 | +--------------------------------+
如果引數在幾何上有效,則傳回 1,如果引數在幾何上無效,則傳回 0。幾何有效性由 OGC 規範定義。
唯一有效的空幾何會以空幾何集合值的形式表示。
ST_IsValid()
在這種情況下傳回 1。MySQL 不支援 GISEMPTY
值,例如POINT EMPTY
。ST_IsValid()
會如本節簡介中所述處理其引數,但有以下例外情況如果幾何圖形具有地理 SRS,且經度或緯度超出範圍,則會發生錯誤
如果經度值不在範圍 (−180, 180] 內,則會發生
ER_GEOMETRY_PARAM_LONGITUDE_OUT_OF_RANGE
錯誤。如果緯度值不在範圍 [−90, 90] 內,則會發生
ER_GEOMETRY_PARAM_LATITUDE_OUT_OF_RANGE
錯誤。
顯示的範圍以度為單位。如果 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 | +------------------+
傳回形成兩個點周圍外框的矩形,作為
Point
、LineString
或Polygon
。計算是使用笛卡爾座標系統完成,而不是在球體、橢圓體或地球上完成。
給定兩個點
pt1
和pt2
,ST_MakeEnvelope()
會在抽象平面上建立結果幾何圖形,如下所示如果
pt1
和pt2
相等,則結果為點pt1
。否則,如果
(
是一個垂直或水平的線段,則結果為線段pt1
,pt2
)(
。pt1
,pt2
)否則,結果是一個以
pt1
和pt2
作為對角點的多邊形。
結果幾何圖形的 SRID 為 0。
ST_MakeEnvelope()
處理其參數的方式如本節介紹中所述,但有以下例外如果參數不是
Point
值,則會發生ER_WRONG_ARGUMENTS
錯誤。如果兩個點的任何座標值為無限大或
NaN
,則會發生ER_GIS_INVALID_DATA
錯誤。如果任何幾何圖形的 SRID 值用於地理空間參考系統 (SRS),則會發生
ER_NOT_IMPLEMENTED_FOR_GEOGRAPHIC_SRS
錯誤。
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)) | +----------------------------------------+
使用 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) | +---------------------------------+
根據 OGC 規範驗證幾何圖形。幾何圖形在語法上可以是格式正確的(WKB 值加上 SRID),但在幾何上可能是無效的。例如,這個多邊形在幾何上是無效的:
POLYGON((0 0, 0 0, 0 0, 0 0, 0 0))
如果幾何圖形在語法上格式正確且在幾何上有效,
ST_Validate()
會傳回該幾何圖形;如果參數在語法上格式不正確、在幾何上無效或為NULL
,則會傳回NULL
。可以使用
ST_Validate()
過濾掉無效的幾何圖形資料,但會付出代價。對於需要更精確結果且不受無效資料影響的應用程式而言,這種代價可能是值得的。如果幾何圖形參數有效,則會按原樣傳回,但如果輸入的
Polygon
或MultiPolygon
具有順時針環,則這些環會在檢查有效性之前反轉。如果幾何圖形有效,則會傳回具有反轉環的值。唯一有效的空幾何圖形是以空幾何集合值的形式表示。
ST_Validate()
在這種情況下會直接傳回它,而無需進一步檢查。ST_Validate()
處理其參數的方式如本節介紹中所述,但有此處列出的例外情況如果幾何圖形具有地理 SRS,且經度或緯度超出範圍,則會發生錯誤
如果經度值不在範圍 (−180, 180] 內,則會發生
ER_GEOMETRY_PARAM_LONGITUDE_OUT_OF_RANGE
錯誤。如果緯度值不在範圍 [−90, 90] 內,則會發生
ER_GEOMETRY_PARAM_LATITUDE_OUT_OF_RANGE
錯誤。
顯示的範圍以度為單位。由於浮點運算,確切的範圍限制略有偏差。
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) | +------------------------------+