¿Crear puntos aleatorios a lo largo de la polilínea en QGIS?

11

Estoy tratando de crear puntos aleatorios a lo largo de un archivo de forma de polilínea en QGIS. Básicamente, como la herramienta 'puntos aleatorios' en 'herramientas de investigación' pero para polilíneas en lugar de polígonos.

Intenté convertir el archivo de línea en un archivo de forma de polígono, pero llena algunas áreas con polígonos, mientras que otras áreas siguen siendo polígonos de tipo línea larga.

Soy bastante nuevo en QGIS y no estoy realmente familiarizado con el código Python.

Cec.g
fuente
Si está dispuesto a entrar en R, el paquete spatstat tiene herramientas para crear puntos aleatorios en las líneas.
Micha
Gracias por el codigo. Me preguntaba si alguien podría ayudarme a modificarlo para que coloque puntos en la línea a intervalos regulares con un inicio aleatorio. Podria ser muy apreciado. No tengo conocimiento práctico de Python.

Respuestas:

14

Este código funcionará en la última versión de desarrollo 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)

Sé que dijiste que no estás muy familiarizado con el código de Python, pero deberías poder ejecutar esto de manera bastante fácil. Copie el código anterior en un archivo (se llama el mío locate.py) y colóquelo en su ~/.qgis/pythonsi está en Windows 7 que estará C:\Users\{your user name}\.qgis\python\en Windows XPC:\Documents and Settings\{your user name}\.qgis\python\

Una vez que el archivo esté en la carpeta de Python, abra QGIS y seleccione algunos objetos de línea.
Selección de capa

Luego abra la consola de Python y ejecute el siguiente código:

import locate.py 
locate.createRandomPoints(10)

Consola Python

El resultado debería verse así

Resultados

Si desea ejecutarlo nuevamente, simplemente seleccione algunas líneas más y locate.createRandomPoints(10)vuelva a ejecutarlo en la consola de Python.

Nota: localizar.createRandomPoints (10) el 10 aquí es el número de puntos a generar por línea

Nathan W
fuente
¡Gracias por toda tu ayuda! Sin embargo, no estoy seguro de en qué formato guardar el código: ¿cómo puedo convertirlo en un archivo con una extensión py? Lo siento si estas son preguntas bastante básicas.
Cec.g
Copie el texto en un archivo de texto normal y guárdelo con .py como extensión.
Nathan W
Intenté eso, pero aparece este error: ImportError: ningún módulo llamado Locate.py
Cec.g
Esta es la ruta del archivo: C: \ Users \ Cecily \ .qgis \ python
Cec.g
¿ import locateno usaste la necesidad de .py en la consola de Python?
Nathan W
3

Puede amortiguar las polilíneas (mínimamente) y luego ejecutar el muestreo en los polígonos resultantes. Podría funcionar bien por sí solo si no tiene otros factores limitantes, por ejemplo. en espacio mínimo entre puntos, densidad o somesuch.

Para casos más complicados, crearía una muestra aleatoria mucho más densa y luego elegiría los puntos apropiados (lo que sea que sea) en un segundo paso. Algo similar podría hacerse con la herramienta densificar, pero todos los puntos estarían en las polilíneas.

lynxlynxlynx
fuente