¿Crear puntos a lo largo de la línea de acuerdo con los datos de atributos usando QGIS?

9

Me gustaría crear puntos equidistantes a lo largo de las líneas en QGIS, pero cada una de mis líneas tiene un atributo de cuántos puntos deben estar en ellas en una columna llamada "pieza" y estos valores son diferentes en casi todos los casos.

ingrese la descripción de la imagen aquí

Mi primer pensamiento fue dividir las líneas en partes iguales de acuerdo con los valores de la tabla de atributos y luego poner puntos en los centroides de las líneas, pero no pude hacerlo.

Esta pregunta es muy similar a lo que me gustaría hacer, pero no es para QGIS:

¿Cómo crear el mismo número de puntos a lo largo de múltiples polilíneas?

La mayoría de las preguntas similares que se pueden encontrar aquí en stackexchange en este tema se refieren a una distancia específica entre puntos, un número que se puede escribir fácilmente en un campo (como en el caso de Crear puntos a lo largo de líneas o Convertir líneas en algoritmos de puntos ) y no sobre datos específicos de una tabla de atributos, que no he podido encontrar cómo usar para tales fines.

Sería fantástico si no hubiera puntos en el punto inicial y final de la línea, pero estaría justo sobre la luna si hubiera tantos puntos en una línea como en su tabla de atributos.

Skye
fuente

Respuestas:

10

Aquí hay un script PyQGIS rápido que debería ser el truco

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

Simplemente cambie el num_pointsnombre del campo y el nombre del archivo de salida para que coincida con sus datos, seleccione la capa de entrada y ejecútelo en la consola de Python.

ndawson
fuente
Por alguna razón, después de copiar este script aparece un mensaje de error: Archivo "<input>", línea 1 longitud = geometry.length () ^ IndentationError: sangría inesperada
Skye
1
ndawson: he editado el formato para que sea más fácil copiar / pegar en la consola de Python, pero puede retroceder si no le gusta =). @Skye - Sugeriría copiar el código en un editor de texto, cambiar el nombre del campo y la ruta de salida y luego copiar el código nuevamente en la consola de Python. Esperemos que ya no haya un error de sangría.
Joseph
1
¡Gracias por los dos! :) ndawson, tu script es brillante y @Joseph, ¡tu edición de formato fue de gran ayuda! Además, resultó que debería haber usado la marca "/" en lugar de "\" en la ruta de salida.
Skye