2. Carregando projetos

Dica

Os trechos de código desta página precisam das seguintes importações se você estiver fora do console do pyqgis:

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

Às vezes, você precisa carregar um projeto existente a partir de um complemento ou (com mais frequência) ao desenvolver um aplicativo QGIS Python independente (veja: Aplicações Python).

Para carregar um projeto no aplicativo QGIS atual, você precisa criar uma instância da classe QgsProject. Esta é uma classe singleton, portanto você deve usar o método instance() para fazer isso. Você pode chamar o método read(), passando o caminho do projeto a ser carregado:

 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

Se você precisar fazer modificações no projeto (por exemplo, adicionar ou remover algumas camadas) e salvar suas alterações, chame o método write() da sua instância do projeto. O método write() também aceita um caminho opcional para salvar o projeto em um novo local:

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

Ambas as funções read() e write() retornam um valor booleano que você pode usar para verificar se a operação foi bem sucedida.

Nota

Se você estiver escrevendo um aplicativo independente do QGIS, para sincronizar o projeto carregado com a tela, é necessário instanciar uma :class:QgsLayerTreeMapCanvasBridge <qgis.gui.QgsLayerTreeMapCanvasBridge> `como no exemplo abaixo:

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. Resolvendo caminhos errados

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 helps you rewrite layers path within the project.

Its setPathPreprocessor() method allows setting a custom path pre-processor function to manipulate 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. If multiple preprocessors are set, they will be called in sequence based on the order in which they were originally set.

Alguns casos de uso:

  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:

    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)
    

Likewise, a setPathWriter() method is available for a path writer function.

Um exemplo para substituir o caminho por uma variável:

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

QgsPathResolver.setPathWriter(my_processor)

Both methods return an id that can be used to remove the pre-processor or writer they added. See removePathPreprocessor() and removePathWriter().

2.2. Uso de referências para acelerar as coisas

Em alguns casos em que você pode não precisar usar um projeto totalmente funcional, mas apenas querer acessá-lo por uma razão específica, as bandeiras podem ser úteis. Uma lista completa de bandeiras está disponível em ReadFlag. Várias bandeiras podem ser adicionadas juntas.

Como exemplo, se não nos importamos com as camadas e dados reais e simplesmente queremos acessar um projeto (por exemplo, para configurações de layout ou visualização 3D), podemos usar “FlagDontResolveLayers” para contornar a etapa de validação de dados e evitar que o diálogo de camadas ruins apareça. O seguinte pode ser feito:

readflags = QgsProject.ReadFlags()
readflags |= QgsProject.FlagDontResolveLayers
project = QgsProject()
project.read('C:/Users/ClintBarton/Documents/Projects/mysweetproject.qgs', readflags)

Para acrescentar mais bandeiras, deve-se utilizar o operador Bitwise python OR (|).