Theoretisch ist es möglich, die Polygone von Stadtblöcken (Stadtblöcken) aus Straßen zu erhalten, wenn Straßen durch die Straßenachse ( LineStrings ) dargestellt werden.
Die städtischen Blöcke sind durch Straßen begrenzt, sodass die Straßensegmente verwendet werden können, um ein Polygon zu bilden, das nur einen Block enthält ... Siehe Abbildungen.
Gibt es ein (SQL) PostGIS 2.X- Skript, um dies zu tun? Eine Plugin-Software?
PS: Ungefähre Stadtblockgeometrien sind ausreichend.
Illustrieren
Ausgehend von einem "Netz verbundener Liniensegmente" kann dies sein: 1) Erhalten zugeordneter Polygone; 2) Isolieren von Polygonen durch negativen Puffer und Puffersubtraktion der Linien.
Beispiel: Das Polygon 262 (das einen Stadtblock darstellt) wurde von den Segmenten 2496, 2494, 2369, 1513, ... erzeugt. Das Nachbarpolygon 263 kann einige gemeinsame Segmente verwenden, aber als nächstes (durch negativen st_buffer oder eine andere Operation) wird wirklich isolierte Polygone, daher reicht eine geringe Präzision aus.
(BEARBEITEN)
Ich denke, wir können dieses spezifische Problem in ein allgemeineres übersetzen: Die Menge der Straßensegmente kann als eine Art Tessellation angesehen werden , dh die Segmente teilen das Flugzeug in zusammenhängende Regionen auf - die städtischen Blöcke liegen im Inneren dieser Regionen. Jedes Segment ist eine Seite von zwei Regionen.
Das Hauptproblem besteht darin, die "Menge der Segmente der Tessellation" in unabhängige Polygone umzuwandeln .
quelle
Antworten:
Das
ST_Polygonize
Aggregat in PostGIS gibt ein zurück,geometry_dump
das alle möglichen Polygone enthält, die durch eine Reihe von Linien gebildet werden. Ich gehe davon aus, dass die in Ihrem Beispiel gezeigten Block-IDs nicht mit den IDs der Eingabezeilen zusammenhängen. In diesem Fall können Sie Ihre Polygone und IDs abrufen mit:Der langsame Teil hier ist der
ST_Union
. Es scheint, dass dies ohne diesen Aufruf funktionieren sollte, solange die Eingabezeilen richtig geknickt sind, aber ich habe dies nicht erfolgreich getan.Ein negativer Puffer liefert nicht die genauen Ergebnisse, die in Ihrem Beispiel gezeigt werden, da die Sackgassen vom Polygonisierungsprozess ignoriert werden. Sie können jedoch einen positiven Puffer der ursprünglichen Linienführung verwenden und
ST_Difference
diesen Bereich aus den Blockpolygonen entfernen.quelle