Los fragmentos de código en esta página necesitan las siguientes adiciones si está fuera de la consola de pyqgis:

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

from qgis.gui import (
    QgsLayerTreeMapCanvasBridge,
)

2. Cargar proyectos

Algunas veces se necesita cargar un proyecto existente desde un complemento o (más a menudo) al desarrollar una aplicación autónoma QGIS Python (vea : Aplicaciones Python).

Para cargar un proyecto en la aplicación QGIS actual, debe crear una instancia de la clase QgsProject. Esta es una clase singleton, por lo tanto se debe usar el método instance() para realizarlo. Puede llamar su método read() y pasar la ruta para que el proyecto sea cargado:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# 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
import os
print(os.getcwd())
project.read('testdata/01_project.qgs')
print(project.fileName())
...
testdata/01_project.qgs

Si necesita hacer modificaciones a su proyecto (por ejemplo añadir o remover algunas capas) y guardar los cambios realizados, puede llamar el método write() de su instancia de proyecto. El método write() también acepta una ruta opcional para salvar el proyecto en una nueva localización:

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

Las funciones read() y write()  retornan un valor booleano que puede utilizar para verificar si la operación fue exitosa.

Nota

Si está desarrollando una aplicación QGIS autónoma, para poder mantener la sincronización entre el proyecto cargado y el lienzo, debe instanciar una :class:”QgsLayerTreeMapCanvasBridge <qgis.gui.QgsLayerTreeMapCanvasBridge>” al igual que en el ejemplo:

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. Resolving bad paths

It can happen that layers loaded in the project are moved to another location. When the project is loaded again all the layer paths are broken.

The QgsPathResolver class with the setPathPreprocessor() allows setting a custom path pre-processor function, which allows for manipulation of paths and data sources prior to resolving them to file references or layer sources.

The processor function must accept a single string argument (representing the original file path or data source) and return a processed version of this path.

The path pre-processor function is called before any bad layer handler.

Some use cases:

  1. replace an outdated path:

    def my_processor(path):
        return path.replace('c:/Users/ClintBarton/Documents/Projects', 'x:/Projects/')
    
    QgsPathResolver.setPathPreprocessor(my_processor)
    
  2. replace a database host address with a new one:

    def my_processor(path):
        return path.replace('host=10.1.1.115', 'host=10.1.1.116')
    
    QgsPathResolver.setPathPreprocessor(my_processor)
    
  3. replace stored database credentials with new ones:

    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)