名稱

ST_Split — 傳回透過另一個幾何物件分割一個幾何物件所建立的幾何物件集合。

概要

geometry ST_Split(geometry input, geometry blade);

描述

此函式支援使用 (多)點、(多)線字串或 (多)多邊形的邊界來分割線字串,或使用線字串來分割 (多)多邊形。當使用 (多)多邊形作為刀片時,其線性元件(邊界)將用於分割輸入。結果幾何物件始終是一個集合。

在某種意義上,此函式與ST_Union相反。理論上,將 ST_Union 應用於傳回的集合應該會產生原始幾何物件(儘管由於數值捨入,情況可能並非完全如此)。

[Note]

如果由於數值精度的問題,輸入和刀片沒有相交,則輸入可能不會按預期分割。為了避免這種情況,可能需要先使用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))

另請參閱

ST_Snap, ST_Union