Zufällige Punkte entlang der Polylinie in QGIS erstellen?

11

Ich versuche, zufällige Punkte entlang eines Polylinien-Shapefiles in QGIS zu erstellen. Grundsätzlich wie das Tool "Zufallspunkte" in "Forschungswerkzeuge", jedoch für Polylinien anstelle von Polygonen.

Ich habe versucht, die Liniendatei in ein Polygon-Shapefile zu konvertieren, aber es füllt einige Bereiche mit Polygonen, während andere Bereiche lange linienartige Polygone bleiben.

Ich bin ziemlich neu in QGIS und mit Python-Code nicht wirklich vertraut.

Cec.g
quelle
Wenn Sie bereit sind, in R einzusteigen, enthält das Spatstat-Paket Tools zum Erstellen zufälliger Punkte auf Linien.
Micha
Danke für den Code. Ich habe mich gefragt, ob mir jemand helfen könnte, es so zu ändern, dass es in regelmäßigen Abständen mit einem zufälligen Start Punkte auf der Linie platziert. Es wäre sehr dankbar. Ich habe keine Grundkenntnisse in Python.

Antworten:

14

Dieser Code funktioniert mit dem neuesten Entwickler-Build von QGIS.

from qgis.utils import iface
from qgis.core import *
from PyQt4.QtCore import QVariant
import random

def createRandomPoints(count):       
    # Create a new memory layer to store the points.
    vl = QgsVectorLayer("Point", "distance nodes", "memory") 
    pr = vl.dataProvider()  
    pr.addAttributes( [ QgsField("distance", QVariant.Int) ] )
    layer = iface.mapCanvas().currentLayer()

    # For each selected object
    for feature in layer.selectedFeatures():
        geom = feature.geometry()
        length = geom.length()
        feats = []
        # Loop until we reach the needed count of points.
        for i in xrange(0,count):
            # Get the random distance along the line.
            distance = random.uniform(0, length)
            # Work out the location of the point at that distance.
            point = geom.interpolate(distance)

            # Create the new feature.
            fet = QgsFeature()
            fet.setAttributeMap( { 0 : distance } )
            fet.setGeometry(point)
            feats.append(fet)

        pr.addFeatures(feats)
        vl.updateExtents()  

    QgsMapLayerRegistry.instance().addMapLayer(vl)

Ich weiß, dass Sie gesagt haben, dass Sie mit Python-Code nicht sehr vertraut sind, aber Sie sollten in der Lage sein, dies ziemlich einfach auszuführen. Kopieren Sie den obigen Code in eine Datei (meine heißt locate.py) und platzieren Sie sie in Ihrer, ~/.qgis/pythonwenn Sie Windows 7 verwenden, das sich in C:\Users\{your user name}\.qgis\python\oder unter Windows XP befindetC:\Documents and Settings\{your user name}\.qgis\python\

Sobald sich die Datei im Python-Ordner befindet, öffnen Sie QGIS und wählen Sie einige Linienobjekte aus.
Ebenenauswahl

Öffnen Sie dann die Python-Konsole und führen Sie den folgenden Code aus:

import locate.py 
locate.createRandomPoints(10)

Python-Konsole

Das Ergebnis sollte ungefähr so ​​aussehen

Ergebnisse

Wenn Sie es erneut ausführen möchten, wählen Sie einfach einige weitere Zeilen aus und führen Sie es erneut locate.createRandomPoints(10)in der Python-Konsole aus.

Hinweis: locate.createRandomPoints (10) Die 10 hier ist die Anzahl der Punkte, die pro Zeile generiert werden sollen

Nathan W.
quelle
Danke für deine Hilfe! Ich bin mir nicht sicher, in welchem ​​Format ich den Code speichern soll - wie mache ich daraus eine Datei mit der Erweiterung py? Entschuldigung, wenn dies ziemlich grundlegende Fragen sind.
Cec.g
Kopieren Sie den Text in eine normale Textdatei und speichern Sie ihn einfach mit .py als Erweiterung.
Nathan W
Ich habe das versucht, aber es kommt mit diesem Fehler: ImportError: Kein Modul namens locate.py
Cec.g
Dies ist der Dateipfad: C: \ Users \ Cecily \ .qgis \ python
Cec.g
Haben Sie import locatedie .py in der Python-Konsole nicht benötigt?
Nathan W
3

Sie können die Polylinien (minimal) puffern und dann die Abtastung für die resultierenden Polygone ausführen. Es könnte von selbst gut funktionieren, wenn Sie keine anderen einschränkenden Faktoren haben, z. auf minimalen Zwischenpunktabstand, Dichte oder so etwas.

Für kompliziertere Fälle würde ich eine viel dichtere Zufallsstichprobe erstellen und dann in einem zweiten Schritt geeignete (was auch immer das sein mag) Punkte auswählen. Ähnliches könnte mit dem Verdichtungswerkzeug gemacht werden, aber dann wären alle Punkte auf den Polylinien.

lynxlynxlynx
quelle