Pages: 1
- Sujet précédent - [ArcGIS Pro - Arcpy/Python 3] Problème sur une boucle "for" - Sujet suivant
#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"
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"
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
Pages: 1
- Sujet précédent - [ArcGIS Pro - Arcpy/Python 3] Problème sur une boucle "for" - Sujet suivant