Suite

Génération de lignes d'un polygone à un groupe de polygones (réseau un-à-plusieurs) à l'aide de QGIS

Génération de lignes d'un polygone à un groupe de polygones (réseau un-à-plusieurs) à l'aide de QGIS


J'ai une couche de polygones où chaque polygone a un unique"IDENTIFIANT", et une autre couche de polygones où ces uniques"IDENTIFIANT"s peut être trouvé dans une colonne dans une relation un-à-plusieurs.

J'aimerais que QGIS trace des lignes entre les polygones de la première couche et les polygones de la deuxième couche d'une manière qui reflète la relation un à plusieurs.

Des conseils sur les outils ?


Supposons qu'il y ait deux couches de polygones"poly_unique"(orange) et"poly_groupes"(vert), avec ses tables d'attributs correspondantes en conséquence, voir l'image ci-dessous.

Procéder àPlugins > Console Python > Afficher l'éditeuret collez le script ci-dessous

# fonction qui convertit une chaîne en une liste def to_list(var): output = var.split(",") if isinstance(var,str) else ["] return output # fonction qui convertit un entier en une chaîne def to_string( var): output = str(var) if isinstance(var,int) else" return output # accédant à deux couches avec des entités surfaciques par leurs noms poly_from = QgsProject.instance().mapLayersByName("poly_unique")[0] poly_to = QgsProject .instance().mapLayersByName("poly_groups")[0] # attributs définissant qui établissent des relations entre deux couches attr_unique = 'id' # attribut avec ID unique, existe dans les deux couches de polygones attr_group = 'Connect' # attribut qui montre celui -to-many relations # création d'une couche de sortie virtuelle avec des chaînes de lignes line_layer = QgsVectorLayer("LineString?crs={}&index=yes".format(poly_from.crs().authid()), "Spider", "memory" ) # ajout de champs pour la couche de sortie virtuelle provider = line_layer.dataProvider() provider.addAttributes([QgsField("from", QVariant.String), QgsField("to", QVarian t.String)]) line_layer.updateFields() # boucle sur chaque entité à partir de deux couches et fait toutes les connexions possibles entre elles pour f1 dans poly_from.getFeatures() : # boucle sur les polygones d'origine pour f2 dans poly_to.getFeatures() : # boucle sur les polygones de destination if to_string(f1[attr_unique]) in to_list(f2[attr_group]): # la condition vérifie si l'identifiant unique est dans une colonne avec des relations connect = [f1.geometry().centroid().asPoint(), f2.geometry().centroid().asPoint()] # connexion entre deux points line = QgsGeometry.fromPolylineXY(connect) # création d'une chaîne de ligne à partir de la connexion f = QgsFeature() # création d'une fonction Qgs f.setGeometry(line) # définition de la nouvelle géométrie en tant que chaîne de ligne f.setAttributes([f1[attr_unique], f2[attr_unique]]) # définition de nouveaux attributs depuis et vers provider.addFeature(f) # ajout de la fonctionnalité Qgis à la couche de sortie # ajout de la sortie virtuelle couche à la carte QgsProject.instance().addMapLayer(line_layer)

presseScript de lancement et obtenez la sortie qui ressemblera à


Les références:


Voir la vidéo: GeoMYTNMAC QGIS 48 Polygones vers lignes. Générer une couche de lignes à partir des polygones.