PostGIS-Vereinigung zwischen zwei Tabellen unter Beibehaltung von Attributen

8

Ich versuche, die Regierungsgrenzen auf oberer und unterer Ebene des US-Bundesstaates so zu vereinen, dass für jede Form eine PostGIS-Tabelle mit den Namen der oberen und unteren Ebene generiert wird.

In meinem Beispiel unten Uist ein Datensatz und hat eine Spalte mit Zeilen UAund UB. Lund ist ein weiterer Datenmenge hat LA, LBund LC. Wenn ich die Formen zusammenführe, sollte ich die gleichen Formen erhalten, Laber das neue, zusammengeschlossene Dataset enthält beide Datenspalten.

Geben Sie hier die Bildbeschreibung ein

Bearbeiten : Mein Beispielbild oben ist ziemlich mies. Die bisherigen Antworten beziehen sich auf die Abfrage der Daten unter der Annahme, dass die Geometrie verfügbar ist. Dies ist wichtig, überspringt aber den verwirrenderen Teil meiner Frage. Ein besseres Beispiel:

Bild

Die gelbe Form ist von U, die orange Form ist von L. Beachten Sie, dass sie sich überlappen, aber einige Teile der Polygone nicht vollständig in einer anderen Form enthalten sind (wie in meinem Beispiel, wo LBund LCvollständig innerhalb UB).

Die Frage, die ich stellen wollte, betrifft das korrekte Zerlegen der beiden Ebenen, damit der resultierende Datensatz keine Überlappungen aufweist. Siehe zum Beispiel diesen Mailinglisten-Beitrag , der nahe kommt, aber nicht ganz funktioniert.

magnetisches Monster
quelle
1
Nebenbemerkung: Die Bezeichnung "Union", der ESRI-Begriff für die Operation, ist für PostGIS-Benutzer verwirrend, da die ST_Union-Funktion das Gegenteil davon bewirkt (was ESRI als "Auflösen" bezeichnet) und Features zusammenführt. Ein herstellerneutraler Begriff könnte "Overlay" sein.
Paul Ramsey
Ich denke , meine Frage ist sehr ähnlich diesen , die bereits gefragt wurden , und ziemlich gut beantwortet.
magnetisches

Antworten:

5

Ohne Ihre Spaltennamen zu kennen, ist dies meine beste Vermutung. (Ich hatte noch keine Gelegenheit zum Testen, daher ist es möglicherweise nicht genau richtig.) Hoffentlich können Sie die von mir verwendeten Spaltennamen herausfinden. Angenommen, L ist eine Teilmenge von U:

SELECT l.id AS l_id, u.ab AS uab, l.abc AS labc, ST_Intersection(u.geom, l.geom) AS geom
  FROM u, l
  WHERE ST_Intersects(ST_PointOnSurface(l.geom), u.geom);
Scro
quelle
2
Dies ist korrekt. Siehe auch gis.stackexchange.com/a/31562/457 für eine Leistungsoptimierung dieses Ansatzes.
Paul Ramsey
Dies ist perfekt, sobald ich die Formen generiert habe, aber zuerst muss ich die vereinigten Formen erstellen. Meine Beispielzeichnung ist nicht die beste, um dies zu demonstrieren, aber ich muss zuerst die Geometrien schneiden, damit es keine Überlappungen gibt.
magnetisches
Ich denke, Sie haben das SQL nicht genau genug gelesen, es generiert neue Formen, die nur aus den gemeinsam genutzten Bereichen bestehen. Die Ausgabe dieser Abfrage weist keine überlappenden Funktionen auf.
Paul Ramsey
Du hast absolut Recht, Paul - ich glaube, ich wollte Nicklas 'Antwort unten kommentieren.
magnetisches
1

Die Antwort hängt davon ab, wie sauber und konsistent Ihre Daten sind. Wenn Sie davon ausgehen können, dass sich der Schwerpunkt der Tabelle L innerhalb des übereinstimmenden Polygons in Tabelle U befindet, können Sie Folgendes schreiben:

SELECT * FROM U INNER JOIN L ON ST_Intersects(L.Centroid(geom),U.geom);

Dann sollten Sie bekommen, was Sie wollen. Wenn Sie die gesamte Geometrie anstelle des Schwerpunkts von L verwenden, erhalten Sie viele seltsame Übereinstimmungen.

HTH

Nicklas

Nicklas Avén
quelle
Beachten Sie, dass die Centroid-Funktion keinen Punkt garantiert, der innerhalb des Polygons liegt. ST_PointOnSurface tut dies.
Scro
@ Scro du hast absolut recht. Fräulein von mir.
Nicklas Avén