ST_Split — 傳回透過另一個幾何物件分割一個幾何物件所建立的幾何物件集合。
geometry ST_Split(
geometry input, geometry blade)
;
此函式支援使用 (多)點、(多)線字串或 (多)多邊形的邊界來分割線字串,或使用線字串來分割 (多)多邊形。當使用 (多)多邊形作為刀片時,其線性元件(邊界)將用於分割輸入。結果幾何物件始終是一個集合。
在某種意義上,此函式與ST_Union相反。理論上,將 ST_Union 應用於傳回的集合應該會產生原始幾何物件(儘管由於數值捨入,情況可能並非完全如此)。
![]() |
|
如果由於數值精度的問題,輸入和刀片沒有相交,則輸入可能不會按預期分割。為了避免這種情況,可能需要先使用ST_Snap並設定一個小容差,將輸入對齊到刀片。 |
可用性:2.0.0 需要 GEOS
增強功能:2.2.0 引入了支援使用多線、多點或 (多)多邊形邊界來分割線的功能。
增強功能:2.5.0 引入了支援使用多線分割多邊形的功能。
使用線分割多邊形。
![]() 分割前
|
![]() 分割後
|
SELECT ST_AsText( ST_Split( ST_Buffer(ST_GeomFromText('POINT(100 90)'), 50), -- circle ST_MakeLine(ST_Point(10, 10),ST_Point(190, 190)) -- line )); -- result -- GEOMETRYCOLLECTION( POLYGON((150 90,149.039264020162 80.2454838991936,146.193976625564 70.8658283817455,..), POLYGON(..)) )
使用點分割多線字串,其中點正好位於兩個線字串元素上。
![]() 分割前
|
![]() 分割後
|
SELECT ST_AsText(ST_Split( 'MULTILINESTRING((10 10, 190 190), (15 15, 30 30, 100 90))', ST_Point(30,30))) As split; split ------ GEOMETRYCOLLECTION( LINESTRING(10 10,30 30), LINESTRING(30 30,190 190), LINESTRING(15 15,30 30), LINESTRING(30 30,100 90) )
使用點分割線字串,其中點並非正好位於線上。顯示使用 ST_Snap 將線對齊到點以允許分割。
WITH data AS (SELECT 'LINESTRING(0 0, 100 100)'::geometry AS line, 'POINT(51 50)':: geometry AS point ) SELECT ST_AsText( ST_Split( ST_Snap(line, point, 1), point)) AS snapped_split, ST_AsText( ST_Split(line, point)) AS not_snapped_not_split FROM data; snapped_split | not_snapped_not_split ---------------------------------------------------------------------+--------------------------------------------- GEOMETRYCOLLECTION(LINESTRING(0 0,51 50),LINESTRING(51 50,100 100)) | GEOMETRYCOLLECTION(LINESTRING(0 0,100 100))