Da Sie angegeben haben, dass Sie für jedes Polygon, an dem Sie interessiert sind, eine Gruppe sich überschneidender Polygone erhalten, möchten Sie möglicherweise ein sogenanntes "Polygon-Overlay" erstellen.
Dies ist nicht genau das, was Adams Lösung tut. Schauen Sie sich dieses Bild einer ABC-Kreuzung an, um den Unterschied zu erkennen:
Ich glaube, Adams Lösung wird ein "AB" -Polygon erzeugen, das sowohl den Bereich von "AB! C" und "ABC" abdeckt, als auch ein "AC" -Polygon, das "AC! B" und "ABC" abdeckt, und ein " BC "Polygon, das" BC! A "und" ABC "ist. Die Ausgabepolygone "AB", "AC" und "BC" überlappen also alle den Bereich "ABC".
Eine Polygon-Überlagerung erzeugt nicht überlappende Polygone, also wäre AB! C ein Polygon und ABC ein Polygon.
Das Erstellen eines Polygon-Overlays in PostGIS ist eigentlich ganz einfach.
Grundsätzlich gibt es drei Schritte.
Schritt 1 ist das Extrahieren der Linien [Beachten Sie, dass ich den äußeren Ring des Polygons verwende, es wird etwas komplizierter, wenn Sie Löcher richtig handhaben möchten]:
SELECT ST_ExteriorRing(polygon_col) AS the_geom FROM my_table) AS lines
Schritt 2 besteht darin, die Linien zu "knoten" (an jeder Kreuzung einen Knoten zu erzeugen). Einige Bibliotheken wie JTS haben "Noder" -Klassen, mit denen Sie dies tun können, aber in PostGIS erledigt die ST_Union- Funktion dies für Sie:
SELECT ST_Union(the_geom) AS the_geom FROM (...your lines...) AS noded_lines
Schritt 3 besteht darin, alle möglichen nicht überlappenden Polygone zu erstellen, die aus all diesen Zeilen stammen können. Dies geschieht mit der Funktion ST_Polygonize :
SELECT ST_Polygonize(the_geom) AS the_geom FROM (...your noded lines...)
Sie können die Ausgabe jedes dieser Schritte in einer temporären Tabelle speichern oder sie alle in einer einzigen Anweisung kombinieren:
CREATE TABLE my_poly_overlay AS
SELECT geom FROM ST_Dump((
SELECT ST_Polygonize(the_geom) AS the_geom FROM (
SELECT ST_Union(the_geom) AS the_geom FROM (
SELECT ST_ExteriorRing(polygon_col) AS the_geom FROM my_table) AS lines
) AS noded_lines
)
)
Ich verwende ST_Dump, weil die Ausgabe von ST_Polygonize eine Geometriesammlung ist und es (normalerweise) praktischer ist, eine Tabelle zu haben, in der jede Zeile eines der Polygone ist, aus denen die Polygonüberlagerung besteht.