Creazione di punti casuali lungo la polilinea in QGIS?


11

Sto cercando di creare punti casuali lungo uno shapefile di polilinea in QGIS. Fondamentalmente, come lo strumento "punti casuali" in "strumenti di ricerca" ma per polilinee anziché poligoni.

Ho provato a convertire il file di linea in un file di forma poligonale, ma riempie alcune aree con poligoni, mentre altre aree rimangono poligoni di tipo linea lunga.

Sono abbastanza nuovo con QGIS e non ho molta familiarità con il codice Python.


Se sei disposto a entrare in R, il pacchetto spatstat ha strumenti per creare punti casuali su linee.
Micha,

Grazie per il codice Mi chiedevo se qualcuno potesse aiutarmi a modificarlo in modo che posizionasse punti sulla linea a intervalli regolari distanziati con un inizio casuale? Sarebbe molto apprezzato. Non ho alcuna conoscenza pratica di Python.

Risposte:


14

Questo codice funzionerà sull'ultima build di sviluppo di 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)

So che hai detto che non hai molta familiarità con il codice Python ma dovresti essere in grado di eseguirlo abbastanza facilmente. Copia il codice sopra in un file (il mio si chiama locate.py) e posizionalo nel tuo ~/.qgis/pythonse sei su Windows 7 che sarà in C:\Users\{your user name}\.qgis\python\o su Windows XPC:\Documents and Settings\{your user name}\.qgis\python\

Una volta che il file si trova nella cartella Python, apri QGIS e seleziona alcuni oggetti linea.
Selezione del livello

Quindi aprire la console Python ed eseguire il codice seguente:

import locate.py 
locate.createRandomPoints(10)

Console Python

Il risultato dovrebbe assomigliare a questo

risultati

Se vuoi eseguirlo di nuovo, seleziona alcune altre righe ed esegui di nuovo locate.createRandomPoints(10)nella console Python.

Nota: Locate.createRandomPoints (10) il 10 qui è il numero di punti da generare per riga


Grazie per tutto il vostro aiuto! Non sono sicuro in quale formato salvare il codice: come posso renderlo un file con estensione PY? Scusate se queste sono domande piuttosto basilari.
Cec.g

Copia il testo in un normale file di testo e salvalo con .py come estensione.
Nathan W

L'ho provato, ma viene fuori questo errore: ImportError: nessun modulo chiamato Locate.py
Cec.g

Questo è il percorso del file: C: \ Users \ Cecily \ .qgis \ python
Cec.g

hai usato import locateinutilmente il .py nella console di Python.
Nathan W

3

È possibile bufferizzare le polilinee (in minima parte) e quindi eseguire il campionamento sui poligoni risultanti. Potrebbe funzionare bene da solo se non si hanno altri fattori limitanti, ad es. su spaziatura, densità o someuch interpoint minimo.

Per casi più complicati, creerei un campione casuale molto più denso e poi selezionerei i punti appropriati (qualunque esso sia) in un secondo passaggio. Qualcosa di simile potrebbe essere fatto con lo strumento di densificazione, ma poi tutti i punti sarebbero sulle polilinee.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.