Viktigt

Översättning är en gemenskapsinsats du kan gå med i. Den här sidan är för närvarande översatt till 100.00%.

4. Tillgång till innehållsförteckningen (TOC)

Råd

Kodsnuttarna på den här sidan behöver följande import om du befinner dig utanför pyqgis-konsolen:

from qgis.core import (
    QgsProject,
    QgsVectorLayer,
)

Du kan använda olika klasser för att komma åt alla laddade lager i TOC och använda dem för att hämta information:

4.1. Klassen QgsProject

Du kan använda QgsProject för att hämta information om TOC och alla skikt som laddats.

Du måste skapa en instans av QgsProject och använda dess metoder för att hämta de laddade lagren.

Huvudmetoden är mapLayers(). Den returnerar en ordbok med de laddade lagren:

layers = QgsProject.instance().mapLayers()
print(layers)
{'countries_89ae1b0f_f41b_4f42_bca4_caf55ddbe4b6': <QgsVectorLayer: 'countries' (ogr)>}

Ordbokens ”nycklar” är de unika lager-ID:n medan ”värdena” är de relaterade objekten.

Det är nu enkelt att få fram all annan information om lagren:

1# list of layer names using list comprehension
2l = [layer.name() for layer in QgsProject.instance().mapLayers().values()]
3# dictionary with key = layer name and value = layer object
4layers_list = {}
5for l in QgsProject.instance().mapLayers().values():
6  layers_list[l.name()] = l
7
8print(layers_list)
{'countries': <QgsVectorLayer: 'countries' (ogr)>}

Du kan också söka i TOC med hjälp av skiktets namn:

country_layer = QgsProject.instance().mapLayersByName("countries")[0]

Observera

En lista med alla matchande lager returneras, så vi indexerar med [0] för att få det första lagret med det här namnet.

4.2. Klassen QgsLayerTreeGroup

Lagerträdet är en klassisk trädstruktur som är uppbyggd av noder. Det finns för närvarande två typer av noder: gruppnoder (QgsLayerTreeGroup) och skiktnoder (QgsLayerTreeLayer).

Observera

för mer information kan du läsa dessa blogginlägg av Martin Dobias: Del 1 Del 2 Del 3

Projektets lagerträd kan enkelt nås med metoden layerTreeRoot() i klassen QgsProject:

root = QgsProject.instance().layerTreeRoot()

root är en gruppnod och har barn:

root.children()

En lista över direkta barn returneras. Undergruppsbarn bör nås från sin egen direkta förälder.

Vi kan hämta ett av barnen:

child0 = root.children()[0]
print(child0)
<QgsLayerTreeLayer: countries>

Lager kan också hämtas med hjälp av deras (unika) id:

ids = root.findLayerIds()
# access the first layer of the ids list
root.findLayer(ids[0])

Och grupper kan också sökas med hjälp av sina namn:

root.findGroup('Group Name')

QgsLayerTreeGroup har många andra användbara metoder som kan användas för att få mer information om TOC:

# list of all the checked layers in the TOC
checked_layers = root.checkedLayers()
print(checked_layers)
[<QgsVectorLayer: 'countries' (ogr)>]

Låt oss nu lägga till några lager i projektets lagerträd. Det finns två sätt att göra det på:

  1. Explicit tillägg med hjälp av funktionerna addLayer() eller insertLayer():

    1# create a temporary layer
    2layer1 = QgsVectorLayer("path_to_layer", "Layer 1", "memory")
    3# add the layer to the legend, last position
    4root.addLayer(layer1)
    5# add the layer at given position
    6root.insertLayer(5, layer1)
    
  2. Implicit tillägg: eftersom projektets lagerträd är kopplat till lagerregistret räcker det med att lägga till ett lager i kartlagerregistret:

    QgsProject.instance().addMapLayer(layer1)
    

Du kan enkelt växla mellan QgsVectorLayer och QgsLayerTreeLayer:

node_layer = root.findLayer(country_layer.id())
print("Layer node:", node_layer)
print("Map layer:", node_layer.layer())
Layer node: <QgsLayerTreeLayer: countries>
Map layer: <QgsVectorLayer: 'countries' (ogr)>

Grupper kan läggas till med metoden addGroup(). I exemplet nedan kommer den förra att lägga till en grupp i slutet av TOC medan du för den senare kan lägga till en annan grupp inom en befintlig:

node_group1 = root.addGroup('Simple Group')
# add a sub-group to Simple Group
node_subgroup1 = node_group1.addGroup("I'm a sub group")

För att flytta noder och grupper finns det många användbara metoder.

Att flytta en befintlig nod görs i tre steg:

  1. kloning av den befintliga noden

  2. flytta den klonade noden till önskad position

  3. radera den ursprungliga noden

1# clone the group
2cloned_group1 = node_group1.clone()
3# move the node (along with sub-groups and layers) to the top
4root.insertChildNode(0, cloned_group1)
5# remove the original node
6root.removeChildNode(node_group1)

Det är lite mer komplicerat att flytta runt ett lager i legenden:

 1# get a QgsVectorLayer
 2vl = QgsProject.instance().mapLayersByName("countries")[0]
 3# create a QgsLayerTreeLayer object from vl by its id
 4myvl = root.findLayer(vl.id())
 5# clone the myvl QgsLayerTreeLayer object
 6myvlclone = myvl.clone()
 7# get the parent. If None (layer is not in group) returns ''
 8parent = myvl.parent()
 9# move the cloned layer to the top (0)
10parent.insertChildNode(0, myvlclone)
11# remove the original myvl
12root.removeChildNode(myvl)

eller flytta den till en befintlig grupp:

 1# get a QgsVectorLayer
 2vl = QgsProject.instance().mapLayersByName("countries")[0]
 3# create a QgsLayerTreeLayer object from vl by its id
 4myvl = root.findLayer(vl.id())
 5# clone the myvl QgsLayerTreeLayer object
 6myvlclone = myvl.clone()
 7# create a new group
 8group1 = root.addGroup("Group1")
 9# get the parent. If None (layer is not in group) returns ''
10parent = myvl.parent()
11# move the cloned layer to the top (0)
12group1.insertChildNode(0, myvlclone)
13# remove the QgsLayerTreeLayer from its parent
14parent.removeChildNode(myvl)

Några andra metoder som kan användas för att modifiera grupper och lager:

 1node_group1 = root.findGroup("Group1")
 2# change the name of the group
 3node_group1.setName("Group X")
 4node_layer2 = root.findLayer(country_layer.id())
 5# change the name of the layer
 6node_layer2.setName("Layer X")
 7# change the visibility of a layer
 8node_group1.setItemVisibilityChecked(True)
 9node_layer2.setItemVisibilityChecked(False)
10# expand/collapse the group view
11node_group1.setExpanded(True)
12node_group1.setExpanded(False)