Python pour QGIS : Guide Essentiel
Python pour QGIS : Guide Essentiel
Centre de Prestations
et d'ingénierie
informatiques
DO Sud-Est
QGIS Téthys
Notions élémentaires du
langage Python
du 1er février 2011
Courriel : [Link]@[Link]
Rédacteur
Christophe MASSE - DO Sud-Est / CAS
Relecteur
Prénom NOM - CAS/CMSIG(s)
Référence(s) intranet
Site CMSIG DO Sud-Est : [Link]
TABLE DES MATIERES
1 - LE LANGAGE PYTHON...............................................................................................................5
1.1 - Philosophie et historique du langage.........................................................................................5
1.2 - La communauté Python et les ressources utiles........................................................................6
6 - LES FONCTIONS........................................................................................................................22
6.1 - Définition et appel d'une fonction.............................................................................................22
6.2 - Les principales fonctions sur chaîne de caractères.................................................................22
6.3 - Les principales fonctions mathématiques................................................................................27
6.4 - Les traitements logiques...........................................................................................................28
6.5 - La gestion des erreurs..............................................................................................................28
1 - Le langage Python
À la fin des années 1980, le programmeur Guido van Rossum participait au développement du
langage de programmation ABC au Centrum voor Wiskunde en Informatica (CWI) aux Pays-Bas. Il
travaillait alors dans l’équipe du système d’exploitation Amoeba dont les appels systèmes étaient
difficilement interfaçables avec le bourne shell qui était utilisé comme interface utilisateur. Il estima
alors qu’un langage de script inspiré d’ABC pourrait être intéressant comme interpréteur de
commandes pour Amoeba
En 1989, profitant d’une semaine de vacances durant les fêtes de Noël, il utilise son Macintosh
personnel pour écrire la première version du langage. Fan de la série télévisée des Monty Python, il
décide de baptiser ce projet Python. Il s’est principalement inspiré d’ABC, par exemple pour
l’indentation comme syntaxe ou les types de haut niveau mais aussi de Modula-3 pour la gestion des
exceptions, du langage C et des outils UNIX.
Durant l’année suivante le langage commence à être adopté par l’équipe du projet Amoeba, Guido
poursuivant son développement principalement pendant son temps libre. En février 1991, la première
version publique, numérotée 0.9.0, est postée sur le forum Usenet [Link]. La dernière version
sortie au CWI fut Python 1.2.
En 1995, Van Rossum continua son travail sur Python au CNRI (en) à Reston (en), aux États-Unis,
où il sortit plusieurs versions du logiciel.
À partir d'août 1995, l'équipe python travaille au CNRI sur Grail un navigateur web utilisant Tk. Il est
l'équivalent pour python du navigateur HotJava, permettant d'exécuter des applets dans un
environnement sécurisé. La première version publique, disponible en novembre, est la 0.2. Il a
entraîné le développement de modules pour la librairie standard comme rexec, htmllib ou urllib. La
version 0.6 sera la dernière de Grail; elle est publiée en avril 1999.
En 1999, le projet Computer Programming for Everybody (CP4E) est lancé avec collaboration entre
le CNRI et la DARPA. Il s'agit d'utiliser python comme langage d'enseignement de la programmation.
Cette initiative conduira à la création de l'environnement de développement IDLE. Les subventions
fournies par la DARPA ne suffisant pas à pérenniser le projet, Guido doit quitter le CNRI. Python 1.6
fut la dernière version sortie au CNRI.
• A BOpen :
Après la sortie de Python 1.6, et après que Van Rossum a quitté le CNRI pour travailler avec des
développeurs de logiciels commerciaux, le CNRI et la Free Software Foundation collaborèrent pour
modifier la licence de Python afin de la rendre compatible avec la GPL. Python 1.6.1 est
essentiellement le même que Python 1.6 avec quelques correctifs mineurs et la nouvelle licence
compatible GPL.
Andrew M. Kuchling a publié en décembre 1999 un texte nommé python warts qui synthétise les
griefs les plus fréquents exprimés à l'encontre du langage. Ce document aura une influence certaine
sur les développements futurs du langage.
Python 2.1 fut une version dérivée de Python 1.6.1, ainsi que de Python 2.0. Sa licence fut
renommée Python Software Foundation License. Tout code, documentation et spécifications ajouté,
depuis la sortie de Python 2.1 alpha, est détenu par la Python Software Foundation (PSF), une
association sans but lucratif fondée en 2001, modelée d'après l'Apache Software Foundation.
Afin de réparer certains défauts du langage (ex: orientation objet avec deux types de classes), et
pour nettoyer la bibliothèque standard de ses éléments obsolètes et redondants, Python a choisi de
casser la compatibilité ascendante dans la nouvelle version majeure : Python 3.0, publié en
décembre 2008. Cette version a été suivie rapidement par une version 3.1 qui corrige les erreurs de
jeunesse de la version 3.0 en la rendant directement obsolète .
Van Rossum est le principal auteur de Python, et son rôle de décideur central permanent de Python
est reconnu avec humour par le titre de « Dictateur bienveillant à vie » (Benevolent Dictator for Life,
BDFL).
Il est assisté d'une équipe de core developers qui ont un accès en écriture au dépôt de CPython et
qui se coordonnent sur la liste de diffusion python-dev. Ils travaillent principalement sur le langage et
la bibliothèque de base. Ils reçoivent ponctuellement les contributions d'autres développeurs Python
via la plateforme de gestion de bug Roundup, qui a remplacé SourceForge.
Les allusions aux Monty Python sont assez fréquentes. Les didacticiels consacrés à Python utilisent
souvent les mots spam et eggs comme variable métasyntaxique. Il s'agit d'une référence à l'épisode
25 de la deuxième saison du Monty Python's Flying Circus, ou deux clients tentent de commander un
repas à l'aide d'une carte qui contient du jambon en conserve (le spam) dans pratiquement tous les
plats. Ce sketch a été aussi pris pour référence pour désigner un email non sollicité.
Une des grandes forces du langage Python réside dans le nombre important de bibliothèques
logicielles externes disponibles. Une bibliothèque est un ensemble de fonctions. Celles-ci sont
regroupées et mises à disposition afin de pouvoir être utilisées sans avoir à les réécrire.
Celles-ci permettent de faire : du calcul numérique, du graphisme, de la programmation internet ou
réseau, du formatage de texte, de la génération de documents...
La distribution standard de Python contient un certain nombre de bibliothèques qui ont été
considérées comme suffisamment génériques pour intéresser la majorité des utilisateurs.
Leur utilisation est relativement bien expliquée dans la documentation de la distribution.
Les couches de présentation des applications (couche IHM avec wxPython, pyQt, PyKDE Tk, tkinter
3000, pyGTK, pybwidget, Pmw, TIX)
les couches controller des serveurs d'application Web (analyse HTML -htmllib, xmllib, urlParse,
mimetools- Serveur d'application : Zope - Django, Turbogears, CherryPy, Plone, GGI)
les couches Modele d'accès aux données (MySQL -MySQLdb- , Oracle -dcoracle-, MS SQL Server,
PostgreSQL -psycopg-, FireBird -kinterbasdb- , SybODBC, GadFly, PySqlite, Zodb- BDD objet -)
la couche de persistance XML (4Suite, PySimpleXML, XmlSerializer, Jaxml) ou spécifique à Python
(Cpickle, Shelve)
les couches d'accès au middleware ICE, COM/CORBA/.NET (win32, OmniORB, Ironpython) :
programmation orientée composant (pont vers des bibliothèques Fortran, C et C++)
les couches de communication standalone (port série : pySerial, port parallèle : pyParallel) , réseau
(Twisted, urllib2, HTMLparser, ftplib], socket, poplib, rfc822, mailbox, mhlib, imaplib, smtplib, telnet,
etc.)
les couches de frameWork bas niveau (ajout de capacité de script. exemple : [Link])
Les couches multimédia : traitement d'image (PIL)
Les couches utilitaires :
• de gestion de l'heure (datetime, time)
• de compression (gzip)
• de codage/décodage de données binaires (hashlib -md5, sha- , base64, binHex, binascii)
• de structure de données (decimal, deque, array, dico, list, queue, heapq)
• de parallélisme (thread)
• d'expressions régulières (re)
• de différences (difflib)
• d'acces au dll [Link] (ctype)
• de manipulation de chaînes (string, str, StringIO)
• de parseur (standard - shlex, ConfigParser, email, parser, cmd - ou Tierce- pyBison, ples,
pyparsing, ply, PyGgy, Yapps, pyLR)
[Link]
• PIL : Manipulation et traitement d'image : [Link]
• SVGdraw: Création d'image au format SVG (Scalable Vector Graphics) :
[Link]
• pygsl : Interface vers GNU scientific library (gsl): vecteur, matrice, transformation de fourrier,
recuit simulé, algèbre linéaire... : [Link]
• CGAL: CGAL-Python bindings pour la CGAL library (Computational Geometry Algorithms
Library) : [Link]
• GMPY : General Multiprecision PYthon : Interface vers la bibliothèque de précision
arithmétique GNU GMP : [Link]
• pyrorobotics : Environnement pour l'étude de la robotique et l'intelligence artificielle. Réseaux
de neurones : [Link]
• pybel : Interface pour la bibliothèque Open source de CHIMIE Open Babel.
• FANN : Fast Artificial Neural Network Library : binding Python pour FANN :
[Link]
• Maximum Entropy Modeling Toolkit : Framework qui met en oeuvre le principe de l'entropie
maximum : [Link]
• Orange : Technique d'exploration de données, data mining : [Link]
• MayaVi2 : Visualisation des données scientifiques en 2D/3D :
[Link]
• pySerial : Manipulation des ports séries, non intégrés par défaut, bien que très souvent utilisés
dans le monde industriel : [Link]
• pyParallel : Accès aux ports parallèles : [Link]
• pyMPI : Calcul parallèle : [Link]
• PyPar : Calcul parallèle : [Link]
• PyVISA : Contrôle des ports GPIB, RS232, and USB : [Link]
• PyUSB : Manipulation du port USB : [Link]
• pyro : Middleware Python Remote Objects : [Link]
• pyX : Python graphics package - Analyse de donnée : [Link]
• simPy : Simulation de systèmes dynamiques à file d'attente : [Link]
• Twisted : Pluggable, asynchronous protocols (TCP, UDP, SSL/TLS, multicast, Unix sockets,
HTTP, NNTP, IMAP, SSH, IRC, FTP) : [Link]
• SCons : Alternative puissante à make (next-generation build tool) : [Link]
• VPython : Simulation 3D basée sur OpenGl : [Link]
• directpython: Binding vers Direct X : [Link]
• pymedia : Module for wav, mp3, ogg, avi, divx, dvd, cdda etc. files manipulations :
[Link]
• wxPython : Bibliothèque d'accès à un toolkit très puissant (en particulier pour les interfaces
graphiques) : [Link]
• PyML : Python machine learning package : Framework pour l'apprentissage par les machines
(data mining ...) : [Link]
• Zope : Serveur d'application web orienté objet et base de données Objet :
[Link]
lstWMS = ""
for i in range(len(nParamWMS)):
tempo = ExtractValWMS(nWMS,str(nParamWMS[i]))
if tempo !="":
lstWMS = lstWMS + tempo + "|"
return lstWMS
Pour les commentaires, sous Python comme sous la plupart des langages, il est possible de mettre
une ligne en commentaire ou un bloc de lignes en commentaires.
Exemple de code :
Pour un bloc, les trois caractères « """ » doivent marquer le début et la fin du bloc :
"""
/***************************************************************************
Les commentaires sont placés ici.
***************************************************************************/
"""
Pour l'encodage, par défaut les scripts Python sont encodés en UTF-8. Cet encodage peut généré
des erreurs sur des retours de variables (ex : nom de fichier avec des caractères accentués ou
spéciaux). Il est possible alors de spéciifier l'encodage employé.
Exemple de code :
import sys
reload(sys)
[Link]( "iso-8859-1" )
La précision de l'encodage du module en entête peut se révéler dans certains cas insuffisantes
# -*- coding: utf-8 -*-
Pour utiliser des fonctions des librairies disponibles sous Python, il faut passer par la commande
« import » ces instructions.
Exemple de code :
import sys
from math import pi,sin,cos,sqrt
from PyQt4 import QtCore, QtGui
from [Link] import *
from [Link] import *
Notez dans les exemples ci-dessus, que ces différentes formes d'appels n'ont pas les mêmes
portées.
• int est un entier illimité. Avant la version 3.0, ce type était dénommé long, et le type int
correspondait à un entier 32 ou 64 bits. Néanmoins, une conversion automatique évitait tout
débordement.
• float est un flottant équivalent au type double du C, soit un nombre entre -1,7×10308 et
1,7×10308
• complex est une approximation d'un nombre complexe (typiquement deux floats)
• Les objets tuple (ou n-uplet) sont des listes non mutables d'objets hétérogènes.
nParamWMS=("GetMap=\"","<SRS>","<Layer>","wms_version=\"","minx=\"","miny=\"","maxx=\"","maxy=\"","\"
format=\"")
lstWMS = ""
for i in range(len(nParamWMS)):
tempo = ExtractValWMS(nWMS,str(nParamWMS[i]))
if tempo !="":
lstWMS = lstWMS + tempo + "|"
• Les objets list sont des tableaux dynamiques (ils étendent automatiquement leur taille lorsque
nécessaire) et acceptent des types de données hétérogènes.
Exemple de code :
Exemple de code :
Exemple de code :
• Les objets dict sont des tableaux associatifs (ou dictionnaires) permettant d'associer un objet
(une clef) à une valeur :
Exemple de code :
#il est possible de créer des listes de dictionnaires pour accéder aux « valeurs » partagées par des clefs
identiques
alllayers = [tlayer, ulayer]
for i in alllayers:
print i['parcellaire']
#retourne :
native (pour tlayer)
C:\Mes documents\[Link] (pour ulayer)
# ces valeurs sont données à titre d'exemple
Avec ce dernier exemple, on note que les dictionnaires permettent de se rapprocher d'un
comportement de type base de données. On pourrait croire qu'une entrée n'attend qu'une valeur
unique (type alpha-numérique ou numérique), il n'en est rien. Les listes, dictionnaires, tuples sont
des objets qui peuvent contenir des collections d'autres objets. On peut donc construire des listes qui
contiennent des dictionnaires, des tuples ou d'autres listes, mais aussi des dictionnaires contenant
des tuples, des listes, etc.
Pour une chaîne de caractère, l'itération a lieu caractère par caractère. Un caractère est une chaîne
de longueur 1.
Il est possible de dériver les classes des types de base pour créer ses propres types. On peut
également fabriquer ses propres types d'objets itérables sans hériter des itérables de base en
implémentant le protocole d'itération du langage.
Exemple de code :
>>> a=3
>>> type(a)
<type 'int'>
5.1 - l'instruction if
Exemple de code :
geomc = [Link]()
if [Link] == 0:
if [Link](g):
[Link]([Link]())
elif [Link] == 1:
if [Link](g):
[Link]([Link]())
elif [Link] == 2:
if [Link](g):
[Link]([Link]())
elif [Link] == 3:
if [Link](g):
[Link]([Link]())
elif [Link] == 4:
if [Link](g):
[Link]([Link]())
elif [Link] == 5:
if [Link](g):
[Link]([Link]())
elif [Link] == 6:
if [Link](g):
[Link]([Link]())
elif [Link] == 7:
if [Link](g):
[Link]([Link]())
Notez que le « Else If » en Python se traduit par « elif ». Inutile de placer des « end if », l'indentation
indique la fin d'un bloc d'instruction « if » à l'interpréteur. Sur un test simple, vous pouvez aussi
utiliser l'instruction « else ».
Exemple de code :
zIndex = 0
nLayers = [Link]().layerCount()
for i in range(nLayers):
cLayer = [Link]().layer(i)
if str([Link]())== str([Link]()):
break
zIndex = zIndex + 1
return zIndex
L'instruction « break » permet de sortir de la boucle « for » si la condition (test « if ») est vérifiée.
Exemple de code :
6 - Les fonctions
Exemple de code :
def CorrigePath(nPath):
nPath = str(nPath)
a = len(nPath)
subC = "/"
b = [Link](subC, 0, a)
if a != b :
return (nPath + "/")
else:
return nPath
Une fonction retourne en règle générale un résultat (passé par le « return »).
Notez qu'en Python, il est inutile de typer la ou les variables passées à la fonction.
Exemple de code :
La variable passée à la fonction « CorrigePath » est le résultat d'un appel à une fonction de haut
niveau (« dirname »).
_apply = apply(...)
apply(object, args[, kwargs]) -> value
Call a callable object with positional arguments taken from the tuple args,
and keyword arguments taken from the optional dictionary kwargs.
Note that classes are callable, as are instances with a __call__() method.
_float = float(...)
float(x) -> floating point number
_int = int(...)
int(x[, base]) -> integer
_long = long(...)
long(x) -> long integer
long(x, base) -> long integer
atof(s)
atof(s) -> float
atoi(s, base=10)
atoi(s [,base]) -> int
atol(s, base=10)
atol(s [,base]) -> long
capitalize(s)
capwords(s, sep=None)
capwords(s, [sep]) -> string
center(s, width)
center(s, width) -> string
count(s, *args)
count(s, sub[, start[,end]]) -> int
expandtabs(s, tabsize=8)
expandtabs(s [,tabsize]) -> string
find(s, *args)
find(s, sub [,start [,end]]) -> in
Return -1 on failure.
index(s, *args)
index(s, sub [,start [,end]]) -> int
Like find but raises ValueError when the substring is not found.
ljust(s, width)
ljust(s, width) -> string
lower(s)
lower(s) -> string
lstrip(s)
lstrip(s) -> string
maketrans(...)
maketrans(frm, to) -> string
rfind(s, *args)
Return -1 on failure.
rindex(s, *args)
rindex(s, sub [,start [,end]]) -> int
Like rfind but raises ValueError when the substring is not found.
rjust(s, width)
rjust(s, width) -> string
rstrip(s)
rstrip(s) -> string
strip(s)
strip(s) -> string
swapcase(s)
swapcase(s) -> string
upper(s)
upper(s) -> string
zfill(x, width)
zfill(x, width) -> string
• x + y somme de x et y
• x - y difference entre x et y
• x * y produit de x et y
• x / y division de x par y
• x % y reste de la division x / y
• -x passage en négatif de x
• +x x inchangé
• abs(x) valeur absolue or magnitude of x
• int(x) x converti en type integer
• long(x) x converti en type long integer
• float(x) x converti en type to float
• complex(re,im) definir un nombre complexe avec une composante réelle re, une
composante imaginaire im. im par défaut à zéro.
• [Link]() conjugaison du nombre complexe c.
• pow(x, y) x puissance y
• x ** y x puissance y
Exemple de code :
Pour tester l'égalité de la valeur, comme en Java, l'opérateur est « == ». L'opérateur « = » seul
assigne une valeur.
Pour le reste, les opérateurs mathématiques sont ceux habituels hotmis pour le différent (n'est pas
égal) s'exprime par l'opérateur « != » (comme en java).
Pour les objets, on utilise « is » et « is not ».
Exemple de code :
Il existe une hiérarchie des classes d'exception. Pour le cadre de cette présentation rapide de
Python, elle ne sera pas présentée. Comme pour d'autres langages, les mots clefs (try .. except ..
finally) sont mis en oeuvre :
Exemple de code :
try:
float(s)
return True
except ValueError:
return False
Exemples de code :
import [Link]
def GetAdress(nTable, nDir):
rTable = nTable
if [Link](rTable)== True :
return rTable
else:
retval = [Link](nDir,nTable)
retval = [Link](retval)
if [Link](retval):
return retval
else:
return ""
import sys
reload(sys)
[Link]( "iso-8859-1" )
Exemple de code :
import ctypes
PathMITAB = CorrigePath([Link](__file__))+"[Link]"
if [Link](PathMITAB)== True :
libMITAB = [Link](PathMITAB)
Dans les environnements de développement informatique, il a fallu attendre assez longtemps pour
voir émerger le concept de l'objet. Son apparition a permis la création de systèmes beaucoup plus
complexes mais aussi très empreints de mimétisme. En effet, dans notre monde réel, nous sommes
tous entourés d'objets qui ont très souvent deux critères d'appréciation.
Ce premier est universel, il contient toutes les caractéristiques qui décrivent l'objet. Nous prendrons
comme exemple un dé, si nous avions à le décrire, nous dirions qu'il possède 6 faces avec un chiffre
allant de 1 à 6 sur chacune d'elles, que la somme de deux valeurs étant sur des faces opposées vaut
7, que chaque chiffre entre un et six y est repris une et une seule fois, qu'il est (souvent) de couleur
rouge et de petite taille. Il serait possible de le décrire plus précisément, mais en réalité, indiquer qu'il
est fait de bois, que les nombres sont représentés par une quantité de point qui leur est égal, qu'il
dispose de coin arrondi... n'aurait pas été plus éloquent.
Le deuxième critère est celui d'interaction, il indique l'utilité de l'objet, les possibilités qu'il vous offre.
Pour le dé nous pourrions indiquer que celui-ci peut rouler, mais ce n'est pas son rôle. De même,
dans certaines circonstances, celui-ci peut vous servir de cale, mais ici encore, nous nous éloignons
du sujet. Objectivement, le dé a pour rôle de donner un nombre compris entre son minimum et son
maximum (inclus) au hasard. D'ailleurs, on peut ajouter que cela arrive après l'avoir lancé.
Ici, nous avons décrit un objet, et il nous suffit de faire de même en informatique. Mais nous
pourrions approfondir la description en indiquant aussi que le dé est en fait dérivé d'un objet de
base : le cube. Ainsi nous pourrions dire que le dé :
• est un cube.
• est de couleur rouge.
• peut être lancé pour renvoyer un nombre compris entre 1 et 6 (le nombre de face qui le
compose).
puis expliquer que le cube :
• est un volume géométrique à trois dimensions.
• est constitué de 6 carrés.
puis bien sûr qu'un carré :
Une extension présente une IHM qui comporte au minimum un menu, et parfois une barre d'outils
associée, des formulaires (fichiers « ui » réalisés avec « PyQt » ou « SDK Qt », cf. paragraphe « les
principaux outils de développement »).
Tous ces éléments sont définis, initialisés dans le module principal de l'extension (nom libre, parfois
« [Link] » à défaut). La porte d'entrée pour QGIS est toujours un fichier « __init__.py ». Ce dernier
présente un contenu du type suivant :
Exemple de code :
here = [Link]([Link](__file__),"[Link]")
[Link](here)
def name():
#ci-dessous lecture ou retour valeur
#les deux modes sont présents ici pour l'exemple !!!!
return [Link]('general','name')
return "Mon nom"
def authorName():
return [Link]('general','authorName')
def description():
return [Link]('general','description')
def version():
return [Link]('general','version')
def qgisMinimumVersion():
return [Link]("general","qgisMinimumVersion")
Exemple de code :
[general]
name: Nom de l'extension
version: Numéro de version
description: Texte de présention
author: Nom(s) du ou des auteurs
qgisMinimumVersion: version de QGIS à partir de laquelle l'extension est supportée.
Toutes ces informations sont présentées dans le gestionnaire d'extension et par l'outil de récupération des
extensions.
Le contenu du module « Main » dans notre exemple comportera dans sa partie haute les éléments suivants :
Exemple de code :
class MainPlugin(object):
def __init__(self, iface):
[Link] = "MenuName"
[Link] = iface
def initGui(self):
#on démarre la construction de l'environnement plugin
[Link]=QMenu("Titre Menu")
self.MenuItem1 = Qaction("Que faire ? ...", [Link]())
[Link](self.MenuItem1 ,SIGNAL("triggered()"),self.MyAction1)
#dans la ligne ci-dessus, on créé une ligne de commande MenuItem1 au menu
#Le « trigger » est le déclencheur, le signal. Ce signal est capté sur l'élément du menu MenuItem1
#attention à la casse !
[Link](self.MenuItem1)
[Link]()
[Link]([self.MenuItem2, self.MenuItem3])
Notez que les méthodes ou fonctions de la classe « MainPlugin » sont indentées avec un retrait.
Les fonctions ou procédures sans retrait ne sont pas uniquement utilisables par l'objet.
On peut démarrer avec la création d'une boîte de dialogue « A propos ... ». La création de la
« base » peut se faire sous « PyQt (Qt Designer) » ou le « SDK Qt » (ou d'autres). Cette création
aboutie à générer un fichier « ui ».
Exemple :
Cette « base » est alimentée par des scripts Python placés dans des modules « [Link] » et
« [Link] ».
Exemple de code :
#contenu de « [Link] »
#contenu de « [Link] »
# -*- coding: utf-8 -*-
# -*- coding: iso-8859-1 -*-
import [Link]
from PyQt4 import QtCore, QtGui
class Ui_Dialog(object):
def setupUi(self, Dialog):
[Link]("Dialog")
[Link]([Link]([Link](0,0,330,350).size()).expandedTo([Link]()))
[Link] = [Link](Dialog)
[Link]("gridlayout")
self.label_2 = [Link](Dialog)
[Link] = [Link](Dialog)
myPath = [Link](__file__)+"/[Link]";
myDefPath = [Link]("\\","/");
carIcon = [Link](myDefPath) #"python/plugins/selectplus/[Link]")
[Link]([Link](carIcon))
font = [Link]()
[Link](15) #20
[Link](50) #75
[Link](True)
self.label_2.setFont(font)
self.label_2.setTextFormat([Link])
self.label_2.setObjectName("label_2")
[Link](self.label_2,1,1,1,2)
[Link]([Link],1,5,1,2)
[Link] = [Link](Dialog)
palette = [Link]()
brush = [Link]([Link](0,0,0,0))
[Link]([Link])
[Link]([Link],[Link],brush)
brush = [Link]([Link](0,0,0,0))
[Link]([Link])
[Link]([Link],[Link],brush)
brush = [Link]([Link](255,255,255))
[Link]([Link])
[Link]([Link],[Link],brush)
[Link](palette)
[Link](True)
[Link] = 320
[Link] = 380
[Link]([Link])
[Link]([Link])
[Link](True)
[Link]("textEdit")
[Link]([Link])
#[Link]|[Link]
[Link]([Link],2,1,5,2) #2,1,1,2
[Link] = [Link](Dialog)
[Link]("pushButton")
[Link]([Link],4,2,1,1)
spacerItem = [Link](20,40,[Link],[Link])
[Link](spacerItem,3,1,1,1)
[Link](Dialog)
[Link]([Link],[Link]("clicked()"),[Link])
[Link](Dialog)
Notez aussi qu'il est possible d'implémenter ou d'enrichir directement les interfaces de 'IHM QGIS.
Ci-dessous un exemple simple de classe « Widget » pour le paramétrage d'une classe
« MapInfoFillSymbolLayer » :
Exemple de code :
class MapInfoFillSymbolLayerWidget(QgsSymbolLayerV2Widget):
def __init__(self, parent=None):
QgsSymbolLayerV2Widget.__init__(self, parent)
[Link] = None
[Link] = QLabel("Couleur:")
[Link] = QLabel("Ceci n'est qu'un exemple d'interface pour la sélection de la couleur ...")
[Link] = QColorDialog() #QLabel(str(QColor([Link])))
[Link] = QHBoxLayout()
[Link]([Link])
[Link]([Link])
[Link]([Link])
[Link]([Link])
[Link]( [Link], SIGNAL("valueChanged(long)"), [Link])
if [Link]() != "MapInfoBrush":
return
[Link] = layer
[Link]([Link])
def symbolLayer(self):
return [Link]
Il peut être intéressant de récupérer les informations sur le paramétrage du logiciel et sur les
informations du profil utilisateur.
Exemple de code :
La classe « QSettings » de l'API de QGIS permet d'obtenir les informations sur le paramétrage du
logiciel qui sont stockées dans la base de registre (sous Windows) :
Exemple de code :
Exemple de code :
QSettings().setValue(key+"/valid", QVariant(True))
L'API QGIS est très riche. Si la documentation technique est assez bien documentée, pour trouver
des exemples concrets de mise en application, le mieux est le plus souvent de sonder les outils à
disposition. En effet, toutes les extensions sous « Python » sont parfaitement lisibles avec un simple
éditeur de texte. Mieux vaut néanmoins installer l'« IDLE » (« Integrated Development
Environment ») ou utiliser un éditeur style « NotePad ++ » qui jouera la colorisation syntaxique du
langage Python. Notez que QGIS embarque un environment d'exécution Python 2.5 . Les
développements sur « SELECTPLUSFR » et « OPENWOR » ont été réalisés sous Python 3.1, sans
problèmes de compatibilité rencontrée à leur exécution sous QGIS.
GEOSException
• GEOSInit
• HalfEdge
• Line3D
• MyLine
• Node
• ParametricLine
• Bezier3D
• Point3D
• QGis
• QgisInterface
• QgisPlugin
• QgsRendererPlugin
• QgsVectorOverlayPlugin
• QgsAction
• QgsApplication
• QgsApplyDialog
• QgsAttributeAction
• QgsAttributeEditor
• QgsClipper
• QgsColorBrewerPalette
• QgsColorButton
• QgsColorButtonV2
• QgsColorRampShader::ColorRampItem
• QgsComposerItem
• QgsComposerArrow
• QgsComposerItemGroup
• QgsComposerLabel
• QgsComposerLegend
• QgsComposerMap
• QgsComposerPicture
• QgsComposerScaleBar
• QgsComposerShape
• QgsComposerTable
• QgsComposerAttributeTable
• QgsComposerTextTable
• QgsPaperItem
• QgsComposerLegendItem
• QgsComposerGroupItem
• QgsComposerLayerItem
• QgsComposerRasterSymbolItem
• QgsComposerSymbolItem
• QgsComposerSymbolV2Item
• QgsComposerView
• QgsComposition
• QgsContextHelp
• QgsContrastEnhancement
• QgsContrastEnhancementFunction
• QgsClipToMinMaxEnhancement
• QgsLinearMinMaxEnhancement
• QgsLinearMinMaxEnhancementWithClip
• QgsCoordinateReferenceSystem
• QgsCoordinateTransform
• QgsCredentials
• QgsCredentialDialog
• QgsCredentialsConsole
• QgsDataProvider
• QgsRasterDataProvider
• QgsVectorDataProvider
• QgsDataSourceURI
• QgsDetailedItemData
• QgsDetailedItemDelegate
• QgsDetailedItemWidget
• QgsDistanceArea
• QgsEncodingFileDialog
• QgsException
• QgsCsException
• QgsFeature
• QgsFeatureRendererV2
• QgsCategorizedSymbolRendererV2
• QgsGraduatedSymbolRendererV2
• QgsRuleBasedRendererV2
• QgsSingleSymbolRendererV2
• QgsField
• QgsFileDropEdit
• QgsGenericProjectionSelector
• QgsGeometry
• QgsGeometry::Error
• QgsGeometryAnalyzer
• QgsGridFileWriter
• QgsHttpTransaction
• QgsInterpolator
• QgsIDWInterpolator
• QgsTINInterpolator
• QgsInterpolator::LayerData
• QgsLabel
• QgsLabel::labelpoint
• QgsLabelAttributes
• QgsLabelCandidate
• QgsLabelingEngineInterface
• QgsPalLabeling
• QgsLegendInterface
• QgsLegendModel
• QgsLogger
• QgsLongLongValidator
• QgsLUDialog
• QgsMapCanvas
• QgsMapCanvas::CanvasProperties
• QgsMapCanvasItem
• QgsAnnotationItem
• QgsFormAnnotationItem
• QgsTextAnnotationItem
• QgsRubberBand
• QgsVertexMarker
• QgsMapCanvasLayer
• QgsMapCanvasMap
• QgsMapCanvasSnapper
• QgsMapLayer
• QgsPluginLayer
• QgsRasterLayer
• QgsVectorLayer
• QgsMapLayerRegistry
• QgsMapOverviewCanvas
• QgsMapRenderer
• QgsMapTip
• QgsMapTool
• QgsMapToolEmitPoint
• QgsMapToolPan
• QgsMapToolZoom
• QgsMapToPixel
• QgsMarkerCatalogue
• QgsMessageOutput
• QgsMessageOutputConsole
• QgsMessageViewer
• QgsNetworkAccessManager
• QgsNineCellFilter
• QgsDerivativeFilter
• QgsAspectFilter
• QgsSlopeFilter
• QgsRuggednessFilter
• QgsTotalCurvatureFilter
• QgsOverlayAnalyzer
• QgsOverlayObject
• QgsOverlayObjectPositionManager
• QgsCentralPointPositionManager
• QgsPALObjectPositionManager
• QgsPALGeometry
• QgsPalGeometry
• QgsPalLayerSettings
• QgsPanningWidget
• QgsPluginLayerRegistry
• QgsPluginLayerType
• QgsPoint
• QgsProject
• QgsProject::Imp
• QgsProjectBadLayerHandler
• QgsProjectBadLayerDefaultHandler
• QgsProjectBadLayerGuiHandler
• QgsProjectFileTransform
• QgsProjectFileTransform::transform
• QgsProjectionSelector
• QgsProjectVersion
• QgsProperty
• QgsPropertyKey
• QgsPropertyValue
• QgsProviderCountCalcEvent
• QgsProviderExtentCalcEvent
• QgsProviderMetadata
• QgsProviderRegistry
• QgsQuickPrint
• QgsRasterBandStats
• QgsRasterImageBuffer
• QgsRasterPyramid
• QgsRasterShader
• QgsRasterShaderFunction
• QgsColorRampShader
• QgsFreakOutShader
• QgsPseudoColorShader
• QgsRasterTransparency
• QgsRasterTransparency::TransparentSingleValuePixel
• QgsRasterTransparency::TransparentThreeValuePixel
• QgsRasterViewPort
• QgsRectangle
• QgsRenderContext
• QgsRenderer
• QgsContinuousColorRenderer
• QgsGraduatedSymbolRenderer
• QgsSingleSymbolRenderer
• QgsUniqueValueRenderer
• QgsRendererCategoryV2
• QgsRendererRangeV2
• QgsRendererV2AbstractMetadata
• QgsRendererV2Metadata
• QgsRendererV2Registry
• QgsRuleBasedRendererV2::Rule
• QgsRunProcess
• QgsScaleBarStyle
• QgsDoubleBoxScaleBarStyle
• QgsNumericScaleBarStyle
• QgsSingleBoxScaleBarStyle
• QgsTicksScaleBarStyle
• QgsScaleCalculator
• QgsSearchString
• QgsSearchTreeNode
• QgsSearchTreeValue
• QgsSnapper
• QgsSnapper::SnapLayer
• QgsSnappingResult
• QgsStyleV2
• QgsSymbol
• QgsSymbolLayerV2
• QgsFillSymbolLayerV2
• QgsSimpleFillSymbolLayerV2
• QgsSVGFillSymbolLayer
• QgsLineSymbolLayerV2
• QgsLineDecorationSymbolLayerV2
• QgsMarkerLineSymbolLayerV2
• QgsSimpleLineSymbolLayerV2
• QgsMarkerSymbolLayerV2
• QgsFontMarkerSymbolLayerV2
• QgsSimpleMarkerSymbolLayerV2
• QgsSvgMarkerSymbolLayerV2
• QgsSymbolLayerV2AbstractMetadata
• QgsSymbolLayerV2Metadata
• QgsSymbolLayerV2Registry
• QgsSymbolLayerV2Utils
• QgsSymbologyV2Conversion
• QgsSymbolV2
• QgsFillSymbolV2
• QgsLineSymbolV2
• QgsMarkerSymbolV2
• QgsSymbolV2LevelItem
• QgsSymbolV2RenderContext
• QgsTolerance
• QgsUndoCommand
• QgsUndoCommand::AttributeChangeEntry
• QgsUndoCommand::GeometryChangeEntry
• QgsVector
• QgsVectorColorRampV2
• QgsVectorColorBrewerColorRampV2
• QgsVectorGradientColorRampV2
• QgsVectorRandomColorRampV2
• QgsVectorDataProvider::NativeType
• QgsVectorFileWriter
• QgsVectorLayer::RangeData
• QgsVectorOverlay
• QgsZonalStatistics
• TriangleInterpolator
• CloughTocherInterpolator
• LinTriangleInterpolator
• Triangulation
• DualEdgeTriangulation
• TriDecorator
• NormVecDecorator
• Vector3D
• vertexData
Exemple de code :
class InvertAllAction(SelectAction):
def __init__(self,iface):
SelectAction.__init__(self,iface,"Inverser toutes les sélections","Inverser toutes les sélection",
"[Link]",0)
return None
def doit(self):
nLayers = [Link]().layerCount()
[Link]( QCursor( [Link] ) )
for i in range(0, nLayers):
layer = [Link]().layer(i)
if [Link]():
if [Link]() == [Link]:
all = layerIds(layer)
current = [Link]()
new = list(set(all)-set(current))
[Link](new)
else:
ActualiseMSg(self)
return None
[Link]()
return None
La liste ne reflète pas intégralement les possibilités de l'API QGIS : certains élements ne sont pas
présentés.
Exemple de code :
zQtLine = QgsSymbologyUtils.qString2PenStyle(tLine[zLine])
zQtBrush = QgsSymbologyUtils.qString2BrushStyle(tBrush[zBrush])
Parfois, il faut aller au plus près du coeur source pour trouver certaines informations (valeurs
paramètres de fonctions)
Exemple de code :
def clickInfosEtiqPOS(self):
zCodes = "Aligné horizontalement au centre :" + str([Link]) + "\n"
zCodes = zCodes + "Aligné horizontalement à droit :" + str([Link]) + "\n"
zCodes = zCodes + "Aligné horizontalement à gauche :" + str([Link]) + "\n\n"
zCodes = zCodes + "Aligné verticalement au centre :" + str([Link]) + "\n"
zCodes = zCodes + "Aligné verticalement en bas :" + str([Link]) + "\n"
zCodes = zCodes + "Aligné verticalement en haut :" + str([Link]) + "\n"
[Link](None, "Codes alignement : ", zCodes)
Mais, au regard de l'API de QGIS, de la richesse du langage Python, une fois ce dernier maîtrisé,
des librairies et outils dédiés (« Qt ») (cf. paragraphe « Les principaux outils de développement »),, le
développement d'extensions offre des possibilités extrêmement importantes et performantes.
D'autant que contrairement à d'autres logiciels (« MapInfo » et « MapBasic »), les IHM des
extensions bénéficient de la simplicité de mise en oeuvre des formulaires « ui ».
Il est possible d' « internationaliser » son extension (au moins prévoir les appels dans le code). Mais
la traduction semble fonctionner sous le même principe que les fichiers « mo » et « po » sous
« PHP ». A savoir que dans l'absolu, il faut que la traduction de votre extension soit implémentée
sous QGIS (association des mots clefs avec la valeur en retour de la traduction).
Exemple de code :
[Link]("MainPlugin", "Hello")
Certaines fonctions de l'API QGIS retournent sont les informations dans ces formats.
Le format « QStringList » peut être utilisé comme une liste (hérite de « QList<QString>) ». Il est
possible d'obtenir sa dimension (fonction « LEN ») et de le parcourir (exemple ci-dessous) ou
d'atteindre directement un élément par un pointeur.
Exemple de code :
MyList = QgsRendererV2Registry().renderersList()
toto = "\n"
for i in range(len(MyList)):
toto = toto + str(MyList[i])+"\n"
Pour créer une variable de type « QStringList », on initialise la variable (« QStringList() »), puis pour
ajouter des éléments, on utilise la synthaxe « << ».
Exemple de code :
zQStringList = QStringList()
for i in range(len(ssLayer)):
zQStringList << ssLayer[i]
Pour une liste classique, les appels sont un peu différents : la synthaxe « {} » permert d'initialiser la
liste. L'ajout d'éléments peut se faire par la méthode « append » ou par pointeur. Les méthodes
« remove » permettent de jouer les suppressions. La classe « QList » comporte aussi une méthode
pour compter les occurrences sur une valeur.
Exemple de code :
symbs = {}
symbs[i] = zValue
[Link](zValue)
Le format « QgsStringMap » est propre à QGIS. Un exemple est donnée ci-dessous de ce type de
structuration de l'information. Les accolades marquent le début et la fin de la variable. Chaque
membre est séparé par une virgule. Chaque membre comporte un mot clef et une valeur associée
(un peu comme les dictionnaires) séparés par le caractère « : ».
Exemple de code :
Exemple de code :
MyMap = QgsStringMap()
[Link]("color", QString(QColor(0,255,0)))
[Link]("style", QString("verpattern"))
[Link]("color_border", QString(QColor(0,0,0)))
[Link]("style_border", QString("dashline"))
[Link]("width_border", QString(0.26))
Exemple de code :
Notez qu'il est tout à fait possible de personnaliser le rendu du texte bien au-delà de ce que l'IHL
« Annotations » propose (gras, italique), puisqu'un certain nombre de balises HTML est supporté.
Il peut être intéressant de parcourir l'intégralité des données attributaires d'une couche, mais le plus
souvent on cherche à atteindre les données d'un enregistrement. L'exemple ci-dessous présente ce
cas de figure avec l'usage de la méthode « featureAtId » de la classe « provider ». « feat » n'est
que le conteneur de stockage des données retournées.
Exemple de code :
vprovider = [Link]()
feat = QgsFeature()
index = [Link](nLabelFieldName)
[Link](zID,feat,True,[index])
geom = [Link]()
X = float([Link]().asPoint().x())
Y = float([Link]().asPoint().y())
Une boucle sur l'intégralité d'un jeu de données sera de la forme ci-dessous. Ici, pour déterminer les
valeurs minimum et maximum des données (la fonction « GetMinMax » retourne le couple).
Exemple de code :
feat = QgsFeature()
first = True
nFeat = [Link]()
while [Link]( feat ):
atMap = [Link]()
value = float( atMap[ zIndexField ].toDouble() [ 0 ] )
if first:
minVal = value
maxVal = value
first = False
else:
if value < minVal: minVal = value
if value > maxVal: maxVal = value
L'exemple ci-dessous montre comment créer des points issus des centroïdes des objets
géographiques parcourus.
Exemple de code :
zID = 0
provider = [Link]()
allA=[Link]()
[Link](allA)
feat = QgsFeature()
while [Link](feat):
geom = [Link]()
attrs = [Link]()
[Link](QgsGeometry([Link]()))
[Link](0, QVariant("Centroide " + str(zID)))
[Link](1, QVariant(zID))
[Link](2, QVariant([Link]().asPoint().x()))
[Link](3, QVariant([Link]().asPoint().y()))
[Link]( [ fet ] )
zID = zID + 1
zCentroideLayer = [Link]().addMapLayer(Centro)
Exemple de code :
Le code ci-dessous montre comment récupérer les ID des objets d'une couche et les placer dans un
tableau. « ids ». On retrouve la méthode « append » pour l'ajout d'éléments au tableau.
Exemple de code :
def layerIds(layer):
ids = []
p = [Link]()
allAttrs = [Link]()
[Link](allAttrs)
f = QgsFeature()
while [Link](f):
[Link]([Link]())
return ids
Exemple de code :
Dans cette forme basique, cette fonction retourne une information structurée de type
« QgsStringMap ». De plus, les « valeurs » stockées sont en fait des références aux objets champs.
Pour une meilleure lisibilité des informations, un post-traitement est indispensable.
A partir de l'exemple, précédent, le parcour d'un tableau ne se fait pas à partir des fonctions « len »
et par pointeur « index », mais par les clefs du tableau. Pour rappel, dans notre exemple, les valeurs
sont des pointeurs objets « fields » (champs). Pour récupérer le nom du champ, il suffit d'invoquer la
propriété « name » sur l'objet. Dans l'exemple ci-dessous, nous avons placé une variable de
stockage intermédiaire (nField), mais l'on peut simplement implémenter : tabfields[key].name().
Exemple de code :
tabfields = getFieldList(zLayer)
toto = ""
for key in [Link]():
nField = (tabfields[key])
toto = toto + str(key) +" : " + str([Link]()) +"\n"
[Link](None,"DEBUG", str(toto))
Notez que dans l'API de QGIS, certaines fonctions travaillent avec l'index du champ comme
paramètre, d'autre avec le nom.
Exemple de code :
Cette fonction place dans la variable « layer », la couche qui correspond au nom « myName ».
Le « rubberband » peut être vu comme une zone de représentation temporaire. Elle permet de
restituer notamment les actions de sélection par glisser / dessiner (cercles, rectangles, formes libres
à main levée ...). La fonction « reset » sur un objet « rubberband » permet de nettoyer son contenu.
Exemple de code :
[Link] = [Link]().currentLayer()
rb=QgsRubberBand([Link](),True)
[Link]()
provider = [Link]()
allA=[Link]()
[Link](allA)
feat = QgsFeature()
while [Link](feat):
geom = [Link]()
attrs = [Link]()
refX = float([Link]().asPoint().x())
refY = float([Link]().asPoint().y())
MyCenter = QgsPoint( refX, refY)
[Link](MyCenter)
Exemple de code :
def is_number(s):
#Test si la chaîne peut être convertie en nombre.
try:
float(s)
return True
except ValueError:
return False
Exemple de code :
On peut aussi dans certains cas opter pour une lecture séquentielle :
Exemple de code :
def GetTypeTable(nTable):
mytable = open(nTable, 'r')
nType=""
for line in mytable:
astring=str(QString.fromLocal8Bit(line))
astring = [Link]()
if [Link]('TYPE')!=-1:
lst = [Link]()
nType = NetStrInfos(lst[1], False, False, False, False, ("\""))
break
[Link]
if nType == "":
nType = "NATIVE"
return nType
Mais dans les faits, ce type de lecture peut aussi jouer sur la variable chargée du premier exemple
(on la parcourt comme un tableau).
Exemple de code :
Exemple de code :
Dans la programmation Python (Qt), l'encodage des couleurs utilise la fonction « Qcolor(r, g, b) ».
Les exemples ci-dessous montrent comment inverser la couleur RGB (pour obtenir BGR par
croisement des canaux B et R) ou comment passer d'une couleur RGB en valeur HexaDécimale.
Exemple de code :
def InvRGB(zColor):
zColor = long(zColor)
zInvColor = 0
if zColor<0 :
Red = 0
Green = 0
Blue = 0
else:
Red = int(zColor % 256)
Green = int(zColor // 256 % 256)
Blue = int(zColor // 256 // 256 % 256 )
zInvColor = QColor(Blue, Green, Red)
return zInvColor
def rgb_to_hex(zColor):
zColor = long(zColor)
zInvColor = 0
if zColor<0 :
r=0
g=0
b=0
else:
r = int(zColor % 256)
g = int(zColor // 256 % 256)
b = int(zColor // 256 // 256 % 256 )
rgb = (b, g, r)
hexColor = '#%02x%02x%02x' % rgb
return hexColor
QGIS ne supporte pas en entrée des fichiers sans objets. Une solution consiste à tester le contenu
du fichier en amont d'un chargment avec la librairie GDAL / OGR.
Exemple de code :
try:
from osgeo import gdal
from osgeo import osr
from [Link] import *
except:
import gdal
import osr
datasource = [Link](uLayer[cLayer])
layer = [Link]()
zFeatureCount = [Link]()
if zFeatureCount !=0:
vLayer = [Link](uLayer[cLayer],cLayer,"ogr")
11.16 - Créer des tuiles d'images avec GDAL sur un service WMS
Exemple de code :
f = file(zdestXML, "w")
[Link]("<GDAL_WMS>")
[Link](" <Service name=\"WMS\">")
[Link](" <Version>"+zVersion+"</Version>")
[Link](" <ServerUrl>"+zURL+"</ServerUrl>")
[Link](" <SRS>"+zSRS+"</SRS>")
[Link](" <ImageFormat>"+zFormatImg+"</ImageFormat>")
[Link](" <Layers>"+zLayersWMS+"</Layers>")
[Link](" <Styles>"+zStyles+"</Styles>")
[Link](" </Service>")
[Link](" <DataWindow>")
[Link](" <UpperLeftX>"+str(zBBOX0)+"</UpperLeftX>")
[Link](" <UpperLeftY>"+str(zBBOX1)+"</UpperLeftY>")
[Link](" <LowerRightX>"+str(zBBOX2)+"</LowerRightX>")
[Link](" <LowerRightY>"+str(zBBOX3)+"</LowerRightY>")
[Link](" <SizeX>"+str(zSizeW* 2 ^ 25 )+"</SizeX>")
[Link](" <SizeY>"+str(zSizeH* 2 ^ 25 )+"</SizeY>")
#[Link](" <SizeX>"+str(zSizeW)+"</SizeX>")
#[Link](" <SizeY>"+str(zSizeH)+"</SizeY>")
#[Link](" <SizeX>268435456</SizeX>")
#[Link](" <SizeY>134217728</SizeY>")
[Link](" </DataWindow>")
[Link](" <Projection>"+zSRS+"</Projection>")
[Link](" <BlockSizeX>1024</BlockSizeX>")
[Link](" <BlockSizeY>1024</BlockSizeY>")
[Link](" <BandsCount>3</BandsCount>")
[Link](" <Cache>")
[Link](" <Path>./gdalwmscache</Path>")
[Link](" <Depth>2</Depth>")
[Link](" <Extension>.jpg</Extension>")
[Link](" </Cache>")
[Link](" <MaxConnections>2</MaxConnections>")
[Link](" <Timeout>300</Timeout>")
[Link](" <OfflineMode>false</OfflineMode>")
[Link](" <AdviseRead>false</AdviseRead>")
[Link](" <ClampRequests>false</ClampRequests>")
[Link]("</GDAL_WMS>")
[Link]()
znamefile = [Link](zdestXML)
vLayer = [Link](zdestXML, znamefile)
NB : le temps de traitement peut demander plusieurs minutes. Les tuiles sont souvent de qualité
médiocre si l'emprise est trop importante. Il n'y a pas de rafraichissement des jeux d'images en
fonction des actions dans l'interface QGIS (zoom, déplacement).
L'exemple ci-dessous montre comment lancer une nouvelle mise en page avec un bloc carte «
[Link] » :
Exemple de code :
def MakeComposer(self):
[Link] = [Link]()
mapRenderer = [Link]()
[Link]().activate(0)
composerList = [Link]()
if(len(composerList) < 1):
return
composerView = composerList[0]
c = [Link]()
if(c is None):
return
[Link]([Link])
marge = 20.0
dpi = [Link]()
dpmm = dpi / 25.4
width = int(dpmm * [Link]())
height = int(dpmm * [Link]())
x, y = 10, 10
w, h = [Link]()- marge, [Link]()- marge
composerMap = QgsComposerMap(c,x,y,w,h)
[Link](composerMap)
[Link](c)
[Link](False)
[Link](composerMap)
[Link](c)
[Link](False)
Exemple de code :
Exemple de code :
#ancienne symbologie
symbols = [Link]().symbols()
symbol = symbols[0]
#nouvelle symbologie
symbols = zLayer.rendererV2().symbols()
symbol = symbols[0]
Exemple de code :
QGISVersionID = 0
try:
QGISVersionID = int(unicode( QGis.QGIS_VERSION_INT ))
except:
QGISVersionID = int(unicode( [Link] )[ 0 ])