Namn

ST_CoverageClean — Beräknar en ren (kantmatchad, icke-överlappande, gap-cleared) polygontäckning, givet en icke ren indata.

Synopsis

geometry ST_CoverageClean(geometry winset geom, float8 gapMaximumWidth = 0, float8 snappingDistance = -1, text overlapMergeStrategy = 'MERGE_LONGEST_BORDER');

Beskrivning

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.

[Notera]

För att underlätta fastställandet av en maximal mellanrumsbredd kan mellanrum beräknas genom rensning med gapMaximumWidth = > 0 och genom att använda ST_CoverageUnion för att slå samman den resulterande täckningen. Hål i sammanslagningen motsvarar mellanrum i den ursprungliga datamängden. Mellanrumsbredder kan mätas genom att extrahera hålen som polygoner och köra ST_MaximumInscribedCircle på dem; mellanrumsbredden är dubbelt så stor som den beräknade radien.

Tillgänglighet: 3.6.0 - kräver GEOS >= 3.14.0

Exempel

Rensa en täckning som innehåller överlappningar och smala mellanrum och jämför de rensade polygonerna med de ursprungliga ogiltiga kanterna.

Kod
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;
Utdata
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))
Figur
Geometry figure for visual-st-coverageclean-01