Message posté par : Alexpiration (alexisqgis(a)gmail.com)
----------------------------------------
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 :)
----------------------------------------
Le message est situé
https://georezo.net/forum/viewtopic.php?pid=334932#p334932
Pour y répondre : qgis_fr(a)ml.georezo.net ou reply de votre messagerie
Pour vous désabonner connectez-vous sur le forum puis Profil / Abonnement
--
Association GeoRezo - le portail géomatique
https://georezo.net