OpenGIS 提出了一些可以產生幾何圖形的函式。它們的設計目的是實作空間運算子。這些函式支援所有引數類型組合,但根據 Open Geospatial Consortium 規格不適用的組合除外。
MySQL 也實作了一些 OpenGIS 的擴充函式,如函式說明中所述。此外,第 14.16.7 節「幾何屬性函式」討論了幾個從現有幾何圖形建構新幾何圖形的函式。請參閱該章節以了解這些函式的說明
除非另有說明,否則本節中的函式會以下列方式處理其幾何引數
如果任何引數為
NULL
,則傳回值為NULL
。如果任何幾何引數不是語法上格式正確的幾何圖形,則會發生
ER_GIS_INVALID_DATA
錯誤。如果任何幾何引數是未定義空間參考系統 (SRS) 中語法上格式正確的幾何圖形,則會發生
ER_SRS_NOT_FOUND
錯誤。對於採用多個幾何引數的函式,如果這些引數不在相同的 SRS 中,則會發生
ER_GIS_DIFFERENT_SRIDS
錯誤。如果任何幾何引數的地理 SRS 具有 SRID 值,且函式不處理地理幾何圖形,則會發生
ER_NOT_IMPLEMENTED_FOR_GEOGRAPHIC_SRS
錯誤。對於地理 SRS 幾何引數,如果任何引數的經度或緯度超出範圍,則會發生錯誤
如果經度值不在範圍 (-180, 180] 中,則會發生
ER_GEOMETRY_PARAM_LONGITUDE_OUT_OF_RANGE
錯誤。如果緯度值不在範圍 [-90, 90] 中,則會發生
ER_GEOMETRY_PARAM_LATITUDE_OUT_OF_RANGE
錯誤。
顯示的範圍以度為單位。如果 SRS 使用其他單位,則範圍會使用其單位中的對應值。由於浮點算術,精確的範圍限制會略有偏差。
否則,傳回值為非
NULL
。
這些空間運算子函式可用
ST_Buffer(
g
,d
[,strategy1
[,strategy2
[,strategy3
]]])傳回表示所有點的幾何圖形,這些點與幾何值
g
的距離小於或等於距離d
。結果與幾何引數的 SRS 相同。如果幾何引數為空,
ST_Buffer()
會傳回空幾何圖形。如果距離為 0,
ST_Buffer()
會傳回未變更的幾何引數mysql> SET @pt = ST_GeomFromText('POINT(0 0)'); mysql> SELECT ST_AsText(ST_Buffer(@pt, 0)); +------------------------------+ | ST_AsText(ST_Buffer(@pt, 0)) | +------------------------------+ | POINT(0 0) | +------------------------------+
如果幾何引數位於笛卡爾 SRS 中
ST_Buffer()
支援Polygon
和MultiPolygon
值,以及包含Polygon
或MultiPolygon
值的幾何集合的負距離。如果結果縮減到消失,則結果為空幾何圖形。
對於
Point
、MultiPoint
、LineString
和MultiLineString
值,以及不包含任何Polygon
或MultiPolygon
值的幾何集合,使用負距離的ST_Buffer()
會發生ER_WRONG_ARGUMENTS
錯誤。
允許地理 SRS 中的
Point
幾何圖形,但須符合下列條件如果距離不為負,且未指定任何策略,則函式會傳回
Point
在其 SRS 中的地理緩衝區。距離引數必須為 SRS 距離單位(目前始終為公尺)。如果距離為負值,或指定了任何策略(除了
NULL
以外),則會發生ER_WRONG_ARGUMENTS
錯誤。
對於非
Point
幾何圖形,會發生ER_NOT_IMPLEMENTED_FOR_GEOGRAPHIC_SRS
錯誤。ST_Buffer()
允許在距離參數之後最多使用三個可選的策略參數。策略會影響緩衝區的計算。這些參數是由ST_Buffer_Strategy()
函數產生的位元組字串值,用於點、連接和結束策略。點策略適用於
Point
和MultiPoint
幾何圖形。如果未指定點策略,則預設值為ST_Buffer_Strategy('point_circle', 32)
。連接策略適用於
LineString
、MultiLineString
、Polygon
和MultiPolygon
幾何圖形。如果未指定連接策略,則預設值為ST_Buffer_Strategy('join_round', 32)
。結束策略適用於
LineString
和MultiLineString
幾何圖形。如果未指定結束策略,則預設值為ST_Buffer_Strategy('end_round', 32)
。
每一種類型最多可以指定一個策略,並且可以按任何順序給定。
如果緩衝區策略無效,則會發生
ER_WRONG_ARGUMENTS
錯誤。在以下任何情況下,策略均為無效:指定了給定類型的多個策略(點、連接或結束)。
將非策略的值(例如任意二進制字串或數字)作為策略傳遞。
傳遞了
Point
策略,但幾何圖形不包含Point
或MultiPoint
值。傳遞了結束或連接策略,但幾何圖形不包含
LineString
、Polygon
、MultiLinestring
或MultiPolygon
值。
mysql> SET @pt = ST_GeomFromText('POINT(0 0)'); mysql> SET @pt_strategy = ST_Buffer_Strategy('point_square'); mysql> SELECT ST_AsText(ST_Buffer(@pt, 2, @pt_strategy)); +--------------------------------------------+ | ST_AsText(ST_Buffer(@pt, 2, @pt_strategy)) | +--------------------------------------------+ | POLYGON((-2 -2,2 -2,2 2,-2 2,-2 -2)) | +--------------------------------------------+
mysql> SET @ls = ST_GeomFromText('LINESTRING(0 0,0 5,5 5)'); mysql> SET @end_strategy = ST_Buffer_Strategy('end_flat'); mysql> SET @join_strategy = ST_Buffer_Strategy('join_round', 10); mysql> SELECT ST_AsText(ST_Buffer(@ls, 5, @end_strategy, @join_strategy)) +---------------------------------------------------------------+ | ST_AsText(ST_Buffer(@ls, 5, @end_strategy, @join_strategy)) | +---------------------------------------------------------------+ | POLYGON((5 5,5 10,0 10,-3.5355339059327373 8.535533905932738, | | -5 5,-5 0,0 0,5 0,5 5)) | +---------------------------------------------------------------+
ST_Buffer_Strategy(
strategy
[,points_per_circle
])此函數會傳回用於
ST_Buffer()
的策略位元組字串,以影響緩衝區的計算。有關策略的資訊,請參閱 Boost.org。
第一個參數必須是一個字串,表示策略選項
對於點策略,允許的值為
'point_circle'
和'point_square'
。對於連接策略,允許的值為
'join_round'
和'join_miter'
。對於結束策略,允許的值為
'end_round'
和'end_flat'
。
如果第一個參數為
'point_circle'
、'join_round'
、'join_miter'
或'end_round'
,則必須將points_per_circle
參數給定為正數值。points_per_circle
的最大值是max_points_in_geometry
系統變數的值。如需範例,請參閱
ST_Buffer()
的說明。ST_Buffer_Strategy()
會按照本節簡介中的說明處理其參數,但以下例外:如果任何參數無效,則會發生
ER_WRONG_ARGUMENTS
錯誤。如果第一個參數為
'point_square'
或'end_flat'
,則不得給定points_per_circle
參數,否則會發生ER_WRONG_ARGUMENTS
錯誤。
傳回一個幾何圖形,表示幾何值
g
的凸包。此函數會先檢查幾何圖形的頂點是否共線,來計算其凸包。如果共線,則函數會傳回線性包;否則會傳回多邊形包。此函數會處理幾何圖形集合,方法是擷取集合中所有元件的所有頂點,從中建立
MultiPoint
值,然後計算其凸包。ST_ConvexHull()
會按照本節簡介中的說明處理其參數,但以下例外:對於參數為空幾何圖形集合的額外條件,傳回值為
NULL
。
mysql> SET @g = 'MULTIPOINT(5 0,25 0,15 10,15 25)'; mysql> SELECT ST_AsText(ST_ConvexHull(ST_GeomFromText(@g))); +-----------------------------------------------+ | ST_AsText(ST_ConvexHull(ST_GeomFromText(@g))) | +-----------------------------------------------+ | POLYGON((5 0,25 0,15 25,5 0)) | +-----------------------------------------------+
傳回一個幾何圖形,表示幾何值
g1
和g2
的點集合差。結果與幾何參數在相同的 SRS 中。ST_Difference()
允許笛卡爾或地理 SRS 中的參數,並按照本節簡介中的說明處理其參數。mysql> SET @g1 = Point(1,1), @g2 = Point(2,2); mysql> SELECT ST_AsText(ST_Difference(@g1, @g2)); +------------------------------------+ | ST_AsText(ST_Difference(@g1, @g2)) | +------------------------------------+ | POINT(1 1) | +------------------------------------+
傳回一個幾何圖形,表示幾何值
g1
和g2
的點集合交集。結果與幾何參數在相同的 SRS 中。ST_Intersection()
允許笛卡爾或地理 SRS 中的參數,並按照本節簡介中的說明處理其參數。mysql> SET @g1 = ST_GeomFromText('LineString(1 1, 3 3)'); mysql> SET @g2 = ST_GeomFromText('LineString(1 3, 3 1)'); mysql> SELECT ST_AsText(ST_Intersection(@g1, @g2)); +--------------------------------------+ | ST_AsText(ST_Intersection(@g1, @g2)) | +--------------------------------------+ | POINT(2 2) | +--------------------------------------+
ST_LineInterpolatePoint(
ls
,fractional_distance
)此函數會採用
LineString
幾何圖形和範圍在 [0.0, 1.0] 內的距離分數,並傳回沿著LineString
的Point
,其位置為從起點到終點的距離的分數。它可用於回答諸如哪個Point
位於幾何圖形參數所描述的道路中點的問題。此函數已針對所有空間參考系統(包括笛卡爾和地理系統)中的
LineString
幾何圖形實作。如果
fractional_distance
參數為 1.0,則由於近似值計算中的數值不準確性,結果可能不是LineString
參數的最後一個點,而是接近它的點。相關函數
ST_LineInterpolatePoints()
採用類似的參數,但會傳回MultiPoint
,其由沿著LineString
的Point
值組成,每個Point
值的位置為從起點到終點的距離的分數。如需兩個函數的範例,請參閱ST_LineInterpolatePoints()
的說明。ST_LineInterpolatePoint()
會按照本節簡介中的說明處理其參數,但以下例外:如果幾何參數不是
LineString
,則會發生ER_UNEXPECTED_GEOMETRY_TYPE
錯誤。如果距離分數參數超出範圍 [0.0, 1.0],則會發生
ER_DATA_OUT_OF_RANGE
錯誤。
ST_LineInterpolatePoint()
是 MySQL 對 OpenGIS 的擴充功能。ST_LineInterpolatePoints(
ls
,fractional_distance
)此函數會採用
LineString
幾何圖形和範圍在 (0.0, 1.0] 內的距離分數,並傳回由LineString
起點組成的MultiPoint
,加上沿著LineString
的Point
值,每個Point
值的位置為從起點到終點的距離的分數。它可用於回答諸如哪些Point
值位於幾何圖形參數所描述的道路上每 10% 的位置的問題。此函數已針對所有空間參考系統(包括笛卡爾和地理系統)中的
LineString
幾何圖形實作。如果
fractional_distance
參數除以 1.0 的餘數為零,則由於近似值計算中的數值不準確性,結果可能不包含LineString
參數的最後一個點,而是接近它的點。相關函數
ST_LineInterpolatePoint()
採用類似的參數,但會傳回沿著LineString
的Point
,其位置為從起點到終點的距離的分數。ST_LineInterpolatePoints()
會按照本節簡介中的說明處理其參數,但以下例外:如果幾何參數不是
LineString
,則會發生ER_UNEXPECTED_GEOMETRY_TYPE
錯誤。如果距離分數參數超出範圍 [0.0, 1.0],則會發生
ER_DATA_OUT_OF_RANGE
錯誤。
mysql> SET @ls1 = ST_GeomFromText('LINESTRING(0 0,0 5,5 5)'); mysql> SELECT ST_AsText(ST_LineInterpolatePoint(@ls1, .5)); +----------------------------------------------+ | ST_AsText(ST_LineInterpolatePoint(@ls1, .5)) | +----------------------------------------------+ | POINT(0 5) | +----------------------------------------------+ mysql> SELECT ST_AsText(ST_LineInterpolatePoint(@ls1, .75)); +-----------------------------------------------+ | ST_AsText(ST_LineInterpolatePoint(@ls1, .75)) | +-----------------------------------------------+ | POINT(2.5 5) | +-----------------------------------------------+ mysql> SELECT ST_AsText(ST_LineInterpolatePoint(@ls1, 1)); +---------------------------------------------+ | ST_AsText(ST_LineInterpolatePoint(@ls1, 1)) | +---------------------------------------------+ | POINT(5 5) | +---------------------------------------------+ mysql> SELECT ST_AsText(ST_LineInterpolatePoints(@ls1, .25)); +------------------------------------------------+ | ST_AsText(ST_LineInterpolatePoints(@ls1, .25)) | +------------------------------------------------+ | MULTIPOINT((0 2.5),(0 5),(2.5 5),(5 5)) | +------------------------------------------------+
ST_LineInterpolatePoints()
是 MySQL 對 OpenGIS 的擴充功能。ST_PointAtDistance(
ls
,distance
)此函數會採用
LineString
幾何圖形和範圍在 [0.0,ST_Length(
] 內的距離,距離以ls
)LineString
的空間參考系統 (SRS) 單位測量,並傳回沿著LineString
的Point
,其位置為距離起點的距離。它可用於回答諸如哪個Point
值距離幾何圖形參數所描述的道路起點 400 公尺的問題。此函數已針對所有空間參考系統(包括笛卡爾和地理系統)中的
LineString
幾何圖形實作。ST_PointAtDistance()
會按照本節簡介中的說明處理其參數,但以下例外:如果幾何參數不是
LineString
,則會發生ER_UNEXPECTED_GEOMETRY_TYPE
錯誤。如果距離分數參數超出範圍 [0.0,
ST_Length(
],則會發生ls
)ER_DATA_OUT_OF_RANGE
錯誤。
ST_PointAtDistance()
是 MySQL 對 OpenGIS 的擴充功能。傳回一個幾何圖形,表示幾何值
g1
和g2
的點集合對稱差,定義如下:g1 symdifference g2 := (g1 union g2) difference (g1 intersection g2)
或者,使用函數呼叫表示法:
ST_SymDifference(g1, g2) = ST_Difference(ST_Union(g1, g2), ST_Intersection(g1, g2))
結果與幾何參數在相同的 SRS 中。
ST_SymDifference()
允許笛卡爾或地理 SRS 中的參數,並按照本節簡介中的說明處理其參數。mysql> SET @g1 = ST_GeomFromText('MULTIPOINT(5 0,15 10,15 25)'); mysql> SET @g2 = ST_GeomFromText('MULTIPOINT(1 1,15 10,15 25)'); mysql> SELECT ST_AsText(ST_SymDifference(@g1, @g2)); +---------------------------------------+ | ST_AsText(ST_SymDifference(@g1, @g2)) | +---------------------------------------+ | MULTIPOINT((1 1),(5 0)) | +---------------------------------------+
將幾何圖形從一個空間參考系統 (SRS) 轉換到另一個。傳回值是與輸入幾何圖形類型相同的幾何圖形,所有座標都已轉換為目標 SRID,
target_srid
。MySQL 支援 EPSG 定義的所有 SRS,但此處列出的除外:EPSG 1042 Krovak Modified
EPSG 1043 Krovak Modified (North Orientated)
EPSG 9816 Tunisia Mining Grid
EPSG 9826 蘭伯特正角圓錐投影(西向)
ST_Transform()
依照本節引言所述處理其參數,但有以下例外情況:具有地理 SRS 的 SRID 值的幾何參數不會產生錯誤。
如果幾何或目標 SRID 參數具有指向未定義空間參考系統 (SRS) 的 SRID 值,則會發生
ER_SRS_NOT_FOUND
錯誤。如果幾何圖形位於
ST_Transform()
無法轉換的 SRS 中,則會發生ER_TRANSFORM_SOURCE_SRS_NOT_SUPPORTED
錯誤。如果目標 SRID 位於
ST_Transform()
無法轉換的 SRS 中,則會發生ER_TRANSFORM_TARGET_SRS_NOT_SUPPORTED
錯誤。如果幾何圖形位於非 WGS 84 且沒有 TOWGS84 子句的 SRS 中,則會發生
ER_TRANSFORM_SOURCE_SRS_MISSING_TOWGS84
錯誤。如果目標 SRID 位於非 WGS 84 且沒有 TOWGS84 子句的 SRS 中,則會發生
ER_TRANSFORM_TARGET_SRS_MISSING_TOWGS84
錯誤。
ST_SRID(
和g
,target_srid
)ST_Transform(
的差異如下:g
,target_srid
)ST_SRID()
會變更幾何圖形的 SRID 值,而不轉換其座標。ST_Transform()
除了變更其 SRID 值之外,還會轉換幾何圖形的座標。
mysql> SET @p = ST_GeomFromText('POINT(52.381389 13.064444)', 4326); mysql> SELECT ST_AsText(@p); +----------------------------+ | ST_AsText(@p) | +----------------------------+ | POINT(52.381389 13.064444) | +----------------------------+ mysql> SET @p = ST_Transform(@p, 4230); mysql> SELECT ST_AsText(@p); +---------------------------------------------+ | ST_AsText(@p) | +---------------------------------------------+ | POINT(52.38208611407426 13.065520672345304) | +---------------------------------------------+
傳回一個幾何圖形,表示幾何值
g1
和g2
的點集聯集。結果與幾何參數位於相同的 SRS 中。ST_Union()
允許使用笛卡爾或地理 SRS 中的參數,並按照本節引言所述處理其參數。mysql> SET @g1 = ST_GeomFromText('LineString(1 1, 3 3)'); mysql> SET @g2 = ST_GeomFromText('LineString(1 3, 3 1)'); mysql> SELECT ST_AsText(ST_Union(@g1, @g2)); +--------------------------------------+ | ST_AsText(ST_Union(@g1, @g2)) | +--------------------------------------+ | MULTILINESTRING((1 1,3 3),(1 3,3 1)) | +--------------------------------------+