Wie kann ich nahe gelegene und parallele Straßenlinien (z. B. eine zweispurige Straße) zu einer einzigen Linie zusammenfassen / zusammenfassen?

23

Ich habe ein Shapefile von OSM, das alle Straßen in einer Stadt enthält. Größere Straßen (wie zweispurige Straßen) scheinen zwei parallele Linien zu haben. Ich möchte diese in einer Zeile zusammenfassen / kombinieren, damit ich sie in einer externen 3D-Anwendung exportieren und rendern kann (2 überlappende Straßen werden kompliziert und sehen in 3D seltsam aus).

Wie kann ich dies mit QGIS oder PostGIS erreichen? Ich mache mir keine Sorgen um einen leichten Genauigkeitsverlust (innerhalb weniger Meter) und möchte, dass die resultierende einzelne Linie zwischen (idealerweise der Mitte von) den aktuellen parallelen Linien liegt.

Vielen Dank.

(Hier ist ein Beispiel für die doppelten Straßenlinien, die ich kombinieren möchte)

Bildbeschreibung hier eingeben

Robin Hawkes
quelle

Antworten:

3

ESRI verfügt über ein Werkzeug zum Zusammenklappen von zweispuriger Fahrbahn zur Mittellinie. Sie können eine kostengünstige Version für die Verwendung mit OSM erhalten. Andernfalls können Sie Features auswählen und als neue Ebene speichern. Löscht die Auswahl aus dem Layer, den Sie für den Export verwendet haben. Pufferfunktion in Reichweite einer Seite der Fahrbahn, die die zweite Fahrspur enthält. Verschmelze Shapefile mit Original, verbinde alle kaputten Topologien.

Wenn Sie programmieren und / oder skripten können, können Sie eine Mittellinie zwischen den Spuren auf einem Knoten durch Knotenabgleich segmentweise mitteln und eine Mittellinienprogrammierung ausgeben. Anschließend können Sie ausgewählte Features, die für den Produktionsprozess verwendet werden, programmgesteuert löschen, die fehlerhafte Topologie überprüfen und beheben getan.

Ich habe ein Arcpy-Codebeispiel gefunden, das ich einbinde. Wie Sie den Link finden, erfahren Sie weiter unten in den Kommentaren.

wird der ESRI ARCGis-Hilfe zugeschrieben

# Name: CollapseDualLinesToCenterline_Example.py
# Description: Creates street centerlines from a street casing coverage.
# Requirements: ArcInfo Workstation

# Import system modules
import arcpy
from arcpy import env

# Set environment settings
env.workspace = "C:/data"

# Set local variables
inCover = "streets"
outCover = "C:/output/centerlines"
maximumWidth = 50

# Execute CollapseDualLinesToCenterline
arcpy.CollapseDualLinesToCenterline_arc(inCover, outCover, maximumWidth, "")
Lewis
quelle
Könnten Sie bitte einen Link zum ESRI-Tool zum Reduzieren der Mittellinie erstellen? Ich konnte es nicht finden. Das einzige, was ich finden konnte, war der Abschnitt Bearbeiten von Schnellstraßen auf dieser Seite .
Fezter
In der ArcGIS-Hilfe werden eindeutige Links generiert, die keinen Verweis auf einen angehängten Link enthalten. Gehen Sie zu resources.arcgis.com/de/help/main/10.1/index.html, und suchen Sie in "Doppelte Linien zur Mittellinie (Abdeckung) reduzieren" Der ursprüngliche Link stammt aus einer Diskussion und ist möglicherweise falsch, da Sie ArcGIS for Desktop Advanced benötigen: Erfordert installierte ArcInfo Workstation
Lewis
1
Die meisten Benutzer sollten das Tool "Coverage" (für das Workstation erforderlich ist) nur verwenden, wenn sie explizit mit Arc7-Coverage-Daten arbeiten. Verwenden Sie stattdessen in den meisten Fällen die Option Doppelte Linien zur Mittellinie reduzieren (Kartografie) .
RyanDalton
2

Sie könnten es mit Mike Migurskis Skeletron versuchen . Es ist ein Open-Source-Tool, das er unter anderem für seinen Terrain-Map-Stil verwendet.

Sarge
quelle
1

Vielleicht ist es keine sehr elegante Lösung und basiert auf der Methode zur Beantwortung von Fragen: /gis//a/295348/120129 .

Es ist eine der Varianten zur Lösung Ihrer Frage, ein Geoinstrument einzurichten (für mich ist es eine Straße mit dem Namen "road_border" 11 m breit, Typ - Linie (MultiLineString)),

ein Geoinstrument betreiben :-),

WITH ta AS (SELECT id, ((ST_DumpPoints(geom)).geom) as geom FROM road_border), tb as (SELECT (ST_Buffer((ST_Dump(geom)).geom, 0.0001)) geom FROM ta), tc as (SELECT ST_Centroid(ST_UnaryUnion(Unnest(ST_ClusterWithin(geom, 0.0001)))) geom FROM tb), td as (SELECT ((ST_Dump(ST_DelaunayTriangles(ST_Collect(geom)))).geom) geom FROM tc), te as (SELECT (ST_Boundary(geom)) geom FROM ST_Dump((SELECT ST_Polygonize(geom) AS geom FROM (SELECT ST_Union(geom) AS geom FROM (SELECT ST_ExteriorRing(geom) AS geom FROM td) AS lines) as foo))), tf as (SELECT ST_MakeLine(p1,p2) geom FROM (SELECT ST_PointN(geom, generate_series(1, ST_NPoints(geom)-1)) p1, ST_PointN(geom, generate_series(2, ST_NPoints(geom))) p2 FROM te) AS geom), tj as (SELECT ST_Buffer((ST_Dump(ST_Union(ST_Buffer(geom, 0.0005)))).geom, -0.0005) geom FROM road_border) SELECT ST_Intersection (a.geom, b.geom) AS geom FROM tf as a JOIN tj as b ON ST_Within (a.geom, b.geom);

und sehen das Ergebnis.

PS Ich werde dieses Tool ST_RoadAxisFromDelaunayTriangulation nennen. OS ...

Cyril
quelle