Name

ST_Subdivide — 计算几何图形的直线细分。

Synopsis

setof geometry ST_Subdivide(geometry geom, integer max_vertices=256, float8 gridSize = -1);

描述

返回一组作为分割结果的几何图形 geom 使用直线划分为多个部分,每个部分包含不超过 max_vertices

max_vertices 必须为5或更大,因为需要5个点来表示封闭的方框。 gridSize 可以指定在固定精度空间中进行剪裁工作(需要GEOS-3.9.0+)。

对于索引的细分数据集,多边形中点和其他空间操作通常更快。由于部件的边界框通常比原始几何BBox覆盖更小的区域,因此索引查询产生的“命中”案例较少。“命中”情况更快,因为索引重新检查执行的空间操作处理的点数更少。

[Note]

这是一个 集合返回函数 (SRF),它返回一组包含单个几何值的行。可以在选择列表或FROM子句中使用它来生成一个结果集,其中每个结果几何图形都有一条记录。

由GEOS模块执行。

可用性:2.2.0

增强:2.5.0重新使用多边形分割上的现有点,顶点数从8降低到5。

增强:3.1.0接受GRIDSIZE参数,需要GEOS > =3.9.0才能使用此新功能。

示例

示例: 将一个多边形细分为不超过10个顶点的部分,并为每个部分指定唯一的ID。

细分到最多10个顶点

SELECT row_number() OVER() As rn, ST_AsText(geom) As wkt
    FROM (SELECT ST_SubDivide(
        'POLYGON((132 10,119 23,85 35,68 29,66 28,49 42,32 56,22 64,32 110,40 119,36 150,
        57 158,75 171,92 182,114 184,132 186,146 178,176 184,179 162,184 141,190 122,
        190 100,185 79,186 56,186 52,178 34,168 18,147 13,132 10))'::geometry,10))  AS f(geom);
rn │                                                      wkt
────┼────────────────────────────────────────────────────────────────────────────────────────────────────────────────
  1 │ POLYGON((119 23,85 35,68 29,66 28,32 56,22 64,29.8260869565217 100,119 100,119 23))
  2 │ POLYGON((132 10,119 23,119 56,186 56,186 52,178 34,168 18,147 13,132 10))
  3 │ POLYGON((119 56,119 100,190 100,185 79,186 56,119 56))
  4 │ POLYGON((29.8260869565217 100,32 110,40 119,36 150,57 158,75 171,92 182,114 184,114 100,29.8260869565217 100))
  5 │ POLYGON((114 184,132 186,146 178,176 184,179 162,184 141,190 122,190 100,114 100,114 184))
  

示例: 使用ST_Segentize(地理,距离)加密长的地理位置线,然后使用ST_SubDivide将生成的线分割为包含8个顶点的子线。

密实线和分割线。

SELECT ST_AsText( ST_Subdivide(
            ST_Segmentize('LINESTRING(0 0, 85 85)'::geography,
                          1200000)::geometry,    8));
LINESTRING(0 0,0.487578359029357 5.57659056746196,0.984542144675897 11.1527721155093,1.50101059639722 16.7281035483571,1.94532113630331 21.25)
LINESTRING(1.94532113630331 21.25,2.04869538062779 22.3020741387339,2.64204641967673 27.8740533545155,3.29994062412787 33.443216802941,4.04836719489742 39.0084282520239,4.59890468420694 42.5)
LINESTRING(4.59890468420694 42.5,4.92498503922732 44.5680389206321,5.98737409390639 50.1195229244701,7.3290919767674 55.6587646879025,8.79638749938413 60.1969505994924)
LINESTRING(8.79638749938413 60.1969505994924,9.11375579533779 61.1785363177625,11.6558166691368 66.6648504160202,15.642041247655 72.0867690601745,22.8716627200212 77.3609628116894,24.6991785131552 77.8939011989848)
LINESTRING(24.6991785131552 77.8939011989848,39.4046096622744 82.1822848017636,44.7994523421035 82.5156766227011)
LINESTRING(44.7994523421035 82.5156766227011,85 85)

示例: 在位细分数据表的复杂几何图形。原始几何图形记录将从源表中删除,并为每个细分的结果几何图形插入新记录。

WITH complex_areas_to_subdivide AS (
    DELETE from polygons_table
    WHERE ST_NPoints(geom) > 255
    RETURNING id, column1, column2, column3, geom
)
INSERT INTO polygons_table (fid, column1, column2, column3, geom)
    SELECT fid, column1, column2, column3,
           ST_Subdivide(geom, 255) as geom
    FROM complex_areas_to_subdivide;

示例: 创建包含细分几何图形的新表,保留原始几何图形的键,以便可以将新表关联到源表。由于ST_SUBDIVE是返回一组单值行的集合返回(表)函数,因此此语法自动生成一个表,每个结果部分对应一行。

CREATE TABLE subdivided_geoms AS
    SELECT pkey, ST_Subdivide(geom) AS geom
    FROM original_geoms;

另请参阅

ST_AsText, ST_ClipByBox2D, ST_Segmentize, ST_Split, ST_NPoints