Digamos que hay una capa de puntos A con 300 puntos y una capa de puntos B con un punto
¿Cómo crear una capa de línea que conecte todos los puntos de la capa A al punto de la capa B?
Usando QGIS y / o PostGIS.
Digamos que hay una capa de puntos A con 300 puntos y una capa de puntos B con un punto
¿Cómo crear una capa de línea que conecte todos los puntos de la capa A al punto de la capa B?
Usando QGIS y / o PostGIS.
Respuestas:
En QGIS, puede usar el complemento Connect Points que puede descargar desde:
Plugins > Manage and Install Plugins...
Ejemplo:
Aquí hay un par de capas, layer_A
tiene un montón de puntos; layer_B
Tiene uno. Asegúrese de que ambas capas contengan un campo entero donde los valores sean exactamente iguales (por ejemplo, mis dos capas tienen un id
campo donde están todos los valores 1
). El complemento usa esto para conectar sus puntos. Cuando su complemento esté habilitado, vaya a su configuración:
Tenga en cuenta que este complemento es experimental, por lo que deberá habilitar la Show also experimental plugins
opción (gracias a @blue_chip ):
Plugins > Manage and Install Plugins > Settings
Si ambas capas son puntos, esta consulta a continuación debería funcionar, solo conecte sus propios datos. Hice una prueba con la creación de líneas a partir de 1 capa con más de 150 filas de puntos y una capa con 1 punto
drop table if exists line;
create table line as
select layer1.id ,st_makeline(layer1.geom,point.geom) as geom from layer1,point
Suponiendo que comience desde esta situación (una capa de puntos con una entidad y una capa de puntos con 300 entidades):
puede ejecutar este código desde la Consola Python (después de haber cargado las dos capas de interés en 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 obtener este resultado:
Solo necesita adaptar los nombres de las capas ( '1point'
y '300points'
) a los nombres con los que se cargan en el Panel de capas .
Mi enfoque funcionará independientemente del número de características en ambas capas.