ST_SIMPLIFYPRESERVETOPOLOGY
📄字数 1.6K
👁️阅读量 加载中...
功能描述
使用一种变体的 Douglas-Peucker 算法计算几何图形的简化,并避免无效Geometry对象。
语法格式
sql
GEOMETRY ST_SIMPLIFYPRESERVETOPOLOGY(GEOMETRY geom, DOUBLE tolerance);参数说明
- geom:目标 GEOMETRY 对象。
- tolerance:容差距离。一个距离值,以输入SRS的单位为准。
函数返回类型
GEOMETRY 类型
使用说明
- 只要保留拓扑,简化会移除在简化线条的公差距离内的顶点。如果输入是有效和简单的,则结果也将是有效和简单的。
- 数可用于任何类型的几何图形(包括GeometryCollections),但只有线和多边形元素会被简化。
- 对于多边形输入,结果将具有相同数量的环(外壳和内环),并且这些环不会相交。环的端点可能会被简化。
- 对于线性输入,结果将具有相同数量的线,如果在原始几何中它们不相交,则线也不会相交。线性几何的端点将被保留。
- 该函数不保留多边形之间共享的边界。如果需要保留共享边界,请使用 ST_CoverageSimplify。
- 该函数由 GEOS 模块执行的。
示例
对于与 ST_Simplify 相同的示例,ST_SimplifyPreserveTopology 防止过度简化。圆最多可以变成一个正方形:
sql
SQL> 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 | 4 | 4 |
+-----------+-------------------+---------------------+-------------+-------------+-------------------+
(1 row)简化一组线,保留非相交线的拓扑。
sql
SQL> SELECT ST_AsText(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));
+--------------------------------------------------------------------------------------------------------------------------------------------------------+
| EXPR1 |
+--------------------------------------------------------------------------------------------------------------------------------------------------------+
| MULTILINESTRING((20 180,50 100,110 150,170 120),(20 10,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)) |
+--------------------------------------------------------------------------------------------------------------------------------------------------------+
(1 row)简化一个MultiPolygon,保留外壳和内环的拓扑。
sql
SQL> SELECT ST_AsText(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));
+--------------------------------------------------------------------------------------------------------------------------------------+
| EXPR1 |
+--------------------------------------------------------------------------------------------------------------------------------------+
| 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))) |
+--------------------------------------------------------------------------------------------------------------------------------------+
(1 row)