Überlappung zwischen Polygonen aufteilen und mit PostGIS dem nächsten Polygon zuweisen?


8

Meine Frage hängt ziemlich mit der unbeantworteten Überlappung zwischen Polygonen in disjunkte Mengen zusammen, außer ich verwende nicht shapely, ich verwende PostGIS 2.4 unter PostgreSQL 10.

Ich habe eine Tabelle mit Multipolygonen für Verwaltungseinheiten. Die Geometrien decken nur die Landfläche ab. Mein Ziel ist es, sie um eine bestimmte Distanz ins Wasser zu verlängern.

Um die aktuellen Polygone ins Wasser zu erweitern, mache ich einen Puffer und subtrahiere anschließend alle anderen Geometrien in der Tabelle. Dadurch wird der Puffer abgeschnitten, in dem die Geometrie Nachbarn hat, und der Puffer wird beibehalten, in dem die Ebene derzeit nichts enthält. Also so etwas wie:

SELECT c1.name
     , ST_Difference( ST_Buffer( ST_Union(c1.geom), 250 )
                    , (SELECT ST_Union(c2.geom)
                         FROM foo.county AS c2
                        WHERE c2.name <> c1.name)
                    )
  FROM foo.county AS c1
 GROUP BY c1.name;

Dies führt jedoch natürlich zu überlappenden Puffern, bei denen zwei Polygone am Wasserrand sowie über schmale Meerengen aufeinander treffen:

Karte

(Beachten Sie, dass das kleine lila Faserband links vollständig dem roten Polygon zugeordnet werden sollte, da kein Punkt in dieser Geometrie aufgrund der anhangartigen Halbinsel näher an Blau als an Rot liegt.)

Hier stecke ich fest. Ich möchte die Überlappungen (violette Teile) in zwei disjunkte Polygone entlang einer Linie schneiden, die gleich weit von den ungepufferten Polygonen entfernt ist, und diese Splitter dann von den gepufferten Landkreisen subtrahieren.

Ich glaube nicht, dass ich drei oder mehr überlappende Puffer habe. Ich werde diese Brücke überqueren, wenn ich dazu komme.

Es riecht für mich nach etwas ähnlichem, aber nicht ganz Identischem wie die Verwendung ST_VoronoiPolygonsvon Polygonen anstelle von Punkten.

Existiert dies entweder - idealerweise - als PostGIS-Funktion, als QGIS-Geoverarbeitungsfunktion oder vielleicht in einigen Python-Bibliotheken?


Ist das im obigen Bild ein kleiner Fleck nicht blauer internationaler Gewässer? oder füllst du das aus?
Evan Carroll

Das Nicht-Blau befindet sich einfach außerhalb aller Polygone - ich mache nur einen 250-Meter-Puffer, also sind es immer noch nationale Gewässer. Für meinen Zweck brauche ich nur einen kleinen Puffer, um sicherzustellen, dass ich Features "in der Brandung" fange. Wenn ich das Loch südlich der Ringinsel in der Mitte sehe, möchte ich definitiv auch einen ExteriorRing-Dump machen, aber das ist für diese Frage nicht relevant. :)
kthy

Haben Sie eine Lösung gefunden? Ich stehe vor einem ähnlichen Problem und möchte einige überlappende Polygone auf ihre Nachbarn aufteilen.
DanielK

Leider noch keine Lösung. Ich habe eine Idee für den Fortschritt eine Kombination der Verwendung ExteriorRingund Intersectshaben aber keine Zeit , um die Arbeit an es über die Feiertage hatte.
kthy

Ihr Beispiel wurde möglicherweise teilweise automatisiert, aber die Funktion st_difference verhält sich beim Schneiden schrecklich und hinterlässt "Schnurrbärte" an den Kanten der Schnitte, wodurch der Entwickler nach Problemumgehungen suchen muss. Die Fälle des Zusammenführens von Polygonen können sowohl einfach als auch kompliziert sein. was eine manuelle Überarbeitung mit sich bringen wird ... Sie stehen immer noch vor der Arbeit mit Ihrem Beispiel?
Cyril Mikhalchenko

Antworten:


5

Wenn die Lösung für dieses Problem relevant ist und ich es richtig verstanden habe, lautet die Lösung wie folgt: (Die Originaldaten sind abstrakt, da ich verstanden habe, dass sie sich neben dem Puffer mit einer bestimmten Anzahl von Metern schneiden, in meinem Fall 2 Tabellen : exper_list3 und exper_list4 siehe Abbildung 1):

Geben Sie hier die Bildbeschreibung ein 1) Führen Sie in pgAdmin die Abfrage aus: create table exper_list5 as SELECT st_intersection (exper_list4.geom, exper_list3.geom) AS geom FROM exper_list4, exper_list3 WHERE st_intersects (exper_list4.geom, exper_list3.geom) = true; result: table exper_list5 siehe Abbildung 2;

Geben Sie hier die Bildbeschreibung ein

2) Führen Sie in pgAdmin die Abfrage aus: create table exper_list6 as SELECT (ST_Dumppoints (geom)). Geom FROM exper_list5; Das Ergebnis ist eine Tabelle mit Punkten. Wechseln Sie zusätzlich zu den Tabelleneigenschaften, erstellen Sie ein GID-Feld und legen Sie Einschränkungen fest.

3) Führen Sie in QGIS das Voronoi-Polygon-Werkzeug in der Tabelle (Vektorebene) aus. Exper_list6 Das Ergebnis ist in Abbildung 3 dargestellt.

Geben Sie hier die Bildbeschreibung ein

4) Führen Sie in pgAdmin die Abfrage aus: create table exper_list8 as SELECT (ST_Dumppoints (geom)).geom FROM exper_list7; Das Ergebnis ist in Abbildung 4 dargestellt.

Geben Sie hier die Bildbeschreibung ein

5) Wählen Sie aus exper_list8 die Punkte aus, die in das Polygon exper_list5 eingegeben werden. Führen Sie in pgAdmin die Abfrage aus: create table exper_list9 as SELECT st_intersection (exper_list8.geom, exper_list5.geom) AS geom FROM exper_list8, exper_list5 WHERE st_intersects (exper_list8.geom, exper_list5.geom) = true; und kopieren Sie diese Punkte in das Ergebnis der Tabelle exper_list6, Abbildung 5;

Geben Sie hier die Bildbeschreibung ein

6) Führen Sie in QGIS in der Tabelle exper_list6 das Tool "Delaunay Triangulation" aus und erhalten Sie das Ergebnis exper_list10 (siehe Abbildung 6)

Geben Sie hier die Bildbeschreibung ein

7) Wählen Sie in QGIS im Bearbeitungsmodus "Bleistift" in der Tabelle exper_list10 die Dreiecke aus, die auf den gewünschten Bereich treffen, und verwenden Sie das Werkzeug "Vektor" - "Geoverarbeitung" - "Vereinheitlichung nach Merkmalen" (aktivieren Sie "Nur ausgewählte Objekte"). "Klassifikation" - durch alle Zeichen) Ergebnis exper_list11 Abbildung 7;

Geben Sie hier die Bildbeschreibung ein

8) Aus Exper_list6 schneiden Sie Exper_list11 Ergebnis Abbildung 8 Exper_list12;

Geben Sie hier die Bildbeschreibung ein

9) Aus exper_list4 schneiden Sie exper_list11 das Ergebnis Abbildung 9 exper_list13;

Geben Sie hier die Bildbeschreibung ein

10) Ähnliche Aktionen müssen mit dem linken Polygon ausgeführt werden (in meinem Fall die Tabelle exper_list4).

11) Das Gesamtergebnis sind die beiden Tabellen exper_list13 und exper_list14, siehe Abbildung 10.

Geben Sie hier die Bildbeschreibung ein

Viel Glück, mit freundlichen Grüßen


Das sieht aus wie massives Gold. Ich werde es als akzeptiert markieren, sobald ich nächste Woche Zeit hatte, es auszuprobieren. Vielen Dank!
kthy
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.