Name

ST_Split — 返回通过将一个几何体分割为另一个几何体而创建的几何体集合。

Synopsis

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(..))
)
            

将一个多线串(MultiLineString)通过一个点分割,其中这个点正好位于两个线串元素上。

分割前

分割后

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)
)
            

将 LineString 用点分割,其中该点并不正好位于线上。 显示使用 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