ST_CoverageClean — 对非规范化输入计算出一个规范的多边形覆盖结果(边界匹配、无重叠、无缝隙)。
geometry ST_CoverageClean(geometry winset geom, float8 gapMaximumWidth = 0, float8 snappingDistance = -1, text overlapMergeStrategy = 'MERGE_LONGEST_BORDER');
一个窗口函数,用于调整一组有效的面状几何的边界,使其形成干净的覆盖(clean coverage)。清理过程包括:
将顶点和边进行贴靠(snapping),消除微小偏差,确保共有边节点一致、拓扑对齐
将重叠区域合并到上级父polygon 中
把狭窄的间隙并入相邻的 polygon 中
gapMaximumWidth 控制哪些多边形之间的空隙会被合并;宽度 <= 该值的空隙会被并入相邻的 polygon。
snappingDistance 控制顶点和边的贴靠(snapping)。默认值 -1 会根据输入范围自动计算贴靠距离;设置为 0.0 则表示关闭贴靠。
overlapMergeStrategy 用来指定重叠区域如何合并到父 polygon 中:
MERGE_LONGEST_BORDER - 合并到与其共有边最长的 polygon
MERGE_MAX_AREA - 合并到面积最大的 polygon
MERGE_MIN_AREA - 合并到面积最小的 polygon
MERGE_MIN_INDEX - 合并到输入索引最小的 polygon(按输入顺序定义)
结果是一个干净的面覆盖(polygonal coverage),能通过 ST_CoverageInvalidEdges 的校验,并可作为后续覆盖处理函数的输入。
|
|
|
为便于确定合适的最大缝隙宽度,可以先将 |
可用性: 3.6.0 - 需要 GEOS >= 3.14.0
-- Populate input table CREATE TABLE example AS SELECT * FROM (VALUES (1, 'POLYGON ((10 190, 30 160, 27 134.5, 40 110, 122 47, 120 10, 10 10, 10 190))'::geometry), (2, 'POLYGON ((150 190, 10 190, 30 160, 50 140, 40 110, 50 80, 130 70, 135 111, 140 130, 140 160, 150 190))'::geometry), (3, 'POLYGON ((140 190, 190 190, 190 80, 140 80, 140 190))'::geometry), (4, 'POLYGON ((190 10, 120 10, 97 77, 160 90, 170 70, 190 80, 190 10))'::geometry) ) AS v(id, geom);
有重叠和间隙的多边形
-- Show it is an invalid coverage SELECT ST_AsText(ST_CoverageInvalidEdges(geom) OVER ()) FROM example;
无效的覆盖边
-- Clean the coverage, merging gaps with width <= 1 CREATE TABLE example_clean AS SELECT id, ST_CoverageClean(geom, 1) OVER () AS GEOM FROM example;
清理后的面覆盖,已移除重叠和狭窄缝隙