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 引入了通过多线分割多边形的支持。
Split a circular polygon by a diagonal line.
SELECT
ST_Split(
ST_Buffer('POINT(100 90)'::geometry, 50),
'LINESTRING(10 10,190 190)'::geometry
);
GEOMETRYCOLLECTION(POLYGON((150 90,149 80.2,146.2 70.9,141.6 62.2,135.4 54.6,127.8 48.4,119.1 43.8,109.8 41,100 40,90.2 41,80.9 43.8,72.2 48.4,64.6 54.6,60.1 60.1,129.9 129.9,135.4 125.4,141.6 117.8,146.2 109.1,149 99.8,150 90)), POLYGON((60.1 60.1,58.4 62.2,53.8 70.9,51 80.2,50 90,51 99.8,53.8 109.1,58.4 117.8,64.6 125.4,72.2 131.6,80.9 136.2,90.2 139,100 140,109.8 139,119.1 136.2,127.8 131.6,129.9 129.9,60.1 60.1)))
将一个多线串(MultiLineString)通过一个点分割,其中这个点正好位于两个线串元素上。
SELECT ST_Split('MULTILINESTRING((10 10,190 190),(15 15,30 30,100 90))',
ST_Point(30, 30));
GEOMETRYCOLLECTION(
LINESTRING(10 10,30 30),
LINESTRING(30 30,190 190),
LINESTRING(15 15,30 30),
LINESTRING(30 30,100 90)
)
将 LineString 用点分割,其中该点并不正好位于线上。 显示使用 ST_Snap 将线捕捉到点以允许将其分割。
WITH data AS (SELECT
'LINESTRING(0 0,100 100)'::geometry AS line,
'POINT(51 50)':: geometry AS point
)
SELECT ST_Split(ST_Snap(line, point, 1), point) AS snapped_split,
ST_Split(line, point) AS not_snapped_not_split
FROM data;
-[ RECORD 1 ]--------- snapped_split | GEOMETRYCOLLECTION(LINESTRING(0 0,51 50), LINESTRING(51 50,100 100)) not_snapped_not_split | GEOMETRYCOLLECTION(LINESTRING(0 0,100 100))