名称

ST_SimplifyPreserveTopology — 使用Douglas-Peucker算法返回几何图形的简化且有效表示。

大纲

geometry ST_SimplifyPreserveTopology(geometry geom, float tolerance);

描述

使用一种变体的Douglas-Peucker 算法 计算几何图形的简化表示,该算法限制简化以确保结果具有与输入相同的拓扑。简化的tolerance是一个距离值,以输入SRS的单位为准。只要保留拓扑,简化会移除在简化线条的公差距离内的顶点。如果输入是有效和简单的,则结果也将是有效和简单的。

该函数可用于任何类型的几何图形(包括GeometryCollections),但只有线和多边形元素会被简化。对于多边形输入,结果将具有相同数量的环(外壳和内环),并且这些环不会相交。环的端点可能会被简化。对于线性输入,结果将具有相同数量的线,如果在原始几何中它们不相交,则线也不会相交。线性几何的端点将被保留。

[注意]

该函数不保留多边形之间共享的边界。如果需要保留共享边界,请使用ST_CoverageSimplify

这个函数是由 GEOS 模块执行的。

可用性:1.3.3

示例

For the same example as ST_Simplify, ST_SimplifyPreserveTopology prevents the geometry from disappearing.

Code
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_minimal,
        ST_NPoints(ST_SimplifyPreserveTopology(geom, 100)) AS np100_minimal
FROM (SELECT ST_Buffer('POINT(1 3)', 10, 12) AS geom) AS t;
栅格输出
np_before | np01_notbadcircle | np05_notquitecircle | np1_octagon | np10_minimal | np100_minimal
-----------+-------------------+---------------------+-------------+--------------+---------------
        49 |                33 |                  17 |           9 |            4 |             4

简化一组线,保留非相交线的拓扑。

Code
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))'::geometry,
40);
栅格输出
MULTILINESTRING((20 180,50 100,110 150,170 120),(20 10,80 30,90 120),(90 120,130 130),(130 130,130 70,160 40,180 90,140 80),(50 40,70 40,80 70,60 60,50 40))
Figure
Geometry figure for visual-st-simplifypreservetopology-02

简化一个MultiPolygon,保留外壳和内环的拓扑。

Code
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)))'::geometry,
40);
栅格输出
MULTIPOLYGON(((90 110,80 180,10 170,20 110,90 110)),((40 80,100 100,170 180,190 70,140 10,40 80),(180 70,142.5 128.5,90 60,180 70)))
Figure
Geometry figure for visual-st-simplifypreservetopology-03