Ich versuche, in QGIS Punkte (neue Ebene) in einem bestimmten Abstand entlang der Straße (vorhandene Ebene) zu erstellen. Erstellen von regelmäßigen Punkten für jeden Zähler auf Kreisebene mit ArcGIS Desktop? gibt Lösung für ArcGIS. Wie erreicht man das in QGIS? Hinzufügen von Punkten zur Punktvektorebene mit QGIS? Erklärt das Erstellen von Punkten, ändert aber nichts an der Entfernung.
(Ich habe die vorgeschlagenen Lösungen mit unterschiedlichen Längenmaßen angewendet, da ich die Umrechnung nicht kannte.) @Nathanss Lösung funktionierte in gewissem Maße, ich bekam ...
. Hier unterscheidet sich die Projektion dieser äquidistanten Punkte von der ursprünglichen Linie.
Mit @ underdarks Vorschlag bekam ich
wo die Punkte nicht äquidistant zu sein scheinen. Ich vermute, dass es bei beiden ein Projektionsproblem gibt, das ich nicht verstehe.
import locate
Leitung nicht mehr als einmal anrufen . Rufen Sie einfach einmal an, dann können Sielocate.pointsAlongLine(30)
so oft anrufen , wie Sie möchtenAntworten:
Hinweis: Es gibt jetzt ein QGIS-Plugin
QChainage
. Das alles und noch viel mehr. Der folgende Code ist mit QGIS 2.0 und höher nicht mehr aktuell.Hier ist ein Python-Code, den Sie in eine Datei einfügen und in QGIS verwenden können:
QGIS verfügt über eine Methode in der API, mit der Verweise auf Linien erstellt werden können. Ich konnte sie jedoch nicht zum korrekten Funktionieren bringen. Ich werde mich jedoch an den Autor des Codes wenden und prüfen, ob ich etwas falsch gemacht habe.
Fürs Erste benötigen Sie die formschöne Python-Bibliothek, die Sie trotzdem installieren sollten, da es praktisch ist, sie in der Nähe zu haben. Es hat auch eine großartige Dokumentation unter http://toblerity.github.com/shapely/manual.html
Dies ist der Abschnitt, den ich im folgenden Beispiel verwende: http://toblerity.github.com/shapely/manual.html#interoperation .
Der größte Teil des folgenden Codes ist QGIS-Boilerplate-Code, der nur die Features und Layer erstellt und von wkb und wkt und zurück konvertiert. Das Kernbit ist das,
point = line.interpolate(currentdistance)
das einen Punkt in einem Abstand entlang einer Linie zurückgibt. Wir wickeln dies einfach in eine Schleife, bis wir keine Linie mehr haben.Kopieren Sie den obigen Code und fügen Sie ihn in die Datei "my locate.py" im
~./qgis/python
Verzeichnis ein (weil es sich im Python-Pfad befindet). Führen Sie dies einfach in der Python-Konsole in QGIS aus.Auf diese Weise wird entlang der ausgewählten Linien alle 30 Meter eine neue Punktebene mit Punkten erstellt.
Hinweis: Code ist ziemlich rau und muss möglicherweise bereinigt werden.
BEARBEITEN: Der neueste QGIS-Entwickler kann dies jetzt nativ tun.
Ändern Sie die while-Schleife in
createPointsAt
:und Sie können die entfernen
quelle
locate
und zu verwenden, bekam aber immer noch nicht die äquidistanten Punkte. Außerdem bin ich ein Neuling in Python, daher habe ich nicht verstanden, wo ich den Code (1) python im qgis-Verzeichnis oder (2) das unter C: \ Python27 \ ausführen soll.C:\Users\{you user name}\.qgis\python
QGIS und starte es neu, wenn es geöffnet ist, und gehe zu "Plugins-> Python Console. Load a line layer, select a line a call
import locate" undlocate.pointsAlongLine(30)
Sie können das QGIS GRASS-Plugin v.to.points verwenden, um in regelmäßigen Abständen Punkte entlang von Linien zu erstellen
quelle
CRS of Original Shape file, the line = EPSG:26915 - NAD83 / UTM zone 15N, CRS of Grass line vector obtained using v.in.ogr = EPSG:4269 - NAD83, CRS of Grass points vector obtained using v.to.points = EPSG:4326 - WGS 84
Wenn Sie die Verkettung in festgelegten Intervallen entlang einer Straßenlinie zeichnen möchten, können Sie das Plug-In "Profil ab Linie" verwenden. Sie benötigen ein DEM unter dem Straßenrand, aber der Vorgang ist schnell und sehr einfach. Nick.
quelle
Beachten Sie, dass das Shapely (Python) / GEOS (C ++) - Datenmodell in einer Ebene definiert ist. Wenn Ihre Punkte also aus GPS-Positionen (Breitengrad, Längengrad) bestehen, wird mit dieser
shapely.geometry.LineString.interpolate(distance)
Methode eine GPS-Position in der euklidischen Entfernung entlang der angegebenen Position ausgegebenLineString
.Shapelys
interpolate()
basiert auf dergeos::linearref::LengthIndexedLine
Klasse von GEOS, die dieseextractPoint
Methode verwendet.Angeblich ist die gleichmäßig verteilte Interpolation in der Breiten- und Längengradebene ausreichend für Anwendungen, die relativ kleine Entfernungen berücksichtigen. Im Allgemeinen sollte man jedoch die Entfernung auf einer Kugel für GIS-Anwendungen berücksichtigen (wie in WGS84 definiert ).
Ich kann mir zwei Problemumgehungen mit dem Shapely-Modul vorstellen:
LineString
Eigenschaften sind alle gegebenen Punkte und linear interpolierte Kurven entlang dieser. Vielleicht können Sie ein Element schreiben, das auf die interpolierten Kurven zugreift, und das folgende Linienintegral implementieren, wobei der euklidische Abstand ersetzt wird. Ich mag diesen Ansatz, weil mit der stückweise durchgehenden Kurve die gewünschten Punkte erhalten werden können, indem die Schnittpunkte benachbarter Kreise entlang der Kurve mit dem Radius berechnet werdenr = radian_measure(arc_length) = arc_length / R
, wobei R dem Radius der Erde an der angegebenen Position entspricht.Um dies zu erreichen, möchte ich mich auf die folgende StackOverflow-Frage und insbesondere auf diese Antwort beziehen :
quelle
Sextante hat ein Tool, das für Sie arbeiten könnte. Sextante kann aus dem Qgis-Plugin-Repository heruntergeladen werden.
Suchen Sie nach:
"Werkzeuge für
Linienebenen " "Linien zu gleichmässigen Punkten"
quelle