2. Projecten laden

Hint

De codesnippers op deze pagina hebben de volgende import nodig als u buiten de console van PyQGIS bent:

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

Soms moet u een bestaand project uit een plug-in laden of (nog vaker) bij het ontwikkelen van een zelfstandige toepassing in Python voor QGIS (zie: Toepassingen in Python).

U dient een instance te maken van de klasse QgsProject om een project in de huiidge toepassing QGIS te laden . Dit is een klasse singleton, dus u moet eerst de methode instance() ervan gebruiken om dat te doen. U kunt de methode read() ervan aanroepen, waarin het pad van het te laden project wordt doorgegeven:

 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

Als u aanpassingen moet maken aan het project (bijvoorbeeld enige lagen toevoegen of verwijderen) en uw wijzigingen opslaan, roep de methode write() van uw instance voor het project aan. De methode write() accepteert ook een optioneel pad voor het opslaan van het project op een nieuwe locatie:

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

Beide functies read() en write() geven een Booleaanse waarde terug die u kunt gebruiken om te controleren of de bewerking succesvol was.

Notitie

U dient, als u een zelfstandige toepassing voor QGIS schrijft, een klasse QgsLayerTreeMapCanvasBridge te instantiëren zoals in het voorbeeld hieronder om het geladen project te synchroniseren met het kaartvenster:

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. Slechte paden oplossen

Het kan gebeuren dat lagen die zijn geladen in het project worden verplaatst naar een andere locatie. Wanneer het project opnieuw wordt geladen zijn alle paden naar lagen verbroken. De klasse QgsPathResolver helpt u het pad naar de lagen in het project opnieuw te schrijven.

Zijn methode setPathPreprocessor() stelt u in staat een aangepaste functie pre-processor in te stellen voor het bewerken van paden en gegevensbronnen, voordat worden verbonden aan bestandsverwijzingen of bronnen van lagen.

De processor-functie moet één enkel argument tekenreeks accepteren (die het originele bestandspad of databron weergeeft) en geeft een verwerkte versie van dit pad terug. De functie pre-processor voor het pad wordt aangeroepen voor enige afhandeling van een slechts laag. Als meerdere pre-processors zijn ingesteld, zullen zij in een reeks worden aangeroepen, gebaseerd op de volgorde waarin zij origineel werden ingesteld.

Enkele gebruiksgevallen:

  1. een verouderd pad vervangen:

    def my_processor(path):
        return path.replace('c:/Users/ClintBarton/Documents/Projects', 'x:/Projects/')
    
    QgsPathResolver.setPathPreprocessor(my_processor)
    
  2. het hostadres van een database vervangen door een nieuw:

    def my_processor(path):
        return path.replace('host=10.1.1.115', 'host=10.1.1.116')
    
    QgsPathResolver.setPathPreprocessor(my_processor)
    
  3. opgeslagen inloggegevens voor een database vervangen door nieuwe:

    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)
    

Op dezelfde wijze is een methode setPathWriter() beschikbaar als een functie om het pad te schrijven.

Een voorbeeld om het pad te vervangen met een variabele:

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

QgsPathResolver.setPathWriter(my_processor)

Beide methoden geven een id terug die kan worden gebruikt om de pre-processor of schrijver die zij hebben toegevoegd, te verwijderen Bekijk removePathPreprocessor() en removePathWriter().

2.2. Vlaggen gebruiken om dingen te versnellen

In sommige gevallen, waarin u niet een volledig functioneel project zou hoeven te gebruiken, maar alleen toegang wilt voor een specifieke reden, kunnen vlaggen nuttig zijn. Een volledige lijst met vlaggen is beschikbaar onder ProjectReadFlag. Meerdere vlaggen mogen tegelijkertijd worden toegevoegd.

Als een voorbeeld: als we niet geven om de feitelijke lagen en gegevens en eenvoudigweg toegang tot een project willen (bijv. voor lay-out of instellingen voor 3D-weergave), kunnen we de vlag DontResolveLayers gebruiken om de stap voor het valideren van gegevens te omzeilen en te voorkomen dat het dialoogvenster voor slechte lagen verschijnt. Het volgende kan worden gedaan:

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

Voor het toevoegen van meer vlaggen moet de Python Bitwise OR-operator (|) worden gebruikt.