Punkte in angegebenem Abstand entlang der Linie mit QGIS erstellen?

20

Ich möchte QGIS verwenden, um Punkte entlang der Linie zu erstellen, aber in einem bestimmten Abstand. Ich habe zwei GRASS-Tools in der SEXTANTE Toolbox gefunden:

  • v.zu.Punkten
  • v.segment

Ich habe v.to.points ausprobiert und den maximalen Abstand zwischen Punkten in Karteneinheiten auf 100 gesetzt.

zeigt entlang der Linie

genau hinschauen

Das zweite Foto zeigte einen genauen Blick vom oberen. Das Ergebnis war das, was ich wollte, aber ich möchte weniger Punkte bekommen , aber selbst wenn ich die maximale Entfernung auf 1000 oder 1000000 festlegte, war das Ergebnis das gleiche.

Ich habe versucht, v.segment zu verwenden , aber ich hatte keine Datei mit Segmentregeln.

Underdark gab mir einige Ratschläge und ich versuchte, Geometrien mit einem vorgegebenen Intervall zu verdichten . Zuerst habe ich ein Polylinien-Shapefile erhalten, wie ich es eingegeben habe, und dann habe ich mithilfe von Extraktionsknoten versucht, diese Punkte zu erhalten. Das Ergebnis war jedoch dasselbe wie bei der Verwendung von v.to.points , unabhängig davon, welches Entfernungsintervall ich eingestellt habe.

Wie kann ich Punkte entlang der Linie und in der angegebenen Entfernung erstellen?

Heinz
quelle
4
Schauen Sie sich das an, lassen Sie es uns wissen. Nathanw.net/2012/08/05/…
Willy
Vielen Dank für diesen hilfreichen Rat! Wenn ich Ihr Skript verwenden möchte, muss ich Python installieren? oder ist diese Funktion in der neuen Version QGIS 2.0 bereits eingebaut?
Heinz
5
In QGIS 2.0 gibt es dafür ein Plugin namens QChainage. Holen Sie sich das Plugin und installieren Sie es.
Willy
Beachten Sie, dass die Toolbox "Sextante" in QGIS 2.2.0+ als "Verarbeiten" bezeichnet wird und die Option "Geometrien mit einem Intervall verdichten" im Menü "ProcessingToolbox / QGISGeoalgorithms / VectorGeometryTools" angezeigt wird Das ist näher als das gewählte Intervall.
Dave X
Dies funktionierte für mich: plugins.qgis.org/plugins/LocatePoints
Tactopoda

Antworten:

20

In der Python-Konsole:

1) erstelle eine Memory Layer Klasse (komplette Klasse (ohne Attribute) bei crea_mem_layer.py )

class Create_vlayer(object):
    '''creation of a virtual layer''' 
     def __init__(self,nom,type):
         self.type=type
         self.name = nom
         self.layer =  QgsVectorLayer(self.type, self.name , "memory")
         self.pr =self.layer.dataProvider() 
     def create_point(self,geometry):
         # add point to the layer
         self.seg = QgsFeature()
         self.seg.setGeometry(QgsGeometry.fromPoint(geometry))
         self.pr.addFeatures([self.seg])
         self.layer.updateExtents()
     @property
     def display_layer(self):
         #end of layer and display layer 
         QgsMapLayerRegistry.instance().addMapLayers([self.couche])

2) Vektoralgebra-Funktionen (aus algèbre_vect_PyQGIS.py )

import math 
def mag(point):
    # magnitude of a vector
    return math.sqrt(point.x()**2 + point.y()**2)
def diff(point2, point1):
    # substraction betwen two vector
    return QgsPoint(point2.x()-point1.x(), point2.y() - point1.y())
def length(point1,point2):
    # with PyQGIS: sqrDist
    return math.sqrt(point1.sqrDist(point2))

3) Richtungskosinus

def dircos(point):
    cosa = point.x() / mag(point)
    cosb = point.y()/ mag(point)
    return cosa,cosb

4) Prozesslinie oder Liniensegmente

def pairs(list):
    # list pairs iteration 
    for i in range(1, len(list)):
    yield list[i-1], list[i]

layer = qgis.utils.iface.activeLayer()
# interval between points
interval = 5 m
# create virtual layer
gen_pt  = Create_vlayer("mid5", "Point")

for elem in layer():
    line = elem.geometry()
    for seg_start, seg_end in pairs(line.asPolyline()):
       line_start = QgsPoint(seg_start)
       line_end = QgsPoint(seg_end)
       # mid point = vector coordinates [x2-x1,y2-y1]
       pointm =diff(line_end, line_start)
       # direction cosines of the segment
       cosa,cosb = dircos(pointm)
       # length of the segment
       lg = length(line_end, line_start)
       # generate and add points to the virtual layer 
       for i in range(interval,lg,interval):
           gen_pt.create_point(QgsPoint(line_start.x()  + (i * cosa), line_start.y() + (i*cosb)))

# display layer
gen_pt.display_layer

Ergebnisse

Polylinie, Punkt mit gleichem Abstand mit Shapely oder PyQGIS2, mit Richtungskosinus

Polyliniewohlgeformtvector_algebra

Dann einfach das Intervall einstellen

Gen
quelle
Wenn Sie sich die Kreuzung ansehen, sieht es so aus, als würden die bereits vorhandenen Knotenpunkte auf der Linie beibehalten, sodass sie nicht auf eine Auflösung verringert werden können, die unter den bereits auf der Linie vorhandenen Scheitelpunkten liegt. Bei komplizierten, kurvigen Linien wie im OP haben diese Verfahren möglicherweise keine große Wirkung.
Dave X
Sie können das Skript perfekt anpassen.
Gen
17

Es gibt jetzt ein Plugin namens QChainage, das genau das macht, was Sie wollen. Sie geben einen Intervallabstand an und das Plugin erstellt Punkte entlang Ihrer Linie im angegebenen Intervall.

Jason
quelle
* Beachten Sie, dass hierdurch Ihre Linienknoten nicht erfasst werden. Wenn Sie sie benötigen, müssen Sie auch das Geometriewerkzeug verwenden - extrahieren Sie Knoten und fügen Sie sie an Ihre Verkettungspunkte an.
Jason
1
Willkommen bei der GIS SE! Ich denke, die Informationen, die Sie hier als Kommentar angehängt haben, lassen sich besser in Ihre eigentliche Antwort integrieren, indem Sie den Bearbeiten-Button darunter verwenden. Sie können dies mit Kopieren / Einfügen tun und Ihren Kommentar löschen, indem Sie auf das kleine Kreuz daneben klicken.
PolyGeo
11

Ich habe ein Skript geschrieben, das das Werkzeug "Sextante-Geometrien verdichten" so ändert, dass es einen bestimmten Abstand akzeptiert. Es heißt Geometrien in einem bestimmten Intervall verdichten .

Nach dem Ausführen von Verdichten können Sie die Punkte mit dem Werkzeug Knoten extrahieren extrahieren .

Sie können es von Github bekommen und Installationsanweisungen finden Sie auf meinem Blog .

Bildbeschreibung hier eingeben

Underdunkel
quelle
Es scheint, dass dieses Tool jetzt in QGIS ohne die Sextante-Installation (QGIS 2.18.7) verfügbar ist. Ich habe es nicht in den Menüs gesehen, sondern beim Suchen in der Processing Toolbox als QGIS-Geoalgorithmus gefunden.
Nate Wanner
0

Wenn Sie nicht mit Python-Skripten herumhüpfen möchten, können Sie einfach das Plugin "Profil von Zeile" installieren und verwenden und die Rasterwertspalte ignorieren / löschen. Die Verkettung entspricht dem eingestellten Abtastintervall.

user19425
quelle
In QGIS 2.2.0 sehe ich ein "Profil-Tool", "qProf" und "VoGIS-ProfilTool", aber kein "Profil von Linie" -Tool.
Dave X
0

Nun, ich bin mir nicht sicher, ob dies in der stabilen Version ist, aber in der Sextante-Toolbox auf 1.9 Alpha unter Geoalgorithmus-> Vektor ist die Option "Linien in Punkte konvertieren". Funktioniert hervorragend, wenn auch ein Feld für die Entfernung entlang der Linie hinzugefügt wird.

Interessanterweise wurde das Feld NAME aus meiner Vektorebene hinzugefügt.

Ich habe versucht, das Python-Skript von Nathan Woodrow zum Laufen zu bringen, aber ich lutsche mit Python. Und mit Code im Allgemeinen scheint es.

Kapanther
quelle
0

Ich habe lange mit diesem Problem gekämpft, aber irgendwann mehr oder weniger das bekommen, wonach ich mit QChainage gesucht habe. Was ich teilen möchte, ist etwas, das anderen helfen kann. Wenn Sie das Geoverarbeitungswerkzeug SAGA für die Linie verwenden, führt QChainage zu falschen Ergebnissen. Die Verwendung eines anderen Auflösungswerkzeugs führt dazu, dass es einwandfrei funktioniert.

Chester H
quelle