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
Clean a coverage containing overlaps and narrow gaps, and compare the cleaned polygons with the original invalid edges.
WITH coverage(id, geom) AS (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)
), processed AS (
SELECT id,
ST_CoverageClean(geom, 1) OVER () AS cleaned,
ST_CoverageInvalidEdges(geom) OVER () AS invalid_edges
FROM coverage
)
SELECT ST_Collect(cleaned ORDER BY id) AS cleaned,
ST_Collect(invalid_edges ORDER BY id) AS invalid_edges
FROM processed;
MULTIPOLYGON(((10 10,10 190,30 160,27 134.5,40 110,84.7 75.7,102 62.3,120 10,10 10)),((140 190,140 160,140 130,135 111,131.7 84.2,97 77,98 74,84.7 75.7,40 110,50 140,30 160,10 190,140 190)),((190 190,190 80,165 80,140 80,140 85.9,140 130,140 160,140 190,150 190,190 190)),((190 10,120 10,102 62.3,98 74,97 77,131.7 84.2,140 85.9,140 80,165 80,170 70,190 80,190 10))) | MULTILINESTRING((40 110,122 47,120 10),(40 110,50 80,130 70,135 111,140 130,140 160,150 190,10 190),(190 80,140 80,140 190,190 190),(120 10,97 77,160 90,170 70))