Ich habe eine PostGIS-Tabelle mit Polygonen, in denen sich einige überschneiden. Das versuche ich zu tun:
- Geben Sie mir für ein bestimmtes, durch id ausgewähltes Polygon alle Polygone, die sich schneiden. Grundsätzlich gilt,
select the_geom from the_table where ST_Intersects(the_geom, (select the_geom from the_table where source_id = '123'))
- Aus diesen Polygonen muss ein neues Polygon erstellt werden, sodass die Schnittmenge zu einem neuen Polygon wird. Wenn sich also Polygon A mit Polygon B schneidet, erhalte ich drei neue Polygone: A minus AB, AB und B minus AB.
Irgendwelche Ideen?
postgis
polygon
intersection
atogle
quelle
quelle
Antworten:
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]:
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:
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 :
Sie können die Ausgabe jedes dieser Schritte in einer temporären Tabelle speichern oder sie alle in einer einzigen Anweisung kombinieren:
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.
quelle
ST_ExteriorRing
keine Löcher fallen.ST_Boundary
bewahrt die inneren Ringe, erzeugt aber auch ein Polygon in ihnen.Wenn ich richtig verstehe, möchten Sie nehmen (A ist die linke Geometrie, B ist die rechte):
Bild von A∪B http://img838.imageshack.us/img838/3996/intersectab1.png
Und extrahieren:
A ∖ AB
Bild von A ∖ AB http://img830.imageshack.us/img830/273/intersectab2.png
AB
Bild von AB http://img828.imageshack.us/img828/7413/intersectab3.png
und B ∖ AB
Bild von B ∖ AB http://img839.imageshack.us/img839/5458/intersectab4.png
Das heißt - drei verschiedene Geometrien für jedes sich überschneidende Paar.
Zunächst erstellen wir eine Ansicht aller sich überschneidenden Geometrien. Angenommen, Ihr Tabellenname lautet
polygons_table
:Jetzt haben wir eine Ansicht (praktisch eine Nur-Lese-Tabelle), in der Paare sich überschneidender Geoms gespeichert sind, wobei jedes Paar aufgrund der
t1.id<t2.id
Bedingung nur einmal angezeigt wird .Jetzt sammeln wir Ihre Kreuzungen -
A∖AB
,AB
undB∖AB
unter Verwendung von SQL istUNION
auf allen drei Abfragen:Anmerkungen:
&&
Bediener wird als Filter vor demintersects
Bediener verwendet, um die Leistung zu verbessern.VIEW
statt einer einzigen riesigen Abfrage zu erstellen . Dies dient nur der Vereinfachung.AB
ist dies die Vereinigung und nicht die Kreuzung vonA
undB
- Verwenden Sie ST_Union anstelle von st_intersection bei derUNION
Abfrage an den entsprechenden Stellen.∖
Zeichen ist ein Unicode-Zeichen für Set difference. Entfernen Sie es aus dem Code, wenn es Ihre Datenbank verwirrt.quelle
Was Sie beschreiben, ist die Art und Weise, wie der Union-Operator in ArcGIS arbeitet, jedoch ein wenig anders als Union oder Intersection in der GEOS-Welt. Das Shapely-Handbuch enthält Beispiele für die Funktionsweise von Sets in GEOS . Das PostGIS-Wiki bietet jedoch ein gutes Beispiel für die Verwendung von Linien, die den Trick für Sie tun sollten.
Alternativ können Sie drei Dinge berechnen:
Dies sollten die drei Polygone sein, die Sie in Ihrem zweiten Aufzählungspunkt erwähnt haben.
quelle
So etwas wie:
INSERT INTO new_table VALUES ((wähle id, the_geom aus old_table wo st_intersects (the_geom, (wähle the_geom aus old_table wo id = '123')) = true
BEARBEITEN: Sie benötigen die tatsächliche Schnittmenge des Polygons.
INSERT INTO new_table-Werte ((select id, ST_Intersection (the_geom, (select the_geom from old where id = 123))
Mal sehen, ob das klappt.
quelle