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.
Vous allez taper votre ligne incontournable
import arcpy
sans laquelle Python ne connaît pas du tout les traitements ArcGis.
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
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)
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()
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)
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)
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.
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
La 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).
La deuxième fenêtre permet de faire le lien avec notre script.
La 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.
Pour 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.
L’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.
Vous 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.
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