ST_SimplifyPolygonHull — 计算多边形几何的简化的保留拓扑的外部或内部外壳。
geometry ST_SimplifyPolygonHull(
geometry param_geom, float vertex_fraction, boolean is_outer = true)
;
计算多边形几何的简化的保留拓扑的外部或内部外壳。 外壳完全覆盖输入几何体。 内部外壳完全被输入几何体覆盖。 结果是由输入顶点的子集形成的多边形几何体。 处理多重多边形和孔并产生与输入结构相同的结果。
顶点数的减少可以通过 vertex_fraction
参数进行控制。该参数的取值范围是 0 到 1。较小的值会使简化过程更加深入,顶点数减少,凹性降低。对于外部和内部的凹包,当 vertex_fraction 值为 1.0 时,会生成与原始几何体相同的形状;而当值为 0.0 时,对于外部凹包会生成凸包(单一多边形),而对于内部凹包则会生成三角形。
简化过程通过逐步删除包含最少面积的凹角来进行,直到达到顶点数目标。 它可以防止边交叉,因此结果始终是有效的多边形几何体。
为了获得包含相对较长线段的几何图形的更好结果,可能需要“分段”输入,如下所示。
这个函数是由 GEOS 模块执行的。
可用性:3.3.0。
需要GEOS >= 3.11.0。
SELECT ST_SimplifyPolygonHull( 'POLYGON ((131 158, 136 163, 161 165, 173 156, 179 148, 169 140, 186 144, 190 137, 185 131, 174 128, 174 124, 166 119, 158 121, 158 115, 165 107, 161 97, 166 88, 166 79, 158 57, 145 57, 112 53, 111 47, 93 43, 90 48, 88 40, 80 39, 68 32, 51 33, 40 31, 39 34, 49 38, 34 38, 25 34, 28 39, 36 40, 44 46, 24 41, 17 41, 14 46, 19 50, 33 54, 21 55, 13 52, 11 57, 22 60, 34 59, 41 68, 75 72, 62 77, 56 70, 46 72, 31 69, 46 76, 52 82, 47 84, 56 90, 66 90, 64 94, 56 91, 33 97, 36 100, 23 100, 22 107, 29 106, 31 112, 46 116, 36 118, 28 131, 53 132, 59 127, 62 131, 76 130, 80 135, 89 137, 87 143, 73 145, 80 150, 88 150, 85 157, 99 162, 116 158, 115 165, 123 165, 122 170, 134 164, 131 158))', 0.3);
SELECT ST_SimplifyPolygonHull( 'POLYGON ((131 158, 136 163, 161 165, 173 156, 179 148, 169 140, 186 144, 190 137, 185 131, 174 128, 174 124, 166 119, 158 121, 158 115, 165 107, 161 97, 166 88, 166 79, 158 57, 145 57, 112 53, 111 47, 93 43, 90 48, 88 40, 80 39, 68 32, 51 33, 40 31, 39 34, 49 38, 34 38, 25 34, 28 39, 36 40, 44 46, 24 41, 17 41, 14 46, 19 50, 33 54, 21 55, 13 52, 11 57, 22 60, 34 59, 41 68, 75 72, 62 77, 56 70, 46 72, 31 69, 46 76, 52 82, 47 84, 56 90, 66 90, 64 94, 56 91, 33 97, 36 100, 23 100, 22 107, 29 106, 31 112, 46 116, 36 118, 28 131, 53 132, 59 127, 62 131, 76 130, 80 135, 89 137, 87 143, 73 145, 80 150, 88 150, 85 157, 99 162, 116 158, 115 165, 123 165, 122 170, 134 164, 131 158))', 0.3, false);
SELECT ST_SimplifyPolygonHull( ST_Segmentize(ST_Letters('xt'), 2.0), 0.1);