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': <QgsMapLayer: '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 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)>}
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
).
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)
[<QgsMapLayer: 'countries' (ogr)>]
Agora vamos adicionar algumas camadas à árvore de camadas do projeto. Existem duas maneiras de fazer isso:
Adição explícita usando as funções
addLayer()
ouinsertLayer()
: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)
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 0x7fecceb46ca8>
Map layer: <QgsMapLayer: '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:
clonando o nó existente
movendo o nó clonado para a posição desejada
excluindo o nó original
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)
|
É um pouco mais complicado mover uma camada na legenda:
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)
|
ou movê-la para um grupo existente:
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)
|
Alguns outros métodos que podem ser usados para modificar os grupos e camadas:
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)
|