4. 访问目录(TOC)
提示
如果您在pyqgis控制台之外,则此页面上的代码片段需要以下导入:
from qgis.core import (
QgsProject,
QgsVectorLayer,
)
您可以使用不同的类访问TOC中加载的所有层,并使用它们来检索信息:
4.1. QgsProject类
您可以使用 QgsProject
以检索有关TOC和加载的所有层的信息。
您必须创建一个 instance
的 QgsProject
并使用它的方法来获取加载的层。
主要的方法是 mapLayers()
。它将返回已加载的层的字典:
layers = QgsProject.instance().mapLayers()
print(layers)
{'countries_89ae1b0f_f41b_4f42_bca4_caf55ddbe4b6': <QgsVectorLayer: 'countries' (ogr)>}
这本词典 keys
是唯一的层ID,而 values
是相关的对象。
现在可以直接获取有关层的任何其他信息:
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)>}
您也可以使用层的名称来查询TOC:
country_layer = QgsProject.instance().mapLayersByName("countries")[0]
备注
返回一个包含所有匹配层的列表,因此我们使用 [0]
以获得具有此名称的第一个层。
4.2. QgsLayerTreeGroup类
层树是一种由节点构成的经典树形结构。当前有两种类型的节点:组节点 (QgsLayerTreeGroup
)和层节点 (QgsLayerTreeLayer
)。
该方法可以方便地访问项目层树 layerTreeRoot()
的 QgsProject
班级:
root = QgsProject.instance().layerTreeRoot()
root
是组节点,并且具有 children :
root.children()
返回直接子对象的列表。子组子项应从其自己的直接父项访问。
我们可以找到其中一个孩子:
child0 = root.children()[0]
print(child0)
<QgsLayerTreeLayer: countries>
也可以使用其(唯一)检索图层 id
:
ids = root.findLayerIds()
# access the first layer of the ids list
root.findLayer(ids[0])
还可以使用组的名称来搜索组:
root.findGroup('Group Name')
QgsLayerTreeGroup
有许多其他有用的方法可用于获取有关TOC的更多信息:
# list of all the checked layers in the TOC
checked_layers = root.checkedLayers()
print(checked_layers)
[<QgsVectorLayer: 'countries' (ogr)>]
现在,让我们向项目的层树中添加一些层。有两种方法可以做到这一点:
Explicit addition 使用
addLayer()
或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)
Implicit addition :由于项目的层树连接到层注册表,因此向地图层注册表添加一个层就足够了:
QgsProject.instance().addMapLayer(layer1)
您可以在以下选项之间切换 QgsVectorLayer
和 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)>
可以使用添加组 addGroup()
方法。在下面的示例中,前者会将一个组添加到TOC的末尾,而对于后者,您可以在现有组中添加另一个组:
node_group1 = root.addGroup('Simple Group')
# add a sub-group to Simple Group
node_subgroup1 = node_group1.addGroup("I'm a sub group")
对于节点和组的移动,有很多有用的方法。
移动现有节点分三步完成:
克隆现有节点
将克隆的节点移动到所需位置
删除原始节点
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)
稍微多了一点 complicated 要在图例中移动一个层,请执行以下操作:
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)
或将其移至现有组:
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)
可用于修改组和图层的其他一些方法:
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)