Criando pontos ao longo da linha de acordo com os dados do atributo usando o QGIS?

9

Eu gostaria de criar pontos equidistantes ao longo das linhas no QGIS, mas cada uma das minhas linhas tem um atributo de quantos pontos devem estar neles em uma coluna chamada "peça" e esses valores são diferentes em quase todos os casos.

insira a descrição da imagem aqui

Meu primeiro pensamento foi dividir linhas em partes iguais de acordo com os valores na tabela de atributos e depois colocar pontos nos centróides das linhas, mas não consegui.

Esta pergunta é muito parecida com o que eu gostaria de fazer, mas não é para o QGIS:

Como criar o mesmo número de pontos ao longo de várias polilinhas?

As perguntas mais semelhantes que podem ser encontradas aqui na stackexchange neste tópico são sobre uma distância específica entre pontos, um número que pode ser facilmente digitado em um campo (como no caso dos algoritmos Criar pontos ao longo das linhas ou Converter linhas em pontos ) e não sobre dados específicos de uma tabela de atributos, que não consegui descobrir como usar para tais fins.

Seria fantástico se não houvesse pontos no ponto inicial e final da linha, mas eu estaria do outro lado da lua se houvesse tantos pontos em uma linha quanto em sua tabela de atributos.

Skye
fonte

Respostas:

10

Aqui está um rápido script PyQGIS que deve fazer o truque

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

Apenas altere o num_pointsnome do campo e o nome do arquivo de saída para corresponder aos seus dados, selecione a camada de entrada e execute-a no console python.

ndawson
fonte
Por alguma razão, depois de copiar este script uma mensagem de erro aparece: Arquivo "<input>", a linha de comprimento 1 = geometry.length () ^ IndentationError: travessão inesperado
Skye
1
ndawson - editei a formatação para facilitar a copiar / colar no console python, mas fique à vontade para reverter se você não gostar =). @ Skye - sugiro copiar o código em um editor de texto, alterar o nome do campo e o caminho de saída e, em seguida, copiar o código novamente no console do python. Espero que não deva haver mais um erro de indentação.
Joseph
1
Obrigado por vocês dois !! :) ndawson, seu script é brilhante e @ Joseph, sua edição de formatação foi uma grande ajuda! Além disso, descobriu-se que eu deveria ter usado a marca "/" em vez de "\" no caminho de saída.
Skye