ST_Subdivide — 计算几何体的直线细分。
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 的面积小,因此索引查询产生的“命中”情况更少。“命中”情况更快,因为索引重新检查过程执行的空间操作涉及的点更少。
这是一个集合返回函数 (SRF),返回一组包含单个几何值的行。 它可以在 SELECT 列表或 FROM 子句中使用,以生成一个结果集,每个结果几何体对应一个记录。 |
由 GEOS 模块执行。
可用性:2.2.0
增强功能:2.5.0 重用多边形分割上的现有点,顶点计数从 8 减少到 5。
增强功能:3.1.0 接受 gridSize 参数。
需要 GEOS >= 3.9.0 才能使用 gridSize 参数
示例: 将多边形细分为不超过 10 个顶点的部分,并为每个部分分配一个唯一的 ID。
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_Segmentize(geography, distance) 细化长的 geography 线,并使用 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_Subdivide 是一个集合返回(表)函数,它返回一组单值行,因此此语法会自动生成一个表,其中每个结果部分对应一行。
CREATE TABLE subdivided_geoms AS SELECT pkey, ST_Subdivide(geom) AS geom FROM original_geoms;