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

from qgis.core import (
    QgsProject,
    QgsVectorLayer,
)

4. Acessando o sumário (TOC)

Você pode usar diferentes classes para acessar todas as camadas carregadas no sumário e usá-las para recuperar informações:

4.1. A classe QgsProject

Você pode usar QgsProject para recuperar informações sobre o sumário e todas as camadas carregadas.

Você precisa criar uma instância de QgsProject e usar seus métodos para obter as camadas carregadas.

O método principal é mapLayers(). Ele retornará um dicionário das camadas carregadas:

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

As chaves de dicionário são os IDs exclusivos da camada, enquanto os valores são os objetos relacionados.

Agora é fácil obter qualquer outra informação sobre as camadas:

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)>}

Você também pode consultar o sumário usando o nome da camada

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

Nota

Uma lista com todas as camadas correspondentes é retornada, portanto indexamos com [0] para obter a primeira camada com esse nome.

4.2. Classe QgsLayerTreeGroup

A árvore de camadas é uma estrutura de árvore clássica construída de nós. Atualmente, existem dois tipos de nós: nós de grupo (QgsLayerTreeGroup) e nós de camada (QgsLayerTreeLayer).

Nota

para mais informações, você pode ler essas postagens de Martin Dobias: Parte 1 Parte 2 Parte 3

A árvore da camada do projeto pode ser acessada facilmente com o método layerTreeRoot() da classe QgsProject:

root = QgsProject.instance().layerTreeRoot()

root é um nó de grupo e tem filhos:

root.children()

Uma lista de filhos diretos é retornada. Os filhos do subgrupo devem ser acessados ​​de seus próprios pais diretos.

Podemos recuperar um dos filhos:

child0 = root.children()[0]
print(child0)
<qgis._core.QgsLayerTreeLayer object at 0x7f1e1ea54168>

As camadas também podem ser recuperadas usando seu (único) id:

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

E os grupos também podem ser pesquisados ​​usando seus nomes:

root.findGroup('Group Name')

QgsLayerTreeGroup possui muitos outros métodos úteis que podem ser usados ​​para obter mais informações sobre o sumário:

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

Agora vamos adicionar algumas camadas à árvore de camadas do projeto. Existem duas maneiras de fazer isso:

  1. Adição explícita usando as funções addLayer() ou 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. Adição implícita: como a árvore da camada do projeto está conectada ao registro da camada, basta adicionar uma camada ao registro da camada do mapa:

    QgsProject.instance().addMapLayer(layer1)
    

Você pode alternar entre QgsVectorLayer e QgsLayerTreeLayer facilmente:

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 0x7f24423175e0>
Map layer: <QgsVectorLayer: 'countries' (ogr)>

Grupos podem ser adicionados com o método addGroup(). No exemplo abaixo, o primeiro adicionará um grupo ao final do sumário, enquanto no último você poderá adicionar outro grupo dentro de um existente:

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

Para mover nós e grupos, existem muitos métodos úteis.

A movimentação de um nó existente é feita em três etapas:

  1. clonando o nó existente

  2. movendo o nó clonado para a posição desejada

  3. excluindo o nó original

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)

É um pouco mais complicado mover uma camada na legenda:

 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)

ou movê-la para um grupo existente:

 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)

Alguns outros métodos que podem ser usados ​​para modificar os grupos e camadas:

 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)