Disons qu'il y a la couche de points A avec 300 points et la couche de points B avec un point
Comment créer un calque de ligne qui relie tous les points du calque A au seul point du calque B?
Utilisation de QGIS et / ou PostGIS.
Disons qu'il y a la couche de points A avec 300 points et la couche de points B avec un point
Comment créer un calque de ligne qui relie tous les points du calque A au seul point du calque B?
Utilisation de QGIS et / ou PostGIS.
Réponses:
Dans QGIS, vous pouvez utiliser le plug-in Connect Points que vous pouvez télécharger à partir de:
Plugins > Manage and Install Plugins...
Exemple:
Voici quelques couches, layer_Aa un tas de points; layer_Ben a un. Assurez-vous que les deux couches contiennent un champ entier où les valeurs sont exactement les mêmes (par exemple, mes deux couches ont un idchamp où toutes les valeurs sont 1). Le plugin l'utilise pour connecter vos points. Lorsque votre plugin est activé, accédez à ses paramètres:
Notez que ce plugin est expérimental, vous devrez donc activer l' Show also experimental pluginsoption (grâce à @blue_chip ):
Plugins > Manage and Install Plugins > Settings
si vos deux couches sont des points, cette requête ci-dessous devrait fonctionner, il suffit de brancher vos propres données. J'ai fait un test avec la création de lignes à partir d'une couche avec plus de 150 lignes de points et une couche avec 1 point
drop table if exists line;
create table line as
select layer1.id ,st_makeline(layer1.geom,point.geom) as geom from layer1,point
En supposant de partir de cette situation (une couche de points avec une entité et une couche de points avec 300 entités):
vous pouvez exécuter ce code à partir de la console Python (après avoir chargé les deux couches d'intérêt dans 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)
pour obtenir ce résultat:
Il vous suffit d'adapter les noms des calques ( '1point'et '300points') aux noms avec lesquels ils sont chargés dans le panneau Calques .
Mon approche fonctionnera indépendamment du nombre d'entités dans les deux couches.