¿Crear una capa de línea que vincule muchos puntos en la capa a un punto en otra capa?

9

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.

Luffydude
fuente
intente usar la función st_makeline
ziggy
@ziggy estaba tratando de hacer eso, pero la documentación no es muy clara y no hay ejemplos con geometrías de diferentes tablas
Luffydude,
Nunca he utilizado esta función, pero me imagino que sería algo como esto: seleccione t1.columns etc, etc .. t2.columns st_makeline (t1.geom, t2.geom) de t1, t2
Ziggy
@ziggy obteniendo un error de sintaxis en los corchetes cuando intenté seleccionar id, geom como st_makeline (a.geom, b.geom),
Luffydude
publique toda su consulta
ziggy

Respuestas:

4

En QGIS, puede usar el complemento Connect Points que puede descargar desde:

Plugins > Manage and Install Plugins...

Ejemplo:

  1. Aquí hay un par de capas, layer_Atiene un montón de puntos; layer_BTiene uno. Asegúrese de que ambas capas contengan un campo entero donde los valores sean exactamente iguales (por ejemplo, mis dos capas tienen un idcampo 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:

    Interfaz


  1. Selecciona las opciones:

    Configuraciones


  1. Resultado:

    Resultado


Tenga en cuenta que este complemento es experimental, por lo que deberá habilitar la Show also experimental pluginsopción (gracias a @blue_chip ):

Plugins > Manage and Install Plugins > Settings
José
fuente
2
No estoy seguro de por qué se eliminó mi edición, pero de todos modos en caso de que no la haya leído: wow, chicos, algunas respuestas bastante variadas aquí. Un Python, un complemento y un Postgis. Dando la marca al complemento ya que es el novato más SIG amigable y también por la cara sonriente. ¡Gracias a todos!
Luffydude
@Luffydude: su edición probablemente se eliminó porque no agregó mucho a su pregunta general, pero tiene razón, ¡respuestas muy diferentes! :)
Joseph
1
Debe habilitar complementos experimentales para encontrar este. Tuve que mirar un poco más hasta que me di cuenta. Complementos> Configuración> Comprobar Mostrar también complementos experimentales
blue_chip
@blue_chip - Disculpas, debería haber mencionado eso. Lo editaré en :)
Joseph
3

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

ingrese la descripción de la imagen aquí

ziggy
fuente
3

Suponiendo que comience desde esta situación (una capa de puntos con una entidad y una capa de puntos con 300 entidades):

ingrese la descripción de la imagen aquí

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:

ingrese la descripción de la imagen aquí

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.

mgri
fuente