#1 Fri 21 August 2020 12:00
- Alexpiration
- Juste Inscrit !
- Date d'inscription: 21 Aug 2020
- Messages: 1
QGIS/PyQGIS: Nouvelle couche SHP a partir de 2 autres
Bonjour à tous !
Plusieurs jours que je planche sur un script Python me permettant de réaliser une opération qui, avec mes connaissance actuelles du logiciel QGIS, me parait compliqué !
Explication de mon but :
J'ai 2 sources de données :
- La première est une couche de centroïdes, dont chaque centroïdes est associés à une commune de l'Ile de France. Dans la table attributaire de cette couche se trouve le code INSEE associé à la commune ainsi que son nom
- La deuxieme est une base de donnée au format SQLITE contenant des informations concernant divers projets en cours sur des communes. Dans cette base de donnée, on y retrouve le nom du projet, la commune dans laquelle se trouve le projet, le code insee associé à la commune, et divers autres informations.
J'ai d'abord pensé à créer une simple jointure pour faire en sorte de générer un centroïde correspondant à chaque projet associé à sa commune. Cependant, ma table attributaire des centroïdes ne gerent pas les projets qui ont une commune en commun, uniquement un seul projet est rattaché et par conséquent, des projets de ma base de donnée ne sont pas pris en compte.
J'ai donc voulu débloquer cette situation avec mes connaissances en Python et avec PyQGIS.
La démarche de mon script est la suivante :
Faire une boucle sur le champ Code Insee de ma table des centroïdes et dans cette même boucle, faire une autre boucle sur le champ Code Insee de ma base de donnée.
Avec une structure conditionnelle, s'il y a correspondance de Code Insee, je récupère la géométrie du centroïdes correspondant , je récupère également les différents attributs correspondant dans ma base de donnée, et j'ajoute le tous dans une nouvelle couche Shapefile de points.
Cependant je n'arrive à comprendre ou debugger mon script sur la partie structure conditionnelle. A la fin de mon script, j'ai bien ma nouvelle couche Shape avec les champs de ma base de donnée, mais aucune entrée n'est enregistrée dedans, je suppose donc que mon programme ne trouve aucune correspondance de code insee, ce qui n'est pas le cas.
Voici mon script :
Code:
# Create new temporary layer new_layer = QgsVectorLayer("Point", "Suivi_Topo", "memory") # Get 2 layers that want center_layer = QgsProject.instance().mapLayersByName('centroide_commune_idf') center_layer = center_layer[0] suivi_projet_db = QgsProject.instance().mapLayersByName('suivi_projet') suivi_projet_db = suivi_topo_db[0] # Get attributes of each layers center_layer_attr = center_layer.getFeatures() suivi_topo_db_attr = suivi_topo_db.getFeatures() # Add Fields of db in the new layer suivi_topo_field = suivi_topo_db.fields() new_layer_co = new_layer.dataProvider() new_layer_co.addAttributes(suivi_topo_field) new_layer.updateFields() # Loop in each features, if same attrs, add features for center_feature in center_layer_attr: # get geometry of the feature geom_center = center_feature.geometry() for db_feature in suivi_topo_db_attr: if db_feature.attribute('insee') == center_feature.attribute('code_insee'): db_feature_lst = db_feature.attributes() new_feature = QgsFeature() new_feature.setGeometry(geom_center) new_feature.setAttributes(db_feature_lst) new_layer_co.addFeature(new_feature) new_layer.updateExtents() QgsProject.instance().addMapLayer(new_layer)
En vous remerciant tous d'avance pour votre contribution
Hors ligne
#2 Fri 21 August 2020 13:11
- SANTANNA
- Moderateur
- Lieu: Angers
- Date d'inscription: 18 Jan 2008
- Messages: 3944
Re: QGIS/PyQGIS: Nouvelle couche SHP a partir de 2 autres
Bonjour,
Il me semble qu'il manque le paragraphe qui explique ce que vous souhaitez obtenir, avant vos tentatives: connaître la commune depuis la table projet ou connaître pour la commune, tous ses projets?
Autrement, regardez du côté des relations ...
Hors ligne