2. Caricamento Progetti

Suggerimento

I frammenti di codice di questa pagina necessitano delle seguenti importazioni se si è fuori dalla console pyqgis:

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

Ti può capitare di dovere caricare un progetto esistente da un plugin o (più spesso) quando stai sviluppando un’applicazione QGIS Python autonoma (see: Applicazioni Python).

Per caricare un progetto nell’applicazione QGIS corrente devi creare un’istanza della classe QgsProject. Questa è una classe singleton, quindi devi utilizzare il suo metodo instance() per farlo. Puoi chiamare il suo metodo read(), indicando il percorso del progetto da caricare:

 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 vuoi modificare il progetto (ad esempio per aggiungere o rimuovere dei layer) e salvare le modifiche, chiama il metodo write() dell’istanza del progetto. Il metodo write() accetta anche un nuovo percorso per salvare il progetto in una nuova posizione:

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

Sia la funzione read() che quella write() restituiscono un valore booleano che puoi utilizzare per verificare se l’operazione ha avuto esito positivo.

Nota

Se stai scrivendo un’applicazione QGIS, per sincronizzare il progetto caricato con l’area di mappa, devi creare un’istanza di QgsLayerTreeMapCanvasBridge come nell’esempio seguente:

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. Risoluzione di percorsi errati

Può accadere che i layer caricati nel progetto vengano spostati in un’altra posizione. Quando il progetto viene caricato di nuovo, tutti i percorsi dei layer sono interrotti. La classe QgsPathResolver aiuta a riscrivere il percorso dei layer all’interno del progetto.

Il suo metodo setPathPreprocessor() permette di impostare una funzione di pre-processore del percorso personalizzata per manipolare i percorsi e le fonti di dati prima di risolverli in riferimenti di file o origini layer.

La funzione di elaborazione deve accettare un singolo argomento stringa (che rappresenta il percorso del file originale o l’origine dei dati) e restituire una versione elaborata di questo percorso. La funzione di preprocessore del percorso viene chiamata prima di qualsiasi gestore di layer errato. Se sono impostati più preprocessori, essi verranno richiamati in sequenza, in base all’ordine in cui sono stati originariamente impostati.

Alcuni casi d’uso:

  1. sostituire un percorso obsoleto:

    def my_processor(path):
        return path.replace('c:/Users/ClintBarton/Documents/Projects', 'x:/Projects/')
    
    QgsPathResolver.setPathPreprocessor(my_processor)
    
  2. sostituire un indirizzo host del database con uno nuovo:

    def my_processor(path):
        return path.replace('host=10.1.1.115', 'host=10.1.1.116')
    
    QgsPathResolver.setPathPreprocessor(my_processor)
    
  3. sostituire le credenziali del database memorizzate con quelle nuove:

    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)
    

Allo stesso modo, è disponibile un metodo setPathWriter() per una funzione di scrittura del percorso.

Un esempio per sostituire il percorso con una variabile:

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

QgsPathResolver.setPathWriter(my_processor)

Entrambi i metodi restituiscono un ``id”” che può essere usato per rimuovere il preprocessore o lo scritto che hanno aggiunto. Vedere removePathPreprocessor() e removePathWriter().

2.2. Usare dei flag per velocizzare le cose

In alcuni casi in cui non è necessario utilizzare un progetto completamente funzionante, ma si desidera accedervi solo per un motivo specifico, i flag possono essere utili. Un elenco completo di flag è disponibile sotto ProjectReadFlag. È possibile cumulare più flag.

Ad esempio, se non ci interessano i layer e i dati effettivi e vogliamo semplicemente accedere a un progetto (ad esempio per il layout o le impostazioni della vista 3D), possiamo usare il flag DontResolveLayers per bypassare la fase di convalida dei dati e impedire che appaia la finestra di dialogo dei layer errati. Si può fare come segue:

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

Per aggiungere altri flag è necessario utilizzare l’operatore OR Bitwise di python (|).