Les extraits de code sur cette page nécessitent les importations suivantes si vous êtes en dehors de la console pyqgis :

1
2
3
4
5
6
7
8
from qgis.core import (
    QgsProject,
    QgsPathResolver
)

from qgis.gui import (
    QgsLayerTreeMapCanvasBridge,
)

2. Chargement de projets

Vous avez parfois besoin de charger un projet existant depuis une extension ou (le plus souvent) lorsque vous développez une application QGIS autonome (voir Applications Python).

Pour charger un projet dans l’application QGIS courante, vous devez créer une instance de la classe QgsProject. C’est un objet singleton, ce qui vous impose d’utiliser sa méthode instance(). Vous pouvez appeler sa méthode read(), en lui passant le chemin du projet à charger:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# If you are not inside a QGIS console you first need to import
# qgis and PyQt classes you will use in this script as shown below:
from qgis.core import QgsProject
# Get the project instance
project = QgsProject.instance()
# Print the current project file name (might be empty in case no projects have been loaded)
# print(project.fileName())

# Load another project
project.read('testdata/01_project.qgs')
print(project.fileName())
testdata/01_project.qgs

Si vous avez besoin de réaliser des modifications du projet (par exemple ajouter ou supprimer des couches) et de sauver vos changements, appelez la méthode write() de votre instance de projet. La méthode write() accepte également un chemin en option pour sauvegarder le projet à un nouvel emplacement:

# Save the project to the same
project.write()
# ... or to a new file
project.write('testdata/my_new_qgis_project.qgs')

Les deux fonctions read() et write() renvoient une valeur booléenne qui peut être utilisée pour vérifier que l’opération a réussi.

Note

Si vous codez une application QGIS autonome, afin de synchroniser le projet chargé avec le canevas il vous faut instancier QgsLayerTreeMapCanvasBridge comme dans l’exemple ci dessous:

bridge = QgsLayerTreeMapCanvasBridge( \
         QgsProject.instance().layerTreeRoot(), canvas)
# Now you can safely load your project and see it in the canvas
project.read('testdata/my_new_qgis_project.qgs')

2.1. Résoudre les mauvais chemins

Il peut arriver que des couches chargées dans le projet soient déplacées vers un autre endroit. Lorsque le projet est rechargé, tous les chemins des couches sont brisés.

La classe QgsPathResolver avec la classe setPathPreprocessor() permet de définir une fonction de préprocesseur de chemin personnalisé, qui permet de manipuler les chemins et les sources de données avant de les résoudre en références de fichiers ou sources de couches.

La fonction de traitement doit accepter un argument de type chaîne de caractères unique (représentant le chemin d’accès au fichier ou la source de données d’origine) et renvoyer une version traitée de ce chemin.

La fonction de pré-processeur de chemin est appelée avant tout gestionnaire de mauvaise couche.

Quelques cas d’utilisation :

  1. remplacer un chemin qui n’est plus bon :

    def my_processor(path):
        return path.replace('c:/Users/ClintBarton/Documents/Projects', 'x:/Projects/')
    
    QgsPathResolver.setPathPreprocessor(my_processor)
    
  2. remplacer une adresse d’hôte de base de données par une nouvelle :

    def my_processor(path):
        return path.replace('host=10.1.1.115', 'host=10.1.1.116')
    
    QgsPathResolver.setPathPreprocessor(my_processor)
    
  3. remplacer les ids stockés dans la base de données par de nouveaux ids :

    1
    2
    3
    4
    5
    6
    def my_processor(path):
        path= path.replace("user='gis_team'", "user='team_awesome'")
        path = path.replace("password='cats'", "password='g7as!m*'")
        return path
    
    QgsPathResolver.setPathPreprocessor(my_processor)