ST_SimplifyPreserveTopology — 使用 Douglas-Peucker 算法返回一个几何图形的简化且有效的表示形式。
geometry ST_SimplifyPreserveTopology(
geometry geom, float tolerance)
;
使用 Douglas-Peucker 算法 的变体计算几何图形的简化表示,该变体限制简化以确保结果具有与输入相同的拓扑结构。 简化tolerance
是一个距离值,以输入 SRS 的单位表示。只要保留拓扑结构,简化操作就会删除位于简化线段的容差距离内的顶点。如果输入有效且简单,则结果也将有效且简单。
该函数可以与任何类型的几何图形(包括 GeometryCollection)一起调用,但仅简化线和多边形元素。对于多边形输入,结果将具有相同数量的环(外壳和孔),并且环不会交叉。环的端点可能会被简化。对于线性输入,结果将具有相同数量的线,并且如果它们在原始几何图形中没有相交,则线将不会相交。线性几何图形的端点将被保留。
此函数不会保留多边形之间共享的边界。如果需要,请使用 ST_CoverageSimplify。 |
由 GEOS 模块执行。
可用性:1.3.3
对于与 ST_Simplify 相同的示例,ST_SimplifyPreserveTopology 可防止过度简化。圆最多只能变成正方形。
SELECT ST_Npoints(geom) AS np_before, ST_NPoints(ST_SimplifyPreserveTopology(geom, 0.1)) AS np01_notbadcircle, ST_NPoints(ST_SimplifyPreserveTopology(geom, 0.5)) AS np05_notquitecircle, ST_NPoints(ST_SimplifyPreserveTopology(geom, 1)) AS np1_octagon, ST_NPoints(ST_SimplifyPreserveTopology(geom, 10)) AS np10_square, ST_NPoints(ST_SimplifyPreserveTopology(geom, 100)) AS np100_stillsquare FROM (SELECT ST_Buffer('POINT(1 3)', 10,12) AS geom) AS t; np_before | np01_notbadcircle | np05_notquitecircle | np1_octagon | np10_square | np100_stillsquare -----------+-------------------+---------------------+-------------+-------------+------------------- 49 | 33 | 17 | 9 | 5 | 5
简化一组线,保留不相交线的拓扑结构。
SELECT ST_SimplifyPreserveTopology( 'MULTILINESTRING ((20 180, 20 150, 50 150, 50 100, 110 150, 150 140, 170 120), (20 10, 80 30, 90 120), (90 120, 130 130), (130 130, 130 70, 160 40, 180 60, 180 90, 140 80), (50 40, 70 40, 80 70, 70 60, 60 60, 50 50, 50 40))', 40);
简化 MultiPolygon,保留外壳和孔的拓扑结构。
SELECT ST_SimplifyPreserveTopology( 'MULTIPOLYGON (((90 110, 80 180, 50 160, 10 170, 10 140, 20 110, 90 110)), ((40 80, 100 100, 120 160, 170 180, 190 70, 140 10, 110 40, 60 40, 40 80), (180 70, 170 110, 142.5 128.5, 128.5 77.5, 90 60, 180 70)))', 40);