Ich versuche, mit QGIS 2.14 ein Straßennetz an einem hexagonalen Raster auszurichten, aber es treten merkwürdige Artefakte auf.
Ich habe mit MMQGIS ein Hex-Gitter erstellt , die Zellen sind ca. 20 x 23 m groß . Ich habe das Straßennetz um 1 m gepuffert und verdichtet , sodass alle paar Meter ein Knoten vorhanden ist. Sie können unten sehen, was ich zu erreichen versuche. Wie Sie sehen, kann ich es in einigen Fällen zum Laufen bringen:
- blau ist die verdichtete Straße (eine gepufferte Linie)
- rot ist die "hexifizierte" Version - das ist, was ich finden möchte
- Das Grau ist das Hex-Gitter
Anschließend habe ich die neue Funktion " Geometrien fangen" verwendet, um die Knoten an der nächstgelegenen Sechseckecke zu fangen. Die Ergebnisse sind vielversprechend, aber es scheint einige Randfälle zu geben, bei denen sich die Linie ausdehnt, um das Sechseck (oder einen Teil davon) auszufüllen:
Der Grund für den Puffer ist , dass Snap - Geometrien nicht , dass Sie auf eine Schicht schnappen sich lassen , deren Geometrie ist anders. Sie können beispielsweise keine Knoten auf einer LINE-Ebene an Punkten auf einer POINT-Ebene ausrichten. Es scheint am glücklichsten zu sein, POLYGON an POLYGON zu knipsen.
Ich vermute, die Straßen dehnen sich aus, wenn eine Seite der gepufferten Straßenlinie zur einen Seite der Hex-Zelle und die andere Seite zur anderen Seite der Hex-Zelle springt. In meinem Beispiel scheinen die Straßen, die sich in einem spitzen Winkel nach West-Ost kreuzen, die schlechtesten zu sein.
Dinge, die ich erfolglos versucht habe:
- Puffern des Straßennetzes um einen winzigen Betrag, so dass es ein Polygon bleibt, aber sehr dünn ist.
- Verdichtung der hexadezimalen Zellen (also gibt es Knoten entlang der Kanten, nicht nur an den Ecken)
- Variieren der maximalen Fangentfernung (dies hat den größten Effekt, aber ich kann scheinbar keinen idealen Wert finden)
- unter Verwendung von LINE-Ebenen, nicht von POLYGONen
Ich finde, wenn ich nur LINE-Ebenen verwende, funktioniert es eine Weile und stürzt dann ab. Es scheint seine Arbeit zu retten, da einige Zeilen teilweise verarbeitet wurden.
Kennt jemand eine andere Möglichkeit, um Punkte auf einer Linie zum nächsten Punkt auf einer anderen Linie / Polygonebene zu fangen, idealerweise ohne die Verwendung von Postgres / Postgis (obwohl eine Lösung mit Postgis auch wünschenswert wäre)?
BEARBEITEN
Für alle, die es ausprobieren möchten, habe ich hier auf Dropbox ein QGIS- Startprojekt eingestellt . Dies schließt die Ebenen Hex Grid und Densified lines ein. (Das Straßennetz stammt von OSM und kann mit QuickOSM heruntergeladen werden, z. B. wenn Sie das Original benötigen, um die Straßen zu verdichten.)
Beachten Sie, dass es sich bei OSGB (epsg: 27700) um eine lokalisierte UTM für Großbritannien mit Einheiten in Metern handelt.
Antworten:
Meine Lösung beinhaltet ein PyQGIS-Skript, das schneller und effektiver ist als ein Workflow, bei dem ein Snap ausgeführt wird (ich habe es auch ausprobiert). Mit meinem Algorithmus habe ich folgende Ergebnisse erhalten:
Sie können die folgenden Code-Snippets nacheinander in QGIS (in der QGIS Python-Konsole) ausführen. Am Ende erhalten Sie eine Speicherebene mit den in QGIS geladenen Routen.
Die einzige Voraussetzung ist die Erstellung eines mehrteiligen Straßen-Shapefiles (verwenden Sie
Processing->Singleparts to multipart
, ich habe das Feldfictitiuos
alsUnique ID field
Parameter verwendet). Dadurch erhalten wir eineroads_multipart.shp
Datei mit einer einzigen Funktion.Hier ist der Algorithmus erklärt:
Holen Sie sich die nächsten Sechseckseiten, wo sich die Routen kreuzen. Für jedes Sechseck erstellen wir 6 Dreiecke zwischen jedem Paar von Nachbarscheitelpunkten und dem entsprechenden Schwerpunkt. Wenn eine Straße ein Dreieck schneidet, wird das Segment, das das Sechseck und das Dreieck gemeinsam haben, zur endgültigen Route hinzugefügt. Dies ist der schwerere Teil des gesamten Algorithmus. Auf meinem Computer dauert es 35 Sekunden. In den ersten beiden Zeilen befinden sich 2 Shapefile-Pfade, die Sie an Ihre eigenen Dateipfade anpassen sollten.
Befreien Sie sich mit Python-Listen, -Tupeln und -Wörterbüchern von nicht verbundenen (oder "offenen") Segmenten . Zu diesem Zeitpunkt sind noch einige getrennte Segmente vorhanden, dh Segmente, bei denen ein Scheitelpunkt getrennt, der andere jedoch mit mindestens zwei anderen Segmenten verbunden ist (siehe rote Segmente in der nächsten Abbildung). Wir müssen sie loswerden.
Jetzt können wir einen Vektorlayer aus der Liste der Koordinaten erstellen und in die QGIS-Karte laden :
Ein weiterer Teil des Ergebnisses:
Sollten Sie Attribute für die gefangenen Routen benötigen, können Sie mit einem räumlichen Index schnell Kreuzungen auswerten (z. B. in /gis//a/130440/4972 ), aber das ist eine andere Geschichte.
Hoffe das hilft!
quelle
Ich habe es in ArcGIS gemacht, es kann sicherlich mit QGIS oder einfach mit Python mit einem Paket implementiert werden, das Geometrien lesen kann. Stellen Sie sicher, dass Straßen ein Netzwerk darstellen, dh sich nur an den Enden kreuzen. Sie beschäftigen sich mit OSM, ich nehme an, dass es der Fall ist.
Wenn Sie das nicht sehen wollen:
Versuchen Sie nicht, auf Voronoi-Linien Verkettungspunkte zu verwenden. Ich fürchte, es wird es nur noch schlimmer machen. Sie können also nur ein Netzwerk aus Voronoi-Linien erstellen und Routen zwischen Straßenendpunkten finden, auch das ist keine große Sache
quelle
Mir ist klar, dass Sie nach einer QGIS-Methode fragen, aber ich bitte Sie um eine bogenförmige Antwort:
Anmerkungen:
quelle
Wenn Sie die Straßenlinie in Segmente aufteilen würden, in denen jedes Segment vollständig vom Sechseck umschlossen ist, wäre Ihre Entscheidung, welche Sechseckliniensegmente verwendet werden sollen, ob der Abstand zwischen dem Schwerpunkt des aufgeteilten Straßensegments und dem Mittelpunkt der einzelnen Sechseckseiten weniger als die Hälfte beträgt Durchmesser des Sechsecks (oder kleiner als der Radius eines Kreises, der in das Sechseck passt).
Wenn Sie also (jeweils ein Segment) Sechskantliniensegmente auswählen (wobei jedes Segment eine Seite des Sechskants ist), die sich in einem Abstand zum Radius des Sechskants befinden, können Sie diese Liniengeometrien kopieren und zusammenführen Welche eindeutige Kennung Sie auch für Ihren Straßendatensatz verwenden.
Wenn beim Zusammenführen des eindeutigen Bezeichners Probleme auftreten, können Sie den Puffer anwenden und nach Position nur in diesen Segmenten auswählen, um die Attribute Ihres Straßendatensatzes anzuwenden. Auf diese Weise müssen Sie sich keine Gedanken darüber machen, ob mit einem zu großen Puffer falsche Übereinstimmungen hergestellt werden.
Das Problem mit dem Ausrichtungswerkzeug ist, dass es wahllos Punkte ausrichtet. Es ist schwierig, diese perfekte Toleranz zu finden. Mit dieser Methode können Sie die zu verwendenden Sechskantliniensegmente korrekt identifizieren und dann die Geometrie Ihrer Straßendaten ersetzen (oder die Geometrien in einen anderen Datensatz einfügen).
Wenn Sie weiterhin Probleme mit den Liniensegmenten haben, die von einer Seite des Sechsecks zur anderen springen, können Sie die Linie durch Scheitelpunkte in Segmente aufteilen, die Länge jeder Linie berechnen und dann alle Liniensegmente entfernen, die größer als sind die durchschnittliche Länge einer Seite des Sechsecks.
quelle
Der Geometrie-Snapper in qgis 3.0 wurde überarbeitet und ermöglicht nun das Einrasten zwischen verschiedenen Geometrietypen. Es hat auch viele Korrekturen. Sie können eine "Daily Snapshot" -Version ausprobieren, um Zugriff auf den verbesserten Snapper zu erhalten, bevor 3.0 offiziell veröffentlicht wird.
quelle