ST_SimplifyPolygonHull — 计算多边形几何图形的简化拓扑保持外壳或内壳。
geometry ST_SimplifyPolygonHull(
geometry param_geom, float vertex_fraction, boolean is_outer = true)
;
计算多边形几何图形的简化拓扑保持外壳或内壳。外壳完全覆盖输入几何图形。内壳完全被输入几何图形覆盖。结果是由输入顶点的子集形成的多边形几何图形。MultiPolygons 和孔洞得到处理,并产生与输入具有相同结构的结果。
顶点计数的减少由 vertex_fraction
参数控制,该参数是 0 到 1 之间的数字。较低的值会产生更简单的结果,顶点计数更少,凹度更小。对于外壳和内壳,顶点分数为 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);