ArcGis et Python (3) : votre premier script

Si vous avez lu les deux articles précédents  ArcGis et Python :Avant de faire vos premiers pas et  ArcGis et Python : pour bien démarrer, vous êtes prêt pour vous lancer.

Il y a deux choses que vous devez apprendre : le langage Python et comment utiliser la bibliothèque de géotraitement Python d’ArcGis. En ce qui concerne le langage Python, des tutoriaux ne manquent pas. Mais n’oubliez pas que vous en aurez besoin que des bases du langage. Vous allez essentiellement enchaîner des outils ArcGis déjà tous faits.

Nous allons voir ici un premier exemple de script et son intégration dans votre toolbox personnelle.Ne faisons pas dans l’originalité. On va encore utiliser l’outil Clip (découpe) d’une couche. Disons que nous voulons adapter l’outil Clip pour que l’outil découpe automatiquement toutes les couches situées das un espace de travail (répertoire, geodatabase), en stockant les résultats dans un autre espace de travail.

On pourrait faire un modèle avec Model Builder en utilisant un itérateur en entrée de données. Et d’ailleurs c’est surement ce que vous feriez actuellement si vous ne faites que démarrer avec Python. Voyons donc comment faire la même chose en Python.

Nous allons utiliser pour l’exemple PyScripter, mais pour cet exemple, vous n’avez même pas besoin d’IDE. Un éditeur de texte peut très bien faire l’affaire. Par contre, sachez que dans Python, l’indentation des lignes fait partie de la syntaxe et que taper une ligne de code en début de ligne ou après une ou deux tabulations ne veut pas dire la même chose.

Un IDE vous positionnera automatiquement là où il faut.

Lancez votre IDE ou ouvrez votre éditeur de texte.

ouverture de Pyscripter

Vous allez taper votre ligne incontournable

import arcpy

sans laquelle Python ne connaît pas du tout les traitements ArcGis.

détail deu texte prédictif de pyscripter

Vous allez en rajouter une deuxième, qui appelle le module os qui offre un accès rapide aux outils fondamentaux du système d’exploitation. Certaines méthodes de gestion des noms de fichiers du module os seront utilisées dans ce script.

import os

détail de l'aide de pyscripter

Le script aura deux parties:

  • la première où vous allez définir les données en entrée et en sortie
  • le deuxième où vous allez exécuter les traitements

Définition des données en entrée et en sortie

Cette partie a un double intérêt. Bien sûr pour l’exécution du traitement il faut que l’outil sache sur quelle donnée travailler. Mais aussi parce que pour pouvoir exécuter le script en tant qu’outil de la toolbox il va falloir créer la fenêtre de paramétrage qui sera affiché lors du lancement de l’outil. Il faudra alors reprendre, une par une, les définitions de notre script pour créer un champ d’entrée dans la fenêtre. Vous avez donc tout intérêt à commenter vos lignes de code pour bien vous retrouver au bout du processus.

Nous allons utiliser 4 variables en entrée/sortie

  • l’espace de travail dans lequel se trouvent les couches à découper
  • la couche qui servira à découper les autres
  • l’espace de travail où mettre les couches découpées résultantes
  • la tolérance à utiliser par l’outil Découpe

Entrez les lignes de code suivantes:

# Espace de travail en entrée : Type WORKSPACE
arcpy.env.workspace = arcpy.GetParameterAsText(0)

#Classe d’entités servant à découper Type FEATURECLASS
clipFeatures = arcpy.GetParameterAsText(1)

# Espace de travail en sortie : Type WORKSPACE
outWorkspace = arcpy.GetParameterAsText(2)

# Tolérance XY de l’outil Découpe : Type DOUBLE
clusterTolerance = arcpy.GetParameterAsText(3)

définition des entrées et des sorties du script python

La fonction GetParameterAsText récupère les paramètres en entrée du script. Si vous voulez l’exécuter en ligne de commande (dans une fenêtre de commande) vous utiliserez un commande de type

python.exe « patramètre1 » « paramètre2 » « paramètre3 » Nombre

Si, comme nous le verrons plus loin, vous utilisez un outil de la toolbox, vous devrez faire correspondre l’ordre des champs de la fenêtre de dialogue avec l’ordre défini dans les variables du script: le premier champ de la fenêtre de dialogue devra être l’espace de travail en entrée, le deuxième la couche de découpe, etc.

Dans nos quatre définitions, la première est une définition d’une variable ArcGis, c’est l’espace de travail courant, tandis que les trois autres sont des variables propres à ce script.

Le corps du script : le traitement

Avant de commencer à rentrer les lignes de code du traitement en lui-même, nous allons rentrer un instruction bizarre. Nous allons taper simplement

try:

A la fin de notre traitement nous allons rentrer l’instruction complémentaire de celle-ci : except

Elles ne sont pas obligatoires. Si vous ne les entrez pas, le script fonctionnera sans problème, sauf… quand il y aura un problème. Si une erreur survient lors du traitement et que vous n’avez pas ces instructions, vous aurez une belle fenêtre « ArcGis a rencontré une erreur et doit être fermé… ».
Par contre, si vous avez mi try/except, si une erreur survient dans le corps du traitement, au lieu de planter le système, le script exécutera les instructions qu’il trouvera dans le paragraphe except (en général l’affichage d’un message d’erreur et d’une explication de celui-ci), tout en vous rendant la main de manière propre.

La première instruction que nous allons rentrer correspond à la création de la liste des couches présentes dans l’espace de travail en entrée et qu’il faudra découper.

fcs = arcpy.ListFeatureClasses()

gestion des erreurs dans python

Notez que les lignes ne commencent pas au début de la ligne. L’indentation indique à Python que cette commande est à l’intérieur de la commande try.
La variable fcs contiendra la liste des couches à découper. L’instruction ListFeatureClasses génère la liste des classes d’entités de l’espace de travail courant. Rappelez vous, nous l’avons défini dans la première instruction du script, le paramètre 0.

Maintenant que nous avons la liste des couches à traiter, nous allons mettre une instruction de type boucle pour que le traitement se répète sur chacune des couches de la liste

for fc in fcs:

Dans cette boucle nous allons découper une couche en entrée et créer une couche en sortie. Avant de la découper, nous devons gérer certains choses dont nous nous sommes jusqu’à présent déchargés sur ArcGis, soit sur les commandes soit sur les outils de la toolbox. Par exemple, si notre espace de travail en entrée est une géodatabase et que nous définissons notre espace de sortie comme un répertoire, les couches en sortie seront des fichiers shapefile. Pas de problème, sauf que les noms des shapefile sont beaucoup plus contraignants que ceux de la géodatabase. Nous risquons d’avoir des noms trop longs ou avec des points ou des tirets. Dans un script, c’est à nous de gérer ce type de problème. Rassurez vous. Ce n’est pas compliqué, mais il faut le faire.

Il suffit d’appeler la fonction ValidateTableName qui transforme les noms en entrée dans des noms corrects en sortie, tout en s’assurant qu’il n’y a pas de noms répétées en sortie.

featureClassName = arcpy.ValidateTableName(fc, outWorkspace)
outFeatureClass = os.path.join(outWorkspace, featureClassName)

boucle de traitement dans python

Maintenant nous allons découper la couche en entrée avec la couche de découpe. Mais si la couche de découpe se trouve dans l’espace de travail en entrée, nous ne voulons pas la découper! Nous mettons un test pour faire la découpe à condition que le nom de la couche à découper soit différent de celui qui découpe:

if fc != os.path.basename(clipFeatures):

Cette fonction récupère juste le nom du fichier, sans le chemin, car dans notre liste en entrée nous n’avons que les noms sans chemin.
Puis la fonction de découpe:

arcpy.Clip_analysis(fc, clipFeatures, outFeatureClass, clusterTolerance)

corps du traitement dans le script python

Voilà! C’est fini pour le traitement.

Nous devons maintenant renseigner quoi faire en cas d’erreur:

except Exception as err:
arcpy.AddError(err)
print err

Comme le script peut être exécuté dans un outil toolbox ou tout seul, nous avons deux affichages de l’erreur. AddError va ajouter le message d’erreur dans la fenêtre de résultat de l’outil toolbos. Print va afficher l’erreur dans la fenêtre de commande si le script est exécuté tout seul.

gestion des erreurs dfansle script python

Notez l’indentation de except. Il se place au même niveau que try.

Enregistrer votre fichier. Il est prêt pour passer dans la Toolbox.

Ajout du script dans la toolbox

Dans la Toolbox, chargez une boîte à outils personnelle (ici Mes Scripts).
Cliquez droit sur la boîte à outils et sélectionnez Ajouter->Script

ajouter un script python dans une boîte à outils arcgisLa première fenêtre permet de définir le Nom de l’outil (sans espaces ni caractères spéciaux) et l’étiquette qui apparaîtra dans l’affichage de la boîte à outils (avec espaces et caractères spéciaux si vous voulez).

nom de l'outilLa deuxième fenêtre permet de faire le lien avec notre script.

lien avec le script pythonLa dernière fenêtre c’est celle qui demande le plus de travail. Vous allez définir lrs c=hamps d’entrée de paramètres de la fenêtre de l’outil.

Pour chaque paramètre du script (nous en avons quatre) il faudra une ligne. Dans la colonne Nom complet vous tapez le texte que vous voulez voir à côté du champ d’entrée dans la fenêtre de dialogue.

Dans la colonne Type de données vous devez indiquer le type de donnée à entrer dans le champ de la fenêtre de dialogue.

définition des entrées et sorties poutr le menu de l'outilPour le premier paramètre du script (paramètre 0) nous indiquons « Espace de travail en entrée » et le type de données « Espace de travail« .

Voici la capture d’écran avec l’ensemble des définitions pour notre script.

entrées et sorties terminéesL’ordre des lignes est très importante. La première ligne sera le premier paramètre défini dans le script, paramètre 0. La deuxième ligne correspondra ai=u deuxième paramètre, paramètre 1. Et ainsi de suite.

Une fois terminé, fermez la fenêtre d’ajout de script. Vous pouvez maintenant l’exécuter comme tous les autres outils, en double cliquant dessus dans la Toolbox.

fenêtre de l'outil utilisant l script pythonVous retrouvez les quatre paramètres à rentrer.

Non seulement vous avez un nouvel outil qui peut s’exécuter à partir de la toolbox mais vous pourrez l’inclure dans un modèle de Model Builder.

Si cet article vous a intéressé et que vous pensez qu'il pourrait bénéficier à d'autres personnes, n'hésitez pas à le partager sur vos réseaux sociaux en utilisant les boutons ci-dessous. Votre partage est apprécié !

One thought on “ArcGis et Python (3) : votre premier script

  1. Bonjour Francois,

    J’essaye de créer un script python pour arcgis, et je me disais que peut être vous pourriez m’aider.

    Le script prendrai en entrée le nombre de différentes variables ainsi que le poids défini pour chacune d’entres elles. Le script retournerai ensuite le poids normé par rapport a 1 de chacune de ces variables.

    Par exemple, on a 3 variables de poids respectifs 2,3,5.

    Le script retournerai les poids 2/10 pour la première, 3/10 pour la seconde et 5/10 pour la dernière.

    Le code en python est facile, j’ai bien importé arcpy, mon problème est que je n’arrive pas a obtenir la sortie. j’ai bien créé un tool comme vous le montrez, le script tourne mais en sortie j’ai juste une fenêtre s’affichant me disant que le script a été exécuté avec succès mais pas de trace de mon vecteur poids.

    J’ai essayé avec un print ou meme avec une fonction mais les deux me donnent le meme resultat.

    Je vous remercie de m’avoir lu.

    Bien cordialement,
    Bonnard Paul

Répondre à Bonnard Paul Annuler la réponse

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *