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

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#1 Tue 22 September 2020 09:22

Mossy_D
Participant occasionnel
Date d'inscription: 1 Oct 2018
Messages: 15

[ArcGIS Pro - Arcpy/Python 3] Problème sur une boucle "for"

Bonjour,

Je fais appel à vous pour m'aider à résoudre une petite énigme sur une boucle "for" dans Arcpy.
N'étant pas expert en programmation, il est possible que certains éléments de base m'échappent.

Ci dessous, deux programmes très simples :

- une version "pédagogique" pour test / compréhension du mécanisme
- une version "professionnelle" que je souhaite utiliser dans le développement d'un automate pour l'édition d'atlas.

Le principe : On a deux listes (deux listes de couches d'entités dans la version pro). Le principe est très simple : le programme doit renvoyer à quelle liste appartient chacun des éléments contenus dans chacune des listes.

Le code pédagogique, avec les animaux, marche très bien. Mais on voit que les listes sont constituées d'objets textuels.
En revanche, le code pro, avec les couches d'entités, m'informe que toutes les couches sont "absentes de la carte principale". Or, la couche pr_500 devrait bien en faire partie. Que ce passe-t-il au juste ?

Si ça peut aider, la console m'informe également que la couche pr_500 n'a pas d'élément "nom". Par exemple pr_500.name renvoie une erreur...


Code:

# Code pédagogique

zoo = ['tigre', 'girafe', 'perroquet', 'hipopotame', 'panda roux']
med = ['tigre']

for espece in zoo :
    if espece not in med :
        print ('Espece ' + espece + ' absente de la visite médicale.')
    else :
        print ('Espece ' + espece + ' participe à la visite médicale.')

Code:

# Code professionnel

index = m.listLayers ()
carte = [pr_500]

for lyr in index :
    if lyr not in carte :
        print ('La couche ' + lyr.name + ' est absente de la carte principale.')
    else :
        print ('La couche ' + lyr.name + ' fait partie de la carte principale.')

Dernière modification par Mossy_D (Tue 22 September 2020 09:29)

Hors ligne

 

#2 Tue 22 September 2020 13:36

simeric
Participant assidu
Date d'inscription: 10 Mar 2009
Messages: 255

Re: [ArcGIS Pro - Arcpy/Python 3] Problème sur une boucle "for"

Probablement une incohérence de types de données entre la liste de référence et l'élément recherché
Quand tu fais un print de "index", ça donne quoi ?

Hors ligne

 

#3 Tue 22 September 2020 13:42

Mossy_D
Participant occasionnel
Date d'inscription: 1 Oct 2018
Messages: 15

Re: [ArcGIS Pro - Arcpy/Python 3] Problème sur une boucle "for"

simeric a écrit:

Probablement une incohérence de types de données entre la liste de référence et l'élément recherché
Quand tu fais un print de "index", ça donne quoi ?


La liste par noms de couches s'affiche. A contrario, quand je print la couche pr_500 c'est le lien URI qui est renvoyé (pas de nom reconnu alors qu'il est bien reconnu si la couche se trouve dans "index".

Hors ligne

 

#4 Wed 23 September 2020 08:24

lebon henri
Participant actif
Lieu: Vendée
Date d'inscription: 14 Jan 2008
Messages: 99

Re: [ArcGIS Pro - Arcpy/Python 3] Problème sur une boucle "for"

Bonjour,
Si le but est de savoir s'il y a une couche nommée pr_5000 dans ta carte, tu  peux utiliser le un wildcard en paramètre de la méthode listLayers :

Code:

target_layers = map.listLayers ('pr_500')
if len(target_layers) > 0:
    print('La couche pr_500 fait partie de la carte principale.')
else:
    print('La couche pr_500 est absente de la carte principale.')

Dernière modification par lebon henri (Wed 23 September 2020 08:25)

Hors ligne

 

#5 Wed 23 September 2020 14:34

Mossy_D
Participant occasionnel
Date d'inscription: 1 Oct 2018
Messages: 15

Re: [ArcGIS Pro - Arcpy/Python 3] Problème sur une boucle "for"

lebon henri a écrit:

Bonjour,
Si le but est de savoir s'il y a une couche nommée pr_5000 dans ta carte, tu  peux utiliser le un wildcard en paramètre de la méthode listLayers :


En fait le but est plus exactement de savoir quelle couche appartient à quelle liste. Ici je sais que m.listLayers () ou index est composé d'un ensemble de couches. Dans mon code, j'ai volontairement créé une variable "carte" dans laquelle il n'y a que la couche pr_500. Cette couche existe également dans la liste "index".

Je cherche à ce que mon code renvoie :

- La couche a est absente de la carte principale
- La couche b est absente de la carte principale
- La couche c est absente de la carte principale
...
...
...
- La couche pr_500 fait partie de la carte principale

Comme je le disais, mon code pédagogique avec les objets textuels fonctionne bien. Dans ce cas, pourquoi cela ne fonctionnerait pas avec des objets spatiaux ? Il y a un kwak et je n'arrive pas à mettre la main dessus.

Dernière modification par Mossy_D (Wed 23 September 2020 14:35)

Hors ligne

 

#6 Wed 23 September 2020 17:20

Mossy_D
Participant occasionnel
Date d'inscription: 1 Oct 2018
Messages: 15

Re: [ArcGIS Pro - Arcpy/Python 3] Problème sur une boucle "for"

Concrètement on a ces résultats pour le moment :

Code:

# Code pédagogique

zoo = ['tigre', 'girafe', 'perroquet', 'hipopotame', 'panda roux']
med = ['tigre']

for espece in zoo :
    if espece not in med :
        print ('Espece ' + espece + ' absente de la visite médicale.')
    else :
        print ('Espece ' + espece + ' participe à la visite médicale.')

Espece tigre participe à la visite médicale.
Espece girafe absente de la visite médicale.
Espece perroquet absente de la visite médicale.
Espece hipopotame absente de la visite médicale.
Espece panda roux absente de la visite médicale.

Code:

# Code professionnel

index = m.listLayers ()
carte = [pr_500]

for lyr in index :
    if lyr not in carte :
        print ('La couche ' + lyr.name + ' est absente de la carte principale.')
    else :
        print ('La couche ' + lyr.name + ' fait partie de la carte principale.')

La couche pr_500 est absente de la carte principale.
La couche bati_pts est absente de la carte principale.
La couche emprise_technique_ep1_reduite est absente de la carte principale.
La couche emprise_technique_ep2_clip est absente de la carte principale.
La couche occup_temp est absente de la carte principale.
La couche lieu_dit est absente de la carte principale.
La couche commune est absente de la carte principale.
La couche parcellaire est absente de la carte principale.
La couche acquisition_fonciere_ep1 est absente de la carte principale.
La couche acquisition_fonciere_ep2 est absente de la carte principale.
La couche calepinage_2000 est absente de la carte principale.
La couche RCEA_Assemblage_L93.ecw est absente de la carte principale.

Hors ligne

 

#7 Thu 24 September 2020 08:48

lebon henri
Participant actif
Lieu: Vendée
Date d'inscription: 14 Jan 2008
Messages: 99

Re: [ArcGIS Pro - Arcpy/Python 3] Problème sur une boucle "for"

En fait, tu ne peux pas comparer directement 2 layers de 2 map différentes car il s'agit bel et bien de 2 objets différents et le résultat de la comparaison sera faux.
Par contre tu peux comparer les propriétés de 2 objets layers. Par exemple, la datasource et le nom.

Code:

if lyr.name == pr_500.name and lyr.dataSource == pr_500.dataSource

Hors ligne

 

#8 Thu 24 September 2020 10:41

Mossy_D
Participant occasionnel
Date d'inscription: 1 Oct 2018
Messages: 15

Re: [ArcGIS Pro - Arcpy/Python 3] Problème sur une boucle "for"

C'est très intéressant. Merci, je vais me pencher là dessus.

Hors ligne

 

Pied de page des forums

Powered by FluxBB