Skip to Content

Qgis 2 : changement de l'API python


Vous attendez sûrement avec impatience la sortie de Qgis 2 : de nombreuses nouveautés, des performances d'affichage améliorées...

Mais attention, l'API de programmation Qgis a été modifiée en profondeur (comme d'habitude, merci à Gene du forumsig de nous tenir informés).

Conséquence, la quasi-totalité des plugins python seront incompatibles avec cette nouvelle version ! Il va donc falloir attendre les mises à jour de plugin ou adapter vos plugins si vous en avez développés !

Même si la sortie du prochain Qgis a été repoussée (en septembre à priori), n'hésitez pas à vous plonger dès maintenant dans cette problématique en faisant des tests sur la version master (version de développement du prochain Qgis)!

Formulaire personnalisés de saisie/consultation et fonction d'initialisation

Autre grosse conséquence, l'appel des fonctions d'initialisation python des formulaires personnalisés de couche a changé (en bien et en plus simple bien sûr). Si vous en avez, il vous faudra toutes les modifier en conséquence (en plus des autres éventuels changements induits par les changements de pyQgis). Je vous rassure ce changement est léger (et pratique) puisque la fonction d'initialisation recevra maintenant directement l'objet QgsVectorLayer et l'objet QgsFeature (au lieu de l'index de la couche et de l'index du feature) ce qui permettra une simplification bienvenue.

Les changements de l'API :

Ces changements sont importants mais vont vers une simplification bienvenue.

http://hub.qgis.org/wiki/quantum-gis/Python_plugin_API_changes_from_18_t...

Parmi ces changement, voici les points les plus marquants.

Passage à des types python plutôt que des types Qt (QString, QVariant...)

Ce changement est majeur et a énormément d'impact. Il cause en effet de très nombreuses incompatibilités pour les codes existants. Néanmoins, c'est une excellente nouvelle puisque cela va encore dans le sens d'une forte simplification en s'affranchissant des objets QT et en revenant vers du "vrai" python. Vous allez enfin pouvoir vous passer des .toString() et autres conversions désagréables !

Un petit exemple avec la méthode uniqueValues de la classe QgsVectorLayer. Cette méthode permet de récupérer les valeurs uniques d'un champ. Jusqu'à maintenant, vous auriez obtenu une liste d'objet Qvariant et auriez été obligé de les convertir en string par code (pour les écrire dans un fichier texte par exemple) :

valeurs_uniques = ma_couche.uniqueValues(2)
valeurs_uniques_string = [val.toString() for val in valeurs_uniques] 

Maintenant, il vous suffira d'un simple :

valeurs_uniques_string = ma_couche.uniqueValues(2)

pour obtenir une liste de string (si la colonne d'index 2 est une colonne texte).

Boucler sur les features d'une couche

Jusqu'à maintenant, il vous fallait préparer une sélection sur la couche, la rendant ainsi itérable grâce à une boucle for ou par la méthode nextFeature.

layer.select()
f = QgsFeature() 
while layer.nextFeature(f):
        pass

Ou plus propre et efficace

layer.select()
for f in layer:
        pass

Maintenant, la manipulation se fait explicitement avec un itérateur/générateur :

iterateur = layer.getFeatures()
for f in iterateur:
        pass

ou directement

for f in layer.getFeatures():
        pass

Accéder aux attributs d'un feature

Pour accéder aux attributs d'un feature, il vous fallait récupérer l'index du champ, boucler sans oublier de préciser les champs à inclure (sinon le feature ne contient pas les attributs) puis récupérer l'ensemble des valeurs (par attributesMap()) et accéder à l'attribut par l'index (sans oublier de gérer le retour en variable Qt) :

index = layer.fieldNameIndex(fieldname)
layer.select(layer.attributeIndexes())
for f in layer:
        fieldvalue=f.attributeMap()[index].toString())

Maintenant, il vous suffit d'y accéder directement (et cela renvoie un type python)

for f in layer.getFeatures():
        fieldvalue = f[fieldname]

Changement des métadonnées de plugin python

Les métadonnées ne doivent plus être intégrées au init mais directement dans un fichier texte spécifique. Vous pouvez vous référer au lien des changements pour plus de détails.

Rendre un plugin compatible avec Qgis 1.8 et 2.0 ?

Cela serait théoriquement possible en détectant la version de Qgis et en lançant du code différent selon les cas.

C'est évidemment à proscrire car cela comporte beaucoup de risques et complique sérieusement la maintenance du code!

Si vous devez vraiment faire un plugin compatibles avec Qgis 1.x, autant faire 2 plugins séparés

Enfin, pour finir, voilà 2 nouveautés de Qgis en rapport avec le python

  • Une console python très modifiée et bien plus pratique
  • La possibilité d'enregistrer des "macros" python dans un projet (exécutées à l'ouverture, à la sauvegarde ou à la fermeture)

Si vous souhaitez réagir ou échanger sur cette problématique, rendez vous sur le forum, par exemple dans la discussion ouverte par Gene :

http://www.forumsig.org/showthread.php/36042-Nouvel-API-Python-dans-la-v...


Site officiel : Qgis
Site officiel : Qgis : changements de l'API
Site officiel : Qgis : méthodes dépréciées

Commentaires

QGIS 2 et Python

Il serait intéressant de préciser si QGIS passe à Python 3 ou reste à Python 2.

Quelle version de python ?

Pour l'instant on reste en python 2 mais j'ai cru voir dans une discussion des développeurs que le passage en version 3 était prévu. A confirmer donc !

Les plugins compatibles avec Qgis 2.0

Bonjour à tous,

L'adresse du dépôt de plugins pour la version 2 est la même mais en rajoutant un paramètre dans l'url :

http://plugins.qgis.org/plugins/plugins.xml?qgis=2.0

Vous pouvez donc y consulter la liste des plugins compatibles avec la version 2.0.

 

Pour rappel, le dépôt des plugins pour version < 2.0 :

http://plugins.qgis.org/plugins/plugins.xml

Commentaires

Je suis très ravis d'apprendre que QGIS2 est déjà au point et n'attend que découvrir ses performances et autres observations que je ne manquerai pas de faire part à l'équipe qui travaille dessus sans relâche;

Je parue que cette nouvelle version complétera la 1.8; encore une fois bravooooooo!

Poster un nouveau commentaire

Le contenu de ce champ sera maintenu privé et ne sera pas affiché publiquement.