10 votos

¿Cómo crear puntos a lo largo de una línea según los datos de atributo en QGIS?

Me gustaría crear puntos equidistantes a lo largo de líneas en el 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.

enter image description here

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 centros de las líneas, pero no pude hacerlo.

Esta pregunta es muy similar a la 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 el intercambio de apuestas 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 las líneas o Convertir las líneas en puntos algoritmos) y no sobre datos específicos de una tabla de atributos, que no he podido encontrar cómo utilizar para tales fines.

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

11voto

John Feminella Puntos 123

Aquí hay un rápido PyQGIS script que debería funcionar

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

Sólo hay que cambiar el num_points nombre del campo y el nombre del archivo de salida para que coincidan con sus datos, seleccione la capa de entrada y ejecútela en la consola de python.

0 votos

Por alguna razón, después de copiar este script aparece un mensaje de error: Archivo "<input>", línea 1 length = geometry.length() ^ IndentationError: unexpected indent

1 votos

ndawson - He editado el formato para que sea más fácil copiar/pegar en la consola de python, pero siéntete libre de retroceder si no te gusta =). @Skye - Yo 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 de nuevo en la consola de python. Con suerte ya no debería haber un error de indentación.

1 votos

¡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 utilizado la marca " / " en lugar de " \ " en la ruta de salida.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X