Академический Документы
Профессиональный Документы
Культура Документы
QGIS, comme tous les logiciels SIG, ne constitue pas une fin en soi. En effet, la version de
base de ce logiciel libre offre relativement peu doutils de traitement de linformation
gographique, linstar dArcGIS sans ses fameuses toolbox Initialement, toute la
puissance de QGIS rsidait dans sa complmentarit avec Grass. Dsormais, QGIS dispose
dune communaut de dveloppeurs importante et dynamique qui dveloppe des extensions
qui lui sont propres. Lextension FTools est une bonne illustration de cette dynamique.
Cette extension permettant deffectuer de nombreux traitements sur des objets vectoriels
figure dornavant parmi les extensions de base installes avec QGIS. Pour dvelopper de
telles extensions et ainsi amliorer les capacits de QGIS, il faut avoir recours un langage
de programmation comme Python. Pour commencer programmer en Python sous QGIS, il
faut aller dans Extension -> Console Python . Des lignes de commande apparaissent, il
convient ds lors de bien les utiliser. Ce complment de cours propose une introduction
Python et donne des exemples concrets permettant daborder le dveloppement sous QGIS.
1) INTRODUCTION CURSIVE A PYTHON
Python est un langage qui peut s'utiliser dans de nombreux contextes et s'adapter tout
type d'utilisation grce des bibliothques spcialises chaque traitement. Ce langage est
nanmoins particulirement utilis comme langage de script pour automatiser des tches
simples mais fastidieuses ou contraignantes. Il est aussi particulirement rpandu dans le
monde scientifique et possde de nombreuses extensions destines aux applications
numriques. On l'utilise galement comme langage de dveloppement pour des prototypes
lorsqu'on a besoin d'une application fonctionnelle avant de l'optimiser avec un langage de
plus bas niveau. Plus prcisment, Python est un langage de programmation objet,
interprt, multi-paradigme, et multi-plateforme.
Python a t conu pour tre un langage lisible. Il vise ainsi tre visuellement pur. De
plus, ce langage utilise des mots anglais l o d'autres langages utilisent de la ponctuation
(peu comprhensible pour un non-initi). Il possde galement moins de constructions
syntaxiques que de nombreux langages structurs tels que C, Perl, ou Pascal. Les
commentaires sont indiqus par le caractre croisillon (#).
De plus, les blocs sont identifis par l'indentation (ie. l'ajout de tabulations ou d'espaces dans
un fichier texte) au lieu d'accolades comme en C ou C++ ou de begin ... end comme en
Pascal. Une augmentation de l'indentation marque le dbut d'un bloc et une rduction de
l'indentation marque la fin du bloc courant. Cest pourquoi, Python requiert une rigueur
dans lcriture des scripts et en fait un langage que je trouve pdagogique, car il oblige de ne
pas coder vulgairement . Ainsi, une ligne correspond une commande et une colonne
correspond un niveau.
Commenons par laffectation qui se fait laide du signe galit :
>>> a=2
>>> b=3
Attention ! La division rserve des surprises car cest une division entire :
>>> e=a/b
>>> print e
0
Les objets couramment utiliss en Python sont les chanes de caractre et les listes :
>>> a="tr"
>>> print a
tr
>>> b=2
>>> e=a+b
Traceback (most recent call last):
File "<input>", line 1, in <module>
TypeError: cannot concatenate 'str' and 'int' objects
>>> b=str(b)
>>> print(b)
2
>>> e=a+b
>>> print e
tr2
>>>
>>>
[1,
>>>
>>>
[1,
liste=[1,2]
print liste
2]
liste=liste+[4,5,6]
print liste
2, 4, 5, 6]
>>>
>>>
>>>
>>>
{1:
>>>
{1:
Ltape suivante est un peu plus complexe que la prcdente. En effet, sans mme avoir une
grande connaissance de Python et de QGIS, il est possible dutiliser la bibliothque
NetworkX dans QGIS en tudiant les tutoriels disponibles (le lien vers les tutoriels [2]).
Faire interagir Python et QGIS ajoute un niveau de difficult supplmentaire. Ainsi, partons
du fait que deux couches ont t charges dans QGIS. La premire couche est compose de
nuds caractriss par leur identifiant. La deuxime couche est compose darcs caractriss
par leur identifiant, les deux identifiants des nuds situs aux extrmits de larc et leur
longueur. Lenjeu est alors de crer le graphe NetworkX partir de ces deux couches.
Pour cela, il faut rcuprer les attributs des couches laide de Python :
>>> canvas=qgis.utils.iface.mapCanvas() # Interaction avec la carte et les couches
>>> allLayers = canvas.layers() # Rcupre les deux couches charges dans QGIS
>>> couche_noeud = allLayers[0] # Rcupre la couche suprieure
>>> couche_arc = allLayers[1] # Rcupre la couche infrieure
>>> provider = couche_arc.dataProvider() # Interaction avec la couche arc
>>> field=provider.fields() # Rcupre les champs de la couche arc
>>> startind=provider.fieldNameIndex(depart) # Index du champ dpart
>>> endind=provider.fieldNameIndex(arrivee)
# Index du champ arrive
>>> distind=provider.fieldNameIndex(distance_K) # Index du champ distance_K
>>> feat = QgsFeature()
# Permet de manipuler les entits des couches
>>> allAttrs = provider.attributeIndexes()
# Rcupre les index des entits
>>> provider.select(allAttrs)
# Slectionne toutes les entits
>>> table=[] # Cration dune table qui va rcuprer les informations
>>> while provider.nextFeature(feat): # Boucle parcourant lensemble des entits
Une fois les attributs des couches permettant de crer le graphe rcuprs et aprs les avoir
collects dans un tableau, il est possible danalyser ce graphe laide de la bibliothque
NetworkX :
>>> import networkx as nx # Import de la bibliothque NetworkX
>>> G=nx.Graph() # Cration dun graphe G
>>> G.add_weighted_edges_from(table) # Ajout des entits de la table au graphe G
Enfin, il est possible de rcuprer les rsultats obtenus pour les implmenter dans la couche
nuds :
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
Toutes ces lignes de commande peuvent tre rcupres et rorganises pour crer un petit
programme permettant de calculer les centralits des nuds dun graphe spatial. Pour
lexcuter dans GIS, il suffit de taper la ligne de commande suivante :
>>> execfile(C:/Users/XXXXX/Desktop/centralite.py)
excuter
# Appelle le programme
Voil cette application a permis de prsenter de manire concrte lutilisation de python dans
QGIS. Il est dsormais possible deffectuer de lanalyse de rseaux sous QGIS laide de la
bibliothque NetworkX en interagissant avec linterface QGIS (rcupration des donnes
affiches, modification des couches).
3) APPLICATION POUR QGIS 2.0
QGIS 2.0 introduit quelques diffrences de programmation (assez mineures dans le cas
prsent) qui empchent dutiliser le code ci-dessus en ltat. Il faut donc effectuer quelques
modifications pour le rendre compatible avec QGIS 2.0. Ainsi, vous trouverez en rouge les
lments modifier pour que le code prsent ci-dessus soit valide.
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>> provider.select(allAttrs)
# Slectionne toutes les entits
>>> fit1 = provider.getFeatures(
QgsFeatureRequest().setSubsetOfAttributes([startind,endind,distind]) )
>>> table=[] # Cration dune table qui va rcuprer les informations
>>> while fit1.nextFeature(feat): # Boucle parcourant lensemble des entits
>>>