Punkte entlang der Linie anhand von Attributdaten mit QGIS erstellen?

9

Ich möchte in QGIS äquidistante Punkte entlang von Linien erstellen, aber jede meiner Linien hat ein Attribut dafür, wie viele Punkte in einer Spalte namens "Stück" darauf sein sollten, und diese Werte unterscheiden sich in fast allen Fällen.

Geben Sie hier die Bildbeschreibung ein

Mein erster Gedanke war, Linien gemäß den Werten in der Attributtabelle in gleiche Teile zu teilen und dann Punkte auf die Schwerpunkte der Linien zu setzen, aber ich konnte es nicht tun.

Diese Frage ist sehr ähnlich zu dem, was ich gerne machen würde, aber nicht für QGIS:

Wie erstelle ich die gleiche Anzahl von Punkten entlang mehrerer Polylinien?

Die meisten ähnlichen Fragen, die hier bei stackexchange in diesem Thema zu finden sind, beziehen sich auf einen bestimmten Abstand zwischen Punkten, eine Zahl, die einfach in ein Feld eingegeben werden kann (wie im Fall von Punkte entlang Linien erstellen oder Linien in Punktealgorithmen konvertieren ) und nicht über bestimmte Daten aus einer Attributtabelle, die ich für solche Zwecke nicht verwenden konnte.

Es wäre fantastisch, wenn es keine Punkte direkt am Start- und Endpunkt der Linie gäbe, aber ich wäre einfach überglücklich, wenn es so viele Punkte auf einer Linie gäbe wie in ihrer Attributtabelle.

Skye
quelle

Antworten:

10

Hier ist ein kurzes PyQGIS-Skript, das den Trick machen sollte

from qgis.core import QgsFeature, QgsVectorFileWriter, QgsGeometry

def create_points(feat,writer):
    geometry = feat.constGeometry()
    if not geometry:
        return
    length = geometry.length()
    # -----------------
    # change 'num_points' to match your field name for the number of points field
    # -----------------
    num_points = feat['num_points']
    delta = length / ( num_points + 1.0 )
    distance = 0.0
    for i in range(num_points):
        distance += delta
        output_feature = QgsFeature(feat)
        output_feature.setGeometry( geometry.interpolate(distance) )
        writer.addFeature(output_feature)

layer = iface.activeLayer()

# ---------------
# change 'd:/test_points.shp' to desired output file name
# ---------------

writer = QgsVectorFileWriter('d:/test_points.shp',None, layer.fields(), QGis.WKBPoint, layer.crs())

for f in layer.getFeatures():
    create_points(f,writer)

del writer

Ändern Sie einfach den num_pointsFeldnamen und den Namen der Ausgabedatei entsprechend Ihren Daten, wählen Sie die Eingabeebene aus und führen Sie sie in der Python-Konsole aus.

Ndawson
quelle
Aus irgendeinem Grund erscheint nach dem Kopieren dieses Skripts eine Fehlermeldung: Datei "<Eingabe>", Zeile 1 Länge = Geometrie.Länge () ^ Einrückungsfehler: unerwarteter Einzug
Skye
1
ndawson - Ich habe die Formatierung so bearbeitet, dass das Kopieren / Einfügen in die Python-Konsole einfacher ist. Sie können jedoch auch ein Rollback durchführen, wenn Sie es nicht mögen =). @Skye - Ich würde vorschlagen, den Code in einen Texteditor zu kopieren, den Feldnamen und den Ausgabepfad zu ändern und den Code dann erneut in die Python-Konsole zu kopieren. Hoffentlich sollte es keinen Einrückungsfehler mehr geben.
Joseph
1
Danke für euch beide !! :) ndawson, dein Skript ist brillant und @Joseph, deine Formatierungsbearbeitung war eine große Hilfe! Außerdem stellte sich heraus, dass ich am Ausgabepfad "/" anstelle von "\" hätte verwenden sollen.
Skye