Créer des points aléatoires le long de la polyligne dans QGIS?

11

J'essaie de créer des points aléatoires le long d'un fichier de formes polyligne dans QGIS. Fondamentalement, comme l'outil «points aléatoires» dans les «outils de recherche» mais pour les polylignes au lieu des polygones.

J'ai essayé de convertir le fichier de lignes en un fichier de formes de polygones, mais il remplit certaines zones avec des polygones, tandis que d'autres zones restent de longs polygones de type ligne.

Je suis assez nouveau sur QGIS et je ne connais pas vraiment le code Python.

Cec.g
la source
Si vous êtes prêt à entrer dans R, le package spatstat a des outils pour créer des points aléatoires sur les lignes.
Micha
Merci pour le code. Je me demandais si quelqu'un pouvait m'aider à le modifier pour qu'il place des points sur la ligne à intervalles réguliers avec un départ aléatoire? Ce serait vivement apprécié. Je n'ai aucune connaissance pratique de python.

Réponses:

14

Ce code fonctionnera sur la dernière version de développement de 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)

Je sais que vous avez dit que vous ne connaissiez pas très bien le code Python, mais vous devriez pouvoir exécuter cela assez facilement. Copiez le code ci-dessus dans un fichier (le mien s'appelle locate.py) et placez-le dans votre ~/.qgis/pythonsi vous êtes sur Windows 7 qui sera dans C:\Users\{your user name}\.qgis\python\ou sur Windows XPC:\Documents and Settings\{your user name}\.qgis\python\

Une fois le fichier dans le dossier python, ouvrez QGIS et sélectionnez certains objets de ligne.
Sélection de calque

Ouvrez ensuite la console Python et exécutez le code suivant:

import locate.py 
locate.createRandomPoints(10)

Console Python

Le résultat devrait ressembler à ceci

Résultats

Si vous souhaitez l'exécuter à nouveau, sélectionnez simplement quelques lignes supplémentaires et exécutez locate.createRandomPoints(10)à nouveau dans la console Python.

Remarque: Locate.createRandomPoints (10) les 10 ici est le nombre de points à générer par ligne

Nathan W
la source
Merci pour votre aide! Je ne sais pas dans quel format enregistrer le code - comment puis-je en faire un fichier avec une extension py? Désolé si ce sont des questions assez basiques.
Cec.g
Copiez le texte dans un fichier texte normal et enregistrez-le simplement avec l'extension .py.
Nathan W
J'ai essayé, mais il arrive avec cette erreur: ImportError: Aucun module nommé Locate.py
Cec.g
Voici le chemin du fichier: C: \ Users \ Cecily \ .qgis \ python
Cec.g
avez-vous utilisé import locatepas besoin de .py dans la console Python.
Nathan W
3

Vous pouvez tamponner les polylignes (au minimum), puis exécuter l'échantillonnage sur les polygones résultants. Cela pourrait bien fonctionner par lui-même si vous n'avez pas d'autres facteurs limitatifs, par exemple. sur l'espacement inter-points minimum, la densité ou quelque chose.

Pour les cas plus compliqués, je créerais un échantillon aléatoire beaucoup plus dense, puis choisirais les points appropriés (quels qu'ils soient) dans une deuxième étape. Quelque chose de similaire pourrait être fait avec l'outil de densification, mais tous les points seraient alors sur les polylignes.

lynxlynxlynx
la source