De codesnippers op deze pagina hebben de volgende import nodig als u buiten de console van PyQGIS bent:
from qgis.core import (
QgsProject,
QgsVectorLayer,
)
Toegang tot de inhoudsopgave (TOC)¶
U kunt verschillende klassen gebruiken om toegang te verkrijgen tot alle geladen lagen in de inhoudsopgave en ze gebruiken om informatie op te halen:
De klasse QgsProject¶
U kunt QgsProject
gebruiken om informatie op te halen over de inhoudsopgave en alle geladen lagen.
U moet een instance
van QgsProject
maken en de methoden daarvan gebruiken om de geladen lagen op te halen.
De belangrijkste methode is mapLayers()
. Het zal een woordenboek teruggeven van de geladen lagen:
layers = QgsProject.instance().mapLayers()
print(layers)
{'countries_89ae1b0f_f41b_4f42_bca4_caf55ddbe4b6': <QgsMapLayer: 'countries' (ogr)>}
De keys
in het woordenboek zijn de unieke laag-ID’s, terwijl de values
de gerelateerde objecten zijn.
Het is nu rechtdoorzee om alle andere informatie over de lagen op te halen:
1 2 3 4 5 6 7 8 | # list of layer names using list comprehension
l = [layer.name() for layer in QgsProject.instance().mapLayers().values()]
# dictionary with key = layer name and value = layer object
layers_list = {}
for l in QgsProject.instance().mapLayers().values():
layers_list[l.name()] = l
print(layers_list)
|
{'countries': <QgsMapLayer: 'countries' (ogr)>}
U kunt ook de inhoudsopgave bevragen met de naam van de laag:
country_layer = QgsProject.instance().mapLayersByName("countries")[0]
Notitie
Een lijst met alle overeenkomende lagen wordt teruggegeven, dus maken we een index met [0]
om de eerste laag met zijn naam op te halen.
klasse QgsLayerTreeGroup¶
De boom met lagen is een klassieke boomstructuur, gebouwd uit knopen. Er zijn momenteel twee groepen knopen: groepsknopen (QgsLayerTreeGroup
) en laagknopen (QgsLayerTreeLayer
).
Toegang tot de boom met lagen van het project kan gemakkelijk worden verkregen met de methode layerTreeRoot()
van de klasse QgsProject
:
root = QgsProject.instance().layerTreeRoot()
root
is een groepsknoop en heeft children:
root.children()
Een lijst met directe kinderen wordt teruggegeven. Toegang tot kinderen van een subgroep zou moeten worden verkregen via hun eigen directe ouder.
We kunnen een van de kinderen ophalen:
child0 = root.children()[0]
print(child0)
<qgis._core.QgsLayerTreeLayer object at 0x7f1e1ea54168>
Lagen kunnen ook worden opgehaald met hun (unieke) id
:
ids = root.findLayerIds()
# access the first layer of the ids list
root.findLayer(ids[0])
En naar groepen kan ook worden gezocht met hun namen:
root.findGroup('Group Name')
QgsLayerTreeGroup
heeft nog veel meer nuttige methoden die kunnen worden gebruikt om meer informatie op te halen over de inhoudsopgave:
# list of all the checked layers in the TOC
checked_layers = root.checkedLayers()
print(checked_layers)
[<QgsMapLayer: 'countries' (ogr)>]
Laten we nu enkele lagen toevoegen aan de boom met lagen van het project. Er zijn twee manieren om dat te doen:
Expliciete toevoeging met de functies
addLayer()
ofinsertLayer()
:1 2 3 4 5 6
# create a temporary layer layer1 = QgsVectorLayer("path_to_layer", "Layer 1", "memory") # add the layer to the legend, last position root.addLayer(layer1) # add the layer at given position root.insertLayer(5, layer1)
Impliciete toevoeging: omdat de boom met lagen van het project is verbonden met het register van de lagen is het voldoende om een laag toe te voegen aan het register met kaartlagen:
QgsProject.instance().addMapLayer(layer1)
U kunt gemakkelijk schakelen tussen QgsVectorLayer
en QgsLayerTreeLayer
:
node_layer = root.findLayer(country_layer.id())
print("Layer node:", node_layer)
print("Map layer:", node_layer.layer())
Layer node: <qgis._core.QgsLayerTreeLayer object at 0x7fecceb46ca8>
Map layer: <QgsMapLayer: 'countries' (ogr)>
Groepen kunnen worden toegevoegd met de methode addGroup()
. In het voorbeeld hieronder, zal de eerste een groep toevoegen aan het einde van de inhoudsopgave, terwijl u met de laatste een andere groep kan toevoegen binnen een bestaande:
node_group1 = root.addGroup('Simple Group')
# add a sub-group to Simple Group
node_subgroup1 = node_group1.addGroup("I'm a sub group")
Er zijn vele nuttige methoden om knopen en groepen te verplaatsen.
Verplaatsen van een bestaande knoop wordt gedaan in drie stappen:
klonen van de bestaande knoop
verplaatsen van de gekloonde knoop naar de gewenste positie
verwijderen van de originele knoop
1 2 3 4 5 6 | # clone the group
cloned_group1 = node_group1.clone()
# move the node (along with sub-groups and layers) to the top
root.insertChildNode(0, cloned_group1)
# remove the original node
root.removeChildNode(node_group1)
|
Het is iets meer gecompliceerder om een laag in de legenda te verplaatsen:
1 2 3 4 5 6 7 8 9 10 11 12 | # get a QgsVectorLayer
vl = QgsProject.instance().mapLayersByName("countries")[0]
# create a QgsLayerTreeLayer object from vl by its id
myvl = root.findLayer(vl.id())
# clone the myvl QgsLayerTreeLayer object
myvlclone = myvl.clone()
# get the parent. If None (layer is not in group) returns ''
parent = myvl.parent()
# move the cloned layer to the top (0)
parent.insertChildNode(0, myvlclone)
# remove the original myvl
root.removeChildNode(myvl)
|
of om hem naar een bestaande groep te verplaatsen:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | # get a QgsVectorLayer
vl = QgsProject.instance().mapLayersByName("countries")[0]
# create a QgsLayerTreeLayer object from vl by its id
myvl = root.findLayer(vl.id())
# clone the myvl QgsLayerTreeLayer object
myvlclone = myvl.clone()
# create a new group
group1 = root.addGroup("Group1")
# get the parent. If None (layer is not in group) returns ''
parent = myvl.parent()
# move the cloned layer to the top (0)
group1.insertChildNode(0, myvlclone)
# remove the QgsLayerTreeLayer from its parent
parent.removeChildNode(myvl)
|
Enkele andere methoden die kunnen worden gebruikt om groepen en lagen aan te passen:
1 2 3 4 5 6 7 8 9 10 11 12 | node_group1 = root.findGroup("Group1")
# change the name of the group
node_group1.setName("Group X")
node_layer2 = root.findLayer(country_layer.id())
# change the name of the layer
node_layer2.setName("Layer X")
# change the visibility of a layer
node_group1.setItemVisibilityChecked(True)
node_layer2.setItemVisibilityChecked(False)
# expand/collapse the group view
node_group1.setExpanded(True)
node_group1.setExpanded(False)
|