#1 Wed 10 June 2015 15:24
- LKIWI
- Juste Inscrit !
- Date d'inscription: 10 Jun 2015
- Messages: 6
QGIS : probleme avec code python intersection
bonjour,
je viens à vous, grand peuple des forums pour me délivrer d'un probleme dont je ne peux me soustraire. En effet il s'agit juste d'un simple code python dans qgis qui à pour but de selectionner dans une premiere couche adresse2015 (à jour) toutes les adresses qui ont comme type d'occupation 'Logement', ensuite récupérer cette selection faire l'intersection avec une couche ADRESSE_RIL et enfin l'afficher ou la sauvegarder (peu importe).
voici le code:
Code:
# -*-coding: utf8 -*- import os #importer la librairie os import sys #importer la librairie du systeme (sys) from osgeo import ogr # importer la librairie ogr import processing #importer l'ensemble des algorithmes #on charge la couche adresse à jour layer1 = iface.addVectorLayer("H://SIG/RIL/Nouveau dossier/adresse20150201.shp", "adresse2015", "ogr") #on demande de selectionner dans la table que les adresses ayant dans leur type d'occupation le mot "Logement" for f in layer1.getFeatures(): print f['TYPE_D_OCC' is '%Logement%'] # on recupere la selection (variable f) dans une autre couche layer1 layer1=f #on charge la couche RIL avec laquelle on va faire l'intersection layer2= iface.addVectorLayer("H://SIG/RIL/Nouveau dossier/ADRESSE_RIL_2015.shp", "ADRESSE_RIL_2015", "ogr") #on demande de faire l'intersection entre la selection(layer1 ou f) et la couche RIL et on affiche la couche_intersection processing.runandload('qgis:intersection',layer1, layer2, "memory:couche_intersection") layer = QgsMapLayerRegistry.instance().mapLayersByName("memory:couche_intersection") print layer
il ne m'affiche que les deux premieres couches et non la couche_intersection.
voici le message d'erreur:
Code:
Error: Wrong parameter value: []
Hors ligne
#2 Thu 11 June 2015 14:21
- SANTANNA
- Moderateur
- Lieu: Angers
- Date d'inscription: 18 Jan 2008
- Messages: 3895
Re: QGIS : probleme avec code python intersection
Bonjour,
L'erreur indique un mauvais paramètre et comme les paramètres attendus sont essentiellement des couches, c'est que l'une d'elles ne l'est pas.
Perso, ce que je fais souvent, c'est d'exécuter mes codes dans la console python de QGIS pas à pas pour voir ce qui est renvoyé.
Et dans le code proposé, layer1 ne renvoie pas une couche à la sortie mais une entité (la dernière parcourue dans la boucle). print ne fait qu'imprimer/afficher les évènements, il ne sélectionne pas les entités.
Essaie en remplaçant
Code:
#on demande de selectionner dans la table que les adresses ayant dans leur type d'occupation le mot "Logement" for f in layer1.getFeatures(): print f['TYPE_D_OCC' is '%Logement%'] # on recupere la selection (variable f) dans une autre couche layer1 layer1=f
par
Code:
layer1.setSelectedFeatures([]) # pour s'assurer d'avoir une sélection vide au départ for feature in layer1.getFeatures(): # chaque entité de la couche if 'Logement' in feature['TYPE_D_OCC'] : # dont le champ occupation contient 'Logement' layer1.select(feature.id()) # est ajoutée à la sélection
Ce code sélectionne directement dans la couche les entités dont le type d'occupation contient 'Logement'. Ça devrait marcher.
plus d'infos par ici
Dernière modification par SANTANNA (Thu 11 June 2015 14:23)
Hors ligne
#3 Fri 12 June 2015 11:43
- LKIWI
- Juste Inscrit !
- Date d'inscription: 10 Jun 2015
- Messages: 6
Re: QGIS : probleme avec code python intersection
Je te remercie SATANNA, mon problème de sélection est résolu sauf que je ne sais pas comment récupérer la sélection de layer1 pour la faire intersecter avec layer2.
Hors ligne
#4 Fri 12 June 2015 12:20
- SANTANNA
- Moderateur
- Lieu: Angers
- Date d'inscription: 18 Jan 2008
- Messages: 3895
Re: QGIS : probleme avec code python intersection
Bonjour,
As-tu essayé d'exécuter le nouveau code?
Par défaut, les algorithmes de Traitement, sauf erreur de ma part, fonctionnent sur les entités sélectionnées dans la couche et s'il n'y a pas de sélection, sur toute la couche. il suffit donc de sélectionner les entités qui t'intéressent (ce que fait le bout de code proposé) et appliquer le même code d'intersection entre sur les couches layer1 et layer2. Pas besoin de récupérer ailleurs rien que les entités sélectionnées.
Hors ligne
#5 Mon 15 June 2015 10:17
- LKIWI
- Juste Inscrit !
- Date d'inscription: 10 Jun 2015
- Messages: 6
Re: QGIS : probleme avec code python intersection
Bonjour SANTANNA,
oui j'ai bien exécuter le nouveau code, mais j'ai effectuer quelques modifications :
Code:
# -*-coding: utf8 -*- import os #importer la librairie os import sys #importer la librairie du systeme (sys) from osgeo import ogr # importer la librairie ogr import processing #importer l'ensemble des algorithmes from qgis.core import * from qgis.gui import * #on charge la couche adresse à jour layer1 = iface.addVectorLayer("H:\SIG\Bases adresses\Shapefiles/adresse20150201.shp", "adresse2015", "ogr") def select_attr (layer1): layer1.setSelectedFeatures([]) # pour s'assurer d'avoir une sélection vide au départ for feature in layer1.getFeatures(): # chaque entité de la couche if 'Logement' in feature['TYPE_D_OCC'] : # dont le champ occupation contient 'Logement' layer1= feature.geometry()# est ajoutée à la sélection #on charge la couche RIL avec laquelle on va faire l'intersection layer2= iface.addVectorLayer("H:\SIG\Bases adresses\Shapefiles/ADRESSE_RIL_2015.shp", "ADRESSE_RIL_2015", "ogr") from qgis.analysis import * #importe les deux libraires d'analyse (couche et geometry) overlayAnalyzer = QgsOverlayAnalyzer() overlayAnalyzer.intersection(layer1, layer2, r"H:\SIG\Bases adresses\Shapefiles\intersection.shp",false) # false pour qu'il retourne que l'intersection avec les géometries selectionnées layer3= iface.addVectorLayer("H:\SIG\Bases adresses\Shapefiles/intersection.shp", "intersection", "ogr")
le script s’exécute normalement (sans message d'erreur) mais j'obtiens une table avec que les entêtes de colonne.
Merci
Hors ligne
#6 Mon 15 June 2015 12:25
- SANTANNA
- Moderateur
- Lieu: Angers
- Date d'inscription: 18 Jan 2008
- Messages: 3895
Re: QGIS : probleme avec code python intersection
Bonjour,
oui j'ai bien exécuter le nouveau code,
en intégrant juste les modifs proposées, il a marché ou pas? Et si ça n'a pas marché, qu'est-ce qui est renvoyé comme erreur ou résultat?
Ensuite, pourquoi avoir changé aussi "radicalement" le code? L'objectif a atteindre a-t-il changé? Parce qu'avec les propositions de modification apportées à ton premier code, j'obtiens de mon coté le résultat attendu. Pourquoi donc ce choix de repartir sur d'autres fonctions?
Enfin, quelques règles sous Python :
- les "import ..." et "from ... import ..." doivent préférentiellement être au début de ton code; et il n'est pas forcément nécessaire d'importer toutes les bibliothèques possibles (je pense que dans le lot, il y en a qqs uns qui ne sont pas nécessaires pour ton analyse)
- si ce bout de code ne fait pas partie d'un ensemble de traitement avec d'autres fonctions, il n'est pas vraiment nécessaire de définir une fonction. Mais ta fonction définie ne sélectionne pas non plus toutes les entités "Logement"...
- Si tu veux récupérer le résultat d'une fonction, il te faut utiliser un "return" dans ta fonction
Hors ligne
#7 Mon 15 June 2015 13:49
- LKIWI
- Juste Inscrit !
- Date d'inscription: 10 Jun 2015
- Messages: 6
Re: QGIS : probleme avec code python intersection
En fait lorsque je lance le code, il y a:
-chargement de la 1ere couche
- selection du type d'occupation 'logement'
et ERREUR
Code:
Traceback (most recent call last): File "<input>", line 1, in <module> File "c:/users/LKIWI/appdata/local/temp/tmp4ov0qz.py", line 11, in <module> if 'Logement' in feature['TYPE_D_OCC'] : # dont le champ occupation contient 'Logement' TypeError: argument of type 'QPyNullVariant' is not iterable
Toutes les autres instructions ne sont pas exécutés.
Hors ligne
#8 Mon 15 June 2015 14:37
- SANTANNA
- Moderateur
- Lieu: Angers
- Date d'inscription: 18 Jan 2008
- Messages: 3895
Re: QGIS : probleme avec code python intersection
ok, c'est parce que lors du parcours de la table, certaines entités n'ont pas de type d'occupation de renseigné (valeur NULL) donc comparaison impossible. La boucle "bug" donc s'arrête. On va donc ignorer les cas de valeur nulle. En décomposé, ça donnerait quelque chose comme ceci...
Code:
layer1.setSelectedFeatures([]) # pour s'assurer d'avoir une sélection vide au départ for feature in layer1.getFeatures(): # chaque entité de la couche if feature['TYPE_D_OCC'] <> NULL: dont le champ occupation est non nulle if 'Logement' in feature['TYPE_D_OCC'] : # et contient le texte 'Logement' layer1.select(feature.id()) # est ajoutée à la sélection
Hors ligne
#9 Mon 15 June 2015 17:19
- LKIWI
- Juste Inscrit !
- Date d'inscription: 10 Jun 2015
- Messages: 6
Re: QGIS : probleme avec code python intersection
Merci SANTANNA le code passe , mais je ,'ai toujours pas d'entité dans la couche résultante de l'intersection mais je sais d'où vient le problème. En fait les deux couches vu à une très grande échelle ne se superposent pas quelques cm voire de distance donc aucune intersection. Je dois donc faire un BUFFER qui devra intersecter le point le plus proche sans oublié de rajouter des contraintes d'identifiant d'adresse.
merci pour tout :-D
Hors ligne
#10 Thu 18 June 2015 11:39
- LKIWI
- Juste Inscrit !
- Date d'inscription: 10 Jun 2015
- Messages: 6
Re: QGIS : probleme avec code python intersection
Bonjour, dans la continuité de mon sujet je reviens vers vous avec un autre problème (encore plus difficile).
Vu que les géométries des mes deux couches ne s'intersecte pas; l'idée est de faire un BUFFER à partir de la même sélection (type d'occupation=logement) et ensuite:
-Récupérer dans un fichier 1 (csv ou excel si possible) les entités intersectées par le buffer et dont ID_RIL=ID_buffer
-Récupérer dans un fichier 2 (csv ou excel si possible) les entités intersectées par le buffer et dont ID_RIL DIFFERENT ID_buffer
-Récupérer dans un fichier 3 (csv ou excel si possible) les entités qui ne sont PAS intersectées et dont ID_RIL EXISTE dans ID_buffer
-Récupérer dans un fichier 4 (csv ou excel si possible) les entités qui ne sont NI intersectées et dont dont ID_RIL N'EXISTE PAS dans ID_buffer.
J'arrive pas à récupérer ma selection (type_occupation_logement) dans une couche temporaire.
et lorsque j’exécute le script dans la console python, la couche intersection en sortie est vide.
Voici mon début de code (j'avoue qu'il n'est pas vraiment terrible):
Code:
# -*-coding: utf8 -*- import os #importer la librairie os import sys #importer la librairie du systeme (sys) from osgeo import ogr # importer la librairie ogr import processing #importer l'ensemble des algorithmes from qgis.core import * from qgis.gui import * #from qgis.analysis import * #importe les deux libraires d'analyse de couche et de geometry #on charge la couche adresse à jour layer1 = iface.addVectorLayer("H:\SIG\Bases adresses\Shapefiles/adresse20150201.shp", "adresse2015", "ogr") layer1.setSelectedFeatures([]) # pour s'assurer d'avoir une sélection vide au départ for feature in layer1.getFeatures(): # chaque entité de la couche if feature ['TYPE_D_OCC']<> NULL: if 'Logement' in feature['TYPE_D_OCC'] : # dont le champ occupation contient 'Logement' layer1.select(feature.id()) # est ajoutée à la sélection from qgis.analysis import QgsGeometryAnalyzer QgsGeometryAnalyzer().buffer(layer1, "H:\SIG\Bases adresses\Shapefiles/output.shp", 0.08, False, False, -1) layer2 = iface.addVectorLayer("H:\SIG\Bases adresses\Shapefiles/output.shp", "buffer", "ogr")# on ajoute le buffer #on charge la couche RIL avec laquelle on va faire l'intersection layer3= iface.addVectorLayer("H:\SIG\Bases adresses\Shapefiles/ADRESSE_RIL_2015.shp", "ADRESSE_RIL_2015", "ogr") #from qgis.analysis import * #importe les deux libraires d'analyse de couche et de geometry from qgis.analysis import QgsOverlayAnalyzer overlayAnalyzer = QgsOverlayAnalyzer() overlayAnalyzer.intersection(layer2, layer3, r"H:\SIG\Bases adresses\Shapefiles\intersection.shp") # false pour qu'il nus retourne que les entités selectionnées layer3= iface.addVectorLayer("H:\SIG\Bases adresses\Shapefiles/intersection.shp", "intersection", "ogr")
Hors ligne