2. Cargar proyectos

Consejo

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

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

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# If you are not inside a QGIS console you first need to import
 2# qgis and PyQt classes you will use in this script as shown below:
 3from qgis.core import QgsProject
 4# Get the project instance
 5project = QgsProject.instance()
 6# Print the current project file name (might be empty in case no projects have been loaded)
 7# print(project.fileName())
 8
 9# Load another project
10project.read('testdata/01_project.qgs')
11print(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. Resolver rutas erróneas

Puede suceder que las capas cargadas en el proyecto se muevan a otra ubicación. Cuando el proyecto se vuelve a cargar, todas las rutas de las capas se rompen. La clase QgsPathResolver le ayuda a reescribir la ruta de las capas dentro del proyecto.

Su método setPathPreprocessor() permite configurar una función de preprocesador de ruta personalizada para manipular rutas y fuentes de datos antes de resolverlas en referencias de archivos o fuentes de capas.

La función del procesador debe aceptar un único argumento de cadena (que represente la ruta del archivo original o la fuente de datos) y devolver una versión procesada de esta ruta. La función de preprocesador de ruta se llama antes de cualquier controlador de capa defectuoso. Si se configuran varios preprocesadores, se llamarán en secuencia según el orden en que se configuraron originalmente.

Algunos casos de uso:

  1. reemplazar ruta desactualizada:

    def my_processor(path):
        return path.replace('c:/Users/ClintBarton/Documents/Projects', 'x:/Projects/')
    
    QgsPathResolver.setPathPreprocessor(my_processor)
    
  2. reemplace una dirección host de base de datos con una nueva:

    def my_processor(path):
        return path.replace('host=10.1.1.115', 'host=10.1.1.116')
    
    QgsPathResolver.setPathPreprocessor(my_processor)
    
  3. reemplazar credenciales de base de datos almacenada con unas nuevas:

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

Del mismo modo, un método setPathWriter() está disponible para una función de escritor de ruta.

Un ejemplo para reemplazar la ruta con una variable:

def my_processor(path):
  return path.replace('c:/Users/ClintBarton/Documents/Projects', '$projectdir$')

QgsPathResolver.setPathWriter(my_processor)

Ambos métodos devuelven un id que se puede usar para eliminar el preprocesador o escritor que agregaron. Consulte removePathPreprocessor() y removePathWriter().

2.2. Uso de banderas para acelerar las cosas

En algunos casos en los que puede que no necesite utilizar un proyecto completamente funcional, pero sólo desea acceder a él por una razón específica, las banderas pueden ser útiles. Una lista completa de banderas está disponible en ProjectReadFlag. Se pueden añadir varias banderas juntas.

Por ejemplo, si no nos importan las capas y los datos reales y simplemente queremos acceder a un proyecto (por ejemplo, para el diseño o la configuración de la vista 3D), podemos utilizar la bandera DontResolveLayers para omitir el paso de validación de datos y evitar que aparezca el diálogo de capa incorrecta. Se puede hacer lo siguiente:

readflags = Qgis.ProjectReadFlags()
readflags |= Qgis.ProjectReadFlag.DontResolveLayers
project = QgsProject()
project.read('C:/Users/ClintBarton/Documents/Projects/mysweetproject.qgs', readflags)

Para añadir más banderas se debe utilizar el operador Bitwise OR de python (|).