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.
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.
Respostas:
No QGIS, você pode usar o plug-in Connect Points, do qual você pode baixar:
Plugins > Manage and Install Plugins...
Exemplo:
Aqui estão algumas camadas, layer_A
tem vários pontos; layer_B
tem 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 id
campo 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:
Observe que este plug-in é experimental, portanto, você precisará habilitar a Show also experimental plugins
opção (graças a @blue_chip ):
Plugins > Manage and Install Plugins > Settings
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
Supondo que você comece com essa situação (uma camada de pontos com um recurso e uma camada de pontos com 300 recursos):
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:
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.