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:
(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_VoronoiPolygons
von Polygonen anstelle von Punkten.
Existiert dies entweder - idealerweise - als PostGIS-Funktion, als QGIS-Geoverarbeitungsfunktion oder vielleicht in einigen Python-Bibliotheken?
ExteriorRing
undIntersects
haben aber keine Zeit , um die Arbeit an es über die Feiertage hatte.Antworten:
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):
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;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.
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.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;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)
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;
8) Aus Exper_list6 schneiden Sie Exper_list11 Ergebnis Abbildung 8 Exper_list12;
9) Aus exper_list4 schneiden Sie exper_list11 das Ergebnis Abbildung 9 exper_list13;
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.
Viel Glück, mit freundlichen Grüßen
quelle