名称

ST_Simplify — 返回几何图形的简化表示,使用 Douglas-Peucker算法。

大纲

geometry ST_Simplify(geometry geom, float tolerance);

geometry ST_Simplify(geometry geom, float tolerance, boolean preserveCollapsed);

描述

使用Douglas-Peucker算法计算几何图形的简化表示。简化的tolerance是一个距离值,以输入SRS的单位为准。简化会移除在简化线条的公差距离内的顶点。即使输入是有效的,结果可能不是有效的。

该函数可用于任何类型的几何图形(包括GeometryCollections),但只有线和多边形元素会被简化。线性几何的端点将被保留。

preserveCollapsed标志保留那些在给定公差下本应被移除的小几何图形。例如,如果将一个1米长的线条使用10米的公差进行简化,当preserveCollapsed为true时,该线条将不会消失。这个标志对于渲染目的很有用,以防止地图上非常小的特征消失。

[注意]

返回的几何图形可能会失去其简单性(参见ST_IsSimple),拓扑可能不会被保留,并且多边形结果可能是无效的(参见ST_IsValid)。使用ST_SimplifyPreserveTopology来保留拓扑并确保有效性。

[注意]

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

可用性:1.2.2

示例

A circle simplified with a medium tolerance becomes an octagon, and with a large tolerance disappears.

Code
SELECT ST_NPoints(geom) AS np_before,
     ST_NPoints(ST_Simplify(geom, 0.1)) AS np01_notbadcircle,
     ST_NPoints(ST_Simplify(geom, 0.5)) AS np05_notquitecircle,
     ST_NPoints(ST_Simplify(geom, 1)) AS np1_octagon,
     ST_NPoints(ST_Simplify(geom, 10)) AS np10_gone,
     (ST_Simplify(geom, 100) is null) AS  np100_geometrygoesaway
FROM (SELECT ST_Buffer('POINT(1 3)', 10, 12) As geom) AS t;
栅格输出
-[ RECORD 1 ]------------
np_before                | 49
np01_notbadcircle        | 33
np05_notquitecircle      | 17
np1_octagon              | 9
np10_gone                | null
np100_geometrygoesaway   | t

简化一组线。简化后,线可能会相交。

Code
SELECT ST_Simplify('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,170 120),(20 10,90 120),(90 120,130 130),(130 130,160 40,180 90,140 80),(50 40,80 70,50 40))
Figure
Geometry figure for visual-st-simplify-02

简化一个MultiPolygon。多边形的结果可能是无效的。

Code
SELECT ST_Simplify('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,170 180,140 10,40 80),(180 70,142.5 128.5,90 60,180 70)))
Figure
Geometry figure for visual-st-simplify-03