本節中的函數提供對幾何值進行便利操作的功能。
除非另有說明,否則本節中的函數會以下列方式處理其幾何引數
如果任何引數為
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 不支援 GIS 的EMPTY
值,例如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
錯誤。如果任何幾何形狀具有地理空間參考系統 (SRS) 的 SRID 值,則會發生
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) | +------------------------------+