Conectando pontos por linhas usando o QGIS?

9

Eu tenho um arquivo .shp, onde quero conectar todos os pontos (aproximadamente 100) por linhas. Eu tenho um campo de dados com a ordem (ou seja, 1, 2, 3, ...).

Eu tentei o PointConnector e o Points2One, talvez eu esteja usando-os incorretamente, mas não consigo obter resultados.

Nas minhas pesquisas, encontrei menção dos pontos do plug-in para caminhos, mas isso parece ter desaparecido?

Estou usando o QGIS 2.6.1

Magnus
fonte

Respostas:

8

Primeiro, você ainda pode usar o PointsToPaths-Plugin ( https://plugins.qgis.org/plugins/pointstopaths_v02/ ). Talvez você precise ativar a opção "Mostrar também plugins experimentais" em Plugins> Gerenciar e instalar plug-ins (Gerenciador de plug-ins)> Configurações.

Segundo, verifique se o seu campo de dados com o pedido possui um tipo numérico (por exemplo, número inteiro, ...)

Tentei criar linhas a partir de uma forma de ponto com minha versão QGIS (2.0.1) e estava tudo bem. Aqui está uma captura de tela:insira a descrição da imagem aqui

Talvez isso ajude!

Captura de tela com os resultados da forma test_coords: insira a descrição da imagem aqui

anja
fonte
Obrigado - agora pelo menos encontrei e instalei o PointsToPaths, mas nenhuma combinação do campo Grupo de pontos e do campo Ordem de pontos parece gerar dados, que campos são necessários aqui?
Magnus
Para o "Campo do grupo de pontos", você tem duas opções: você pode usar um campo existente ou criar um novo campo com a calculadora de campos (tipo de sequência). Caso esteja criando um novo campo, você deve escrever um texto padrão na coluna. Se você deixar "NULL", você receberá um erro. Para o "campo Ordem dos pontos", você pode usar o seu "campo ordem" com os números de série (1,2,3, ...). Certifique-se de que este seja um campo numérico! De qualquer forma, se você ainda tiver problemas, poste seu arquivo de forma e eu tentarei com seus dados.
Anja
Obrigado. Eu tentei usar os campos texto e número inteiro para "Campo do grupo de pontos" e números inteiros para o "Campo da ordem dos pontos" combinados com diferentes valores (e em branco) do "Período de intervalo" sem êxito. Em anexo está o .shp com o qual testo
Magnus
Testei-o com seu arquivo de formas e encontrei o problema. O "campo Ordem dos pontos" combina apenas os pontos com o mesmo "texto" no campo do grupo. Anexei uma captura de tela com os resultados à resposta acima.
anja
Ah, então eu preciso adicionar um campo com o mesmo texto para todos os pontos?
Magnus
5

O MMQGISplug-in tem uma entrada de menu Create -> Hub Lines. Isso deve fazer o que você quiser.

Ele precisa de duas camadas (início e destino), portanto, talvez você precise adicionar sua camada de pontos duas vezes à tela.

AndreJ
fonte
Perfeito, meu teste de pequena escala parece funcionar - eu só preciso de dois atributos diferentes, criei um número e número + 1 campo e os utilizo como para e de.
Magnus
4

Uma abordagem básica seria:

  1. crie um gravador de vetor para um novo shapefile (consulte Livro de receitas , seção "Escrevendo camadas de vetor", segundo exemplo) como (multi) linha / polígono ou o que for necessário (consulte enumerações )
  2. carregue sua camada de pontos de iface.legendInterface().layers()
  3. percorra seus pontos e adicione o recurso de geometria em sua nova forma

€: apenas por diversão:

from PyQt4.QtCore import *

# easy 2 config vars
myPath = "/media/ymirsson/MyData/GIS/tmp/"
myPts = "test_coords.shp"
myLines = "test_lines.shp"
sortField = "No"
myCRS = "25832"

# load the points layer
myPtsLayer = QgsVectorLayer(myPath + myPts, "My Points", "ogr")

# field def. 4 lines-layer
fields = QgsFields()
fields.append(QgsField("id", QVariant.Int))
fields.append(QgsField("name", QVariant.String))

# create writer
writer = QgsVectorFileWriter(myPath + myLines, "utf-8", fields, QGis.WKBLineString, QgsCoordinateReferenceSystem(int(myCRS), QgsCoordinateReferenceSystem.EpsgCrsId), "ESRI Shapefile")

if writer.hasError() == QgsVectorFileWriter.NoError:
    # featureobject to list
    features = myPtsLayer.getFeatures()
    Points=([])
    for feature in features:
        geom = feature.geometry().asPoint()
        sortID = feature.attributes()[myPtsLayer.fieldNameIndex(sortField)]
        Points.append([sortID,geom])
    Points.sort()

    # create lines
    for i in range(1,len(Points)):
        Line = QgsFeature()
        Line.setGeometry(QgsGeometry.fromPolyline([Points[i-1][1], Points[i][1]]))
        Line.setAttributes([i,str(Points[i-1][0]) + " to " + str(Points[i][0])])
        writer.addFeature(Line)
    # don't forget the last one -.-
    Line = QgsFeature()
    Line.setGeometry(QgsGeometry.fromPolyline([Points[len(Points)-1][1], Points[0][1]]))
    Line.setAttributes([len(Points),str(Points[len(Points)-1][0]) + " to " + str(Points[0][0])])
    writer.addFeature(Line)

# flush 2 disk
del writer

# load both layers into qgis-project
QgsMapLayerRegistry.instance().addMapLayer(myPtsLayer)
QgsMapLayerRegistry.instance().addMapLayer(QgsVectorLayer(myPath + myLines, "My Lines", "ogr"))

print "Done .. "
ymirsson
fonte
Desculpe - eu não sou um usuário avançado e você me perdeu na primeira etapa. Você poderia elaborar ou sugerir uma abordagem mais simples?
Magnus
Vejo que você tem uma solução mais simples - mas eu escrevi um pequeno script .. just4fun;)
ymirsson