名称

ST_Split — 返回通过另一个几何图形分割几何图形创建的几何图形集合。

概要

geometry ST_Split(geometry input, geometry blade);

描述

该函数支持通过 (Multi)Point、(Multi)LineString 或 (Multi)Polygon 边界分割 LineString,或通过 LineString 分割 (Multi)Polygon。当 (Multi)Polygon 用作刀片时,其线性组件(边界)用于分割输入。结果几何图形始终是集合。

从某种意义上说,此函数与 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,其中点正好位于两个 LineStrings 元素上。

分割前

分割后

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_SnapST_Union