Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Printemps des cartes 2024

#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: 3807

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: 3807

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: 3807

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: 3807

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

 

Pied de page des forums

Powered by FluxBB