Wie kann man mit PostGIS2 eine Reihe von Straßensegmenten in Stadtblöcke verwandeln?

8

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.

Geben Sie hier die Bildbeschreibung ein

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 .

Peter Krauss
quelle
Möglicherweise könnte mit dem neuen Postgis-Topologiemodul die Straßengrenze zu diesem Polygon (geschlossener Bereich) zusammengefasst werden.
Cavila
Wie würden Sie vorschlagen, den Block zu bekommen? Die Straße ist (konzeptionell) ein Linestring, während jeder Block ein Polygon ist. Wie würden Sie einen einzelnen städtischen Block bei einem Linestring in Gegenwart von Dienstbarkeiten, Parks, Naturschutzgebieten, Battleaxe-Blöcken (z. B. anewhouse.com.au/2012/07/battleaxe-block ) und Blöcken mit einem Fluss / Bach lokalisieren ? / Kammlinie zwischen den Straßen usw.?
BradHards
Dank @Cavila, ich war auf der Suche nach Beispielen, und einige finden wie dieser , dass somthing , dass ich brauche, aber: alle beginnen mit Polygonen, nicht mit „Tesselation Segmente“ (siehe meine Verallgemeinerung des Problems). Meine Eingabe ist eine Reihe von Segmenten.
Peter Krauss
@BradHards, danke für deine Bewertung (!), Die ich bearbeitet habe, um den Fokus meines Problems zu zeigen. Ja, es gibt viele Ausnahmen wie einen Streitaxtblock. und ja, ich muss Flusssegmente, Eisenbahnsegmente usw. für eine "vollständige Tesselation" hinzufügen. Ich brauche nur die "erste Annäherung" von Blöcken, keine vollständige und automatisierte Konstruktion von Blöcken.
Peter Krauss
Ich denke, er ist bereit, den Block oder Sektor basierend auf der Straßengrenze zu bekommen. Kein einziges städtisches Grundstück für eine einzige Immobilie. Eine Lösung könnte darin bestehen, einen Walker erneut abzutasten, der ein Symbol an einem Startpunkt zeichnet und nach rechts dreht, bis er zu dem Startpunkt zurückkehrt, an dem er das Symbol gezeichnet hat. Sie erhalten also ein Polygon oder eine geschlossene Grenze.
Cavila

Antworten:

7

Das ST_PolygonizeAggregat in PostGIS gibt ein zurück, geometry_dumpdas 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:

SELECT (st_dump).path[1] as poly_id, (st_dump).geom FROM
    (SELECT ST_Dump(ST_Polygonize(geom)) FROM 
        (SELECT ST_Union(geom) as geom FROM lines) mergedlines) polys

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_Differencediesen Bereich aus den Blockpolygonen entfernen.

dbaston
quelle