Criando uma camada de linha que vincula muitos pontos na camada a um ponto em outra camada?

9

Digamos que exista a camada de pontos A com 300 pontos e a camada de pontos B com um ponto

Como criar uma camada de linha que conecta todos os pontos da camada A ao ponto da camada B?

Usando QGIS e / ou PostGIS.

Luffydude
fonte
tente usar a função st_makeline
Ziggy
@ziggy estava tentando fazer exatamente isso, mas a documentação não é muito clara e não há nenhum exemplo com geometrias de diferentes tabelas
Luffydude
Ive nunca utilizou esta função, mas imagino que seria algo como isto: selecionar t1.columns etc, t2.columns etc .. st_makeline (t1.geom, t2.geom) a partir de T1, T2
Ziggy
@ziggy recebendo erro de sintaxe nos suportes quando eu tentei select id, geom como st_makeline (a.geom, b.geom),
Luffydude
postar toda a sua consulta
ziggy 30/03

Respostas:

4

No QGIS, você pode usar o plug-in Connect Points, do qual você pode baixar:

Plugins > Manage and Install Plugins...

Exemplo:

  1. Aqui estão algumas camadas, layer_Atem vários pontos; layer_Btem um. Certifique-se de que as duas camadas contenham um campo inteiro em que os valores sejam exatamente os mesmos (por exemplo, ambas as minhas camadas têm um idcampo em que todos os valores são 1). O plugin usa isso para conectar seus pontos. Quando o seu plugin estiver ativado, vá para as configurações:

    Interface


  1. Selecione as opções:

    Definições


  1. Resultado:

    Resultado


Observe que este plug-in é experimental, portanto, você precisará habilitar a Show also experimental pluginsopção (graças a @blue_chip ):

Plugins > Manage and Install Plugins > Settings
Joseph
fonte
2
Não sei por que minha edição foi excluída, mas mesmo assim, caso você não a tenha lido: uau, pessoal, algumas respostas bem variadas aqui. Um Python, um plugin e um Postgis. Dar o visto ao plug-in, pois ele é o mais amigável ao GIS e também por causa da carinha sorridente. Obrigado a todos!
30517 Luffydude
@Luffydude - Sua edição provavelmente foi excluída porque não adicionou muito à sua pergunta geral, mas você está certo, respostas muito diferentes! :)
Joseph
1
Você precisa habilitar plugins experimentais para encontrar este. Eu tive que parecer um pouco mais até que me ocorreu. Plugins> Configurações> Check Mostrar também plugins experimentais
blue_chip 4/17/17
@blue_chip - Desculpas, eu deveria ter mencionado isso. Será que editar isso em :) #
Joseph
3

se as duas camadas são pontos, a consulta abaixo deve funcionar, basta conectar seus próprios dados. Eu fiz um teste com a criação de linhas a partir de 1 camada com mais de 150 linhas de pontos e uma camada com 1 ponto

drop table if exists line;
create table line as
select layer1.id ,st_makeline(layer1.geom,point.geom) as geom from layer1,point

insira a descrição da imagem aqui

ziggy
fonte
3

Supondo que você comece com essa situação (uma camada de pontos com um recurso e uma camada de pontos com 300 recursos):

insira a descrição da imagem aqui

você pode executar esse código no Python Console (depois de carregar as duas camadas de interesse no QGIS):

from qgis.core import *
from qgis.PyQt.QtCore import QVariant

layer1 = QgsMapLayerRegistry.instance().mapLayersByName('1point')[0]
crs = layer1.crs().toWkt()
layer2 = QgsMapLayerRegistry.instance().mapLayersByName('300points')[0]

outLayer = QgsVectorLayer('Linestring?crs='+ crs, 'line_output' , 'memory')
prov = outLayer.dataProvider()
fields = layer1.pendingFields()
for field in layer2.pendingFields():
    fields.append(field)
prov.addAttributes(fields)
outLayer.updateFields()

for feature in layer1.getFeatures():
    coords = feature.geometry().asPoint()
    attr1 = feature.attributes()

    for feat in layer2.getFeatures():
        seg_start = coords
        seg_end = feat.geometry().asPoint()
        attr2 = feat.attributes()
        attrs = attr1 + attr2
        outGeom = QgsFeature()
        outGeom.setGeometry(QgsGeometry.fromPolyline([seg_start, seg_end]))
        outGeom.setAttributes(attrs)
        prov.addFeatures([outGeom])

QgsMapLayerRegistry.instance().addMapLayer(outLayer)

para obter este resultado:

insira a descrição da imagem aqui

Você só precisa adaptar os nomes das camadas ( '1point'e '300points') aos nomes com os quais elas são carregadas no painel Camadas .

Minha abordagem funcionará independentemente do número de recursos em ambas as camadas.

mgri
fonte