ST_SimplifyPolygonHull — 計算多邊形幾何的簡化、保留拓撲的外殼或內殼。
geometry ST_SimplifyPolygonHull(
geometry param_geom, float vertex_fraction, boolean is_outer = true)
;
計算多邊形幾何的簡化、保留拓撲的外殼或內殼。外殼完全覆蓋輸入的幾何形狀。內殼則完全被輸入的幾何形狀所覆蓋。結果是由輸入頂點的子集形成的多邊形幾何。MultiPolygon 和孔洞會被處理,並產生與輸入結構相同的結果。
頂點數量的減少由 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);
MultiPolygon 的外殼簡化,帶分割
SELECT ST_SimplifyPolygonHull( ST_Segmentize(ST_Letters('xt'), 2.0), 0.1);