ST_CoverageClean — Beräknar en ren (kantmatchad, icke-överlappande, gap-cleared) polygontäckning, givet en icke ren indata.
geometry ST_CoverageClean(geometry winset geom, float8 gapMaximumWidth = 0, float8 snappingDistance = -1, text overlapMergeStrategy = 'MERGE_LONGEST_BORDER');
En fönsterfunktion som justerar kanterna för en uppsättning giltiga polygonala geometrier för att skapa en ren täckning. Rensningen omfattar:
snäppning av hörn och kanter för att ta bort små skillnader och säkerställa att gemensamma kanter har identiska noder
sammanfogning av överlappningar i en överordnad polygon
sammanfogning av smala mellanrum med angränsande polygoner
gapMaximumWidth styr vilka mellanrum mellan polygoner som sammanfogas. Mellanrum med en bredd på <= detta avstånd sammanfogas med en angränsande polygon.
snappingDistance styr snäppning av hörn och kanter. Standardvärdet (-1) fastställer automatiskt ett snäppningsavstånd utifrån indatans utsträckning. Ange 0.0 för att stänga av snäppning.
overlapMergeStrategy anger hur överlappningar sammanfogas i en överordnad polygon:
MERGE_LONGEST_BORDER – sammanfogar med polygonen som har längst gemensam gräns
MERGE_MAX_AREA – sammanfogar med polygonen som har störst yta
MERGE_MIN_AREA – sammanfogar med polygonen som har minst yta
MERGE_MIN_INDEX – sammanfogar med polygonen som har lägst indataindex (definierat av indata-polygonernas ordning)
Resultatet är en ren polygonal täckning som valideras av ST_CoverageInvalidEdges och kan användas som indata till täckningsbearbetande funktioner.
|
|
|
För att underlätta fastställandet av en maximal mellanrumsbredd kan mellanrum beräknas genom rensning med |
Tillgänglighet: 3.6.0 - kräver GEOS >= 3.14.0
Rensa en täckning som innehåller överlappningar och smala mellanrum och jämför de rensade polygonerna med de ursprungliga ogiltiga kanterna.
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))