Vous êtes sur la page 1sur 54

Sminaire Partenaires Esri France

7-8 juin 2011 - Paris

Automatiser ArcGIS
avec Python

Gatan LAVENU

Pourquoi Python dans ArcGIS ?

Python a t conu pour tre facile lire et crire

Simple maintenir

Jug excellent par les dbutants comme par les experts

Adaptable aux grands comme aux petits projet de scripts

Une communaut tablie et


active d'utilisateurs

De nombreux modules sont


disponible

Cross-platform

Python, les bases

O crit-on les scripts Python ?


-

Dans la fentre Python d'ArcGIS

Dans une IDE comme PythonWin, Wing, etc

Une liste des IDE disponibles sur le blog Goprocessing

Python, les bases

Python propose des logiques conditionnelles


-

Oprateur if, else

(:) la fin de chaque condition

L'indentation pour identifier les blocs excuter

== pour l'galit et les autres oprateurs >, <, !=

Python, les bases

Plusieurs options pour itrer ou boucler


-

Les boucles while, range ou list,


(:) la fin de l'instruction de l'itration ou de boucle
L'indentation pour identifier les blocs excuter

Python, les bases

Fonctions et Modules
-

Fonctions: un ensemble d'instructions qui ralisent une


tche spcifique

Module: un fichier Python (contenant typiquement des


fonctions)
import math
math.sqrt(100)

Python, les bases

Utiliser les types Python

Type

Description

Exemple

Listes

Une collection
ordonne
flexible

L = ["10 m", "20 m", "50 m"]

Une collection
fige (non
modifiable)

T = ("Paris", "Lyon", "Grenoble")

Paires
Cl/Valeur

D = {"ProductName": "desktop",

Tuples

Dictionnaires

"InstallDir": c:\\ArcGIS\\Desktop10.0"}

Python, les bases

Les Fonctions Python


-

Une manire simple d'organiser et de rutiliser une fonctionnalit

import arcpy
def increaseExtent(extent, factor):
"""Increases the extent by the given factor"""
XMin = extent.XMin - (factor * extent.XMin)
YMin = extent.YMin - (factor * extent.YMin)
XMax = extent.XMax + (factor * extent.XMax)
YMax = extent.YMax + (factor * extent.YMax)

Dfinir votre
fonction

return arcpy.Extent(XMin, YMin, XMax, YMax)

Retourne un
rsultat

oldExtent = arcpy.Describe("boundary").extent
newExtent = increaseExtent(oldExtent, .1)

On appelle
la fonction

Dmo 1
Types

et Fonctions Python

Un bref historique de Python dans ArcGIS

Bas sur l'objet


COM Geoprocessor
Python 2.1
Module
arcgisscripting
Cross-platform
Python 2.4

Module
arcgisscripting
9.3 version
Pythonisation Site-package ArcPy
Python 2.5
Support des oprations de
Mapping et Map Algebra
Fentre Python
Python 2.6

ArcPy

What is ArcPy?

Le point d'entre pour l'automatisation dans ArcGIS


-

Analyse, Conversion, Gestion des donnes, Automatisation


cartographique

ArcPy est un site-package Python natif


-

Offre l'accs plus de 800 outils de gotraitement d'ArcGIS

Fonction, Classes et Modules


-

Avec une documentation de rfrence intgre

Auto-code completion pour l'ensemble des composants


ArcGIS et ceci dans n'importe quel diteur Python

Dans la logique de l'ancien module arcgisscripting (pre-10)


-

Portage 9.3 -> 10 relativement simple

ArcPy

Amliore l'exprience utilisateur, en particulier sur:


-

Les curseurs

Les classes

La gestion des paramtres "Multi-value"


-

Dsormais exprims l'aide de listes Python

Possibilit de convertir des jeux de donnes rasters en


tableau NumPy

ArcPy est accessibles via les modules, notamment:


-

Un module de cartographie (arcpy.mapping)

Un module pour Spatial Analyst module (arcpy.sa) pour


supporter les oprations de Map Algebra

Un module pour Geostatistical Analyst (arcpy.ga)

Qu'est ce que la fentre Python ?

Un moteur Python interactif intgr dans ArcGIS


-

Permet l'accs ArcPy (les outils de la Toolbox et les


diffrents modules)

Accde galement toutes les fonctions de Python

Support de l'auto-code completion

Dmo 2
Utiliser

Python pour des


oprations de mise jour

Excuter des outils de la Toolbox

Les outils sont accessibles directement partir


du site-package ArcPy

Les paramtres d'environnement de gotraitements


dont dfinies comme proprits de la classe arcpy.env

# ~~~ CODE PYTHON ~~~


import arcpy
# Dfinir l'espace de travail
arcpy.env.workspace = "c:/sig/Meudon.gdb"
# Excuter l'outil de gotraitement
arcpy.Intersect_analysis([routes, forets, routes_forets], 5, join)

Remarque sur l'organisation des outils

Les outils peut s'excuter directement via arcpy


import arcpy
arcpy.GetCount_management(fc)

Ou via les modules "toolbox" d'arcpy


from arcpy.management import as dm
dm.GetCount(fc)

C'est une histoire de prfrence,


aucune diffrence fonctionnelle

Environnement de gotraitement

L'auteur du script dfinit les paramtres de


l'environnement et les outils les honorent
-

General settings
-

Raster analysis settings


-

Current Workspace, Output Spatial Reference, Extent

Cell Size, Mask

Et beaucoup d'autres

arcpy.env.workspace
arcpy.env.outputCoordinateSystem
arcpy.env.extent
arcpy.env.cellSize

Messages des outils de gotraitement

Les outils retournes 3 types de messages


Messages d'information (severity = 0)
- Message d'avertissement (severity = 1)
- Message d'erreur (severity = 2)
-

# Dmarrer un bloc
try:
arcpy.Buffer_analysis("c:/ws/roads.shp", "c:/outws/roads10.shp", 10)
# Si une erreur se produit lors de l'excution de l'outil alors on affiche
# le message
except arcpy.ExecuteError:
print arcpy.GetMessages(2)
# Si un autre type d'erreur se produit, on capture l'exception et on l'affiche
except Exception as e:
print e.message

Dmo 3

Dfinir l'environnement de
gotraitement
Retourner des messages
Crer un bloc
tryexcept

Automatisation = Productivit

Python est un moyen efficace d'automatiser vos tches SIG


dans ArcGIS

Accessible au plus grand nombre

Automatisation
cartographique

Analyse de
donnes

Conversion
de donnes

Gestion de
donnes

Fonctions

Le module ArcPy contient les fonctions ncessaires


pour raliser rapidement de nombreuses tches
-

Lister des sources de donnes

Dcrire des sources de sources

Valider les noms de tables et de


champs vis--vis de l'espace de
stockage utilis

Rcuprer les informations de


licence

Rcuprer les messages

etc

Souvent beaucoup plus simple


qu'avec du code ArcObjects

Traitement en batch

Les scripts Python permettent de raliser des traitement


gnriques rpter sur diffrents jeux de donnes
-

Convertir d'un format un nombre (ex: CAO/DAO vers GDB)

Dcouper des jeux de donnes par rapport une zone d'tude

Raliser des manipulations sur les champs et leurs valeurs

Les fonctions List* d'ArcPy sont


disponibles pour a

Dcrire les donnes

Permet de connaitre rapidement, dans votre script, les


proprits de vos jeux de donnes
-

Type de donnes (shapefile, coverage, network dataset, etc)

Type de gomtrie (point, polygon, line, etc)

Rfrence Spatiale

Etendue des entits

Liste des champs

Retourne un objet avec des proprits dynamiques

Permet par exemple des branchements logiques dans un


script en fonction des proprits des jeux de donnes
-

Couche raster versus couche vecteur

Couche projete versus couche non-projete

Couche de points avec Z versus couche de points sans Z

Dmo 4

Traitement en batch

Classes

ArcPy propose une srie de classes

Les classes permettent de crer et


manipuler des objets
-

Les objets ont des proprits et des


mthodes

Les classes sont souvent utiliss


pour:
-

Grer les paramtres des outils

Travailler avec les gomtries

Classes

Les classes peuvent tre utilises pour dfinir des


objets complexes comme:
-

Les rfrences spatiales

Les dfinitions de champs, de gomtries,

Ne ncessite plus l'opration CreateObject


En version 9.3
pt = gp.createObject("Point")
pt.x = 5
pt.y = 10

En version 10
pt = arcpy.Point(5,10)

Accder aux donnes avec les curseurs

Curseurs permettent de parcourir une srie


d'enregistrements (ou d'entits) ou d'en insrer de
nouveaux dans une table (ou classe d'entits)

Les curseurs sont utiliss dans de nombreux scripts


Type

Description

SearchCursor

Accs aux donnes (lecture seul)

UpdateCursor

Mettre jour ou supprimer des


donnes

InsertCursor

Insrer des donnes

Les curseurs

Les curseurs ArcPy supporte les itrations


En version 9.3
rows = gp.SearchCursor(myTable)
row = rows.next()
while row:
print row.GetValue(Code_PLU)
row = rows.next()

En version 10
for row in arcpy.SearchCursor(myTable)
print row.getValue(Code_PLU)

Les curseurs

Vous devez lire un jeu de donnes dans une


projection diffrente de sa projection originale?

Les entits lues par le curseur peuvent tre projetes


la vole en utilisant le paramtre Spatial Reference

# Crer un objet SR partir d'un fichier de projection


SR = arcpy.SpatialReference("c:\\sig\\RGF 1993 Lambert-93.prj")
# Crer un curseur de lecture en utilisant cette projection
rows = arcpy.SearchCursor("c:\\sig\\Meudon.gdb/routes_L2E", "", SR)

Accder aux gomtries avec des curseurs

Les classes d'entits disposent d'un champ


de gomtrie
-

Typiquement (mais pas toujours) nomm Shape

Le champ de gomtrie renvoie un objet Geometry

Les objets Geometry permettent de connaitre


-

area, length, isMultipart, partCount, pointCount, type, ...

Les objets Geometry ont des mthodes pour appeler des


oprateurs relationnels
# Retrouver la longueur totale de toutes les lignes d'une classe d'entits
import arcpy
length = 0
for row in arcpy.SearchCursor("C:/sig/meudon.gdb/routes"):
feature = row.shape
length += feature.length

Lire des gomtries

for row in arcpy.SearchCursor(polygonFC):

Boucler sur chaque


enregistrement

for part in row.shape:


pnt = part.next()

Boucler sur chaque


partie d'une entit

while pnt:
print pnt.X, pnt.Y
pnt = part.next()

Boucler sur chaque


points d'une partie

if not pnt:
pnt = part.next()
if pnt:
interiorRing = True

Pour les polygones,


parcourir les limites
internes et externes

Ecrire des gomtries

Les curseurs de type Insert peuvent tre utiliss pour


crer des nouvelles entits
rows = arcpy.InsertCursor("c:/sig/Meudon.gdb/routes")
row = rows.newRow()

Utiliser des objets Point et Array pour crer les


diffrentes parties

Une partie peut tre directement utilises pour remplir


un champ de gomtrie
-

Pour une entit "multipart", ce sera un tableau (Array)


contenant des tableaux contenant eux-mmes des objets
Point

Un curseur de type Update peut tre utilis pour modifier


les gomtrie d'entits existantes

Exemple

# Ouverture d'un curseur de type Insert sur une Feature Class


cur = arcpy.InsertCursor(fc)
# Cration d'un tableau de points
ptList = [arcpy.Point(358331, 5273193),
arcpy.Point(358337, 5272830)]
lineArray = arcpy.Array(ptList)
# Cration d'une nouvelle entits dans la classe d'entits
feat = cur.newRow()
# Dfinition de la gomtrie de la nouvelle entits
feat.Shape = lineArray
# Insertion de l'entit
cur.insertRow(feat)
# Suppression des objets
del cur, feat

Dmo 5

Utiliser des curseurs

Ecrire des donnes dans une table

import arcpy
import random

cursor = arcpy.InsertCursor(table)
# Write a 100 new rows with random values
for x in range(1,100):
row = cursor.newRow()
row.setValue("Pop", random.random())
cursor.insertRow(row)

del cursor, row

Ouvrir un curseur Insert

Crer un nouvel
enregistrement
Assigner une valeur
alatoire (pour l'exemple)
dans le champ "Pop"
Insrer l'enregistrement
dans la table
Effacer les objets utiliss
pour ne pas maintenir la
table verrouille

Rcuprer une gomtrie en sortie d'un outil

On peut rediriger le rsultat d'un outil directement


vers un objet Geometry

arcpy.env.workspace = c:/data/base.gdb
# Retourne une liste d'objets Geometry
gList = arcpy.CopyFeatures_management(rivers, arcpy.Geometry())
# Affiche l'tendue de la premire gomtrie de la liste
print gList[0].extent

Oprateurs relationnels sur les objets Geometry

En version 10, Les objets Geometry de Python


supportent les oprateurs relationnels
-

contains

crosses

disjoint

equals

overlaps

touches

within

Exemple

from arcpy import *


ligne1 = Polyline(Array([Point(1,10), Point(10,10)]))
ligne2 = Polyline(Array([Point(5,5), Point(7,15)]))
# Est-ce que la ligne1 croise la ligne2?
# crosses renvoie un boolen
ligne1.crosses(ligne2)

Le module arcpy.mapping

Un accs en Python :
-

La gestion des documents cartographiques d'ArcGIS (MXD, )


-

Rparer/Modifier les sources de donnes

Mettre jour la symbologie de couches prsentes dans diffrents


documents

Gnrer des rapports sur le contenus d'une liste de documents

Exporter et imprimer en batch des documents

Produire des sries ou des atlas de cartes

Dmo 6
Automatisation

cartographique

Crer des outils partir de scripts (Script Tools)

Les Script Tools constituent le


meilleur moyen de crer de partager des fonctions de
gotraitements personnalises

La source de l'outil est le script Python

C'est un outil comme les outils standards d'ArcGIS

Utilisable dans ModelBuilder

Utilisable dans d'autres scripts

Positionnable dans l'interface utilisateur

Depuis la 9.3, "runs in process"

Hrite de toutes les proprits et de


l'environnement de gotraitements

Communique avec l'application

Ajouts des rsultats dans la carte, etc

Messages

Crer des outils partir de script Python

Etape 1: Crer les variables correspondant aux


paramtres de l'outils
-

Utiliser GetParameterAsText dans votre script Python


pour obtenir la valeur de l'argument

Crer des outils partir de script Python

Etape 2: Ajouter des messages dans votre script


Python
-

Informer l'utilisateur durant l'excution de votre script

Renvoyer des messages d'erreur le cas chant

3 fonctions pour retourner des messages


-

AddMessage()

AddWarning()

AddError()

Crer des outils partir de script Python

Etape 3: Ajouter le script en tant qu'outil une de


vos botes outils
-

Donner un nom cet outil, un libell et une description

Dfinir la source de l'outil (le script Python) et spcifier


le chemin relatif si vous envisager de diffuser l'outil

Dfinir les paramtres de l'outil en fonction des


arguments de votre script

Rcuprer les valeurs des paramtres entrants

Si un script est la source d'un outil alors la fonction


GetParameterAsText() permet d'accder aux valeurs
saisies par l'utilisateur

import arcpy
# Rcupre la classe d'entits ou la couche en entre
in_features = arcpy.GetParameterAsText(0)
# Rcupre le nom du champ en entre
in_fieldName = arcpy.GetParameterAsText(1)

Les paramtres en sortie d'un Script Tool

Tous les outils doivent avoir un paramtre en sortie


Si le script met jour un jeu de donnes spcifi en entre,
alors vous dfinirez un paramtre de type driv
- Vous dfinirez alors une dpendance avec le paramtre en
entre
- Les proprits de l'objet en entre sont alors automatiquement
transfrs sur l'objet en sortie
-

Valeur
-

Ceci permet une utilisation optimum dans les modles de


gotraitement avec ModelBuilder

Dpendances des paramtres d'un Script Tool

Certains types de paramtres peuvent avoir un


comportement automatique si ils ont une dpendance
avec d'autres paramtres
-

Liste automatique des classes d'entits dans la


Godatabase slectionne

Liste automatique des champs de la table/classe d'entits


slectionne

Dmo 7
Crer

un Script Tool

Calculer des valeurs de champs en Python

Python peut tre galement utilis pour les formules de


calculs de champs
-

Trs puissant notamment avec l'usage des expressions et


des blocs de code

VB est toujours dispo mais utiliser un seul et mme


langage de scripting reste plus simple

Pour comprendre la syntaxe et dmarrer rapidement:


-

http://help.arcgis.com/fr/arcgisdesktop/10.0/help/index.htm
l#/Calculate_Field/00170000004m000000/

Learning Python Scripting with ArcGIS

Resource Center
-

http://resources.arcgis.com/geoprocessing/

Aide d'ArcGIS Desktop

Disposer d'une bonne rfrence sur


le langage Python

(Franais ou Anglais)

Learning Python de Mark Lutz


-

Core Python de Wesley J. Chun


-

Par OReilly & Associates


par Prentice-Hall

Tutoriaux en ligne

http://python.developpez.com/cours/TutoSwinnen/
http://fr.wikibooks.org/wiki/Apprendre_%C3%A0_programmer_
avec_Python
http://www.inforef.be/swi/download/apprendre_python3.pdf

Dmo 8

Geoprocessing Resource Center

Pause