4. الوصول إلى جدول المحتويات (TOC)¶
تلميح
تحتاج مقتطفات الشيفرة في هذه الصفحة إلى عمليات الاستيراد التالية إذا كنت خارج وحدة تحكم pyqgis:
from qgis.core import (
QgsProject,
QgsVectorLayer,
)
يمكنك استخدام أصناف مختلفة للوصول إلى جميع الطبقات المحمّلة في جدول المحتويات واستخدامها لاسترجاع المعلومات:
QgsProjectQgsLayerTreeGroup
4.1. الصنف QgsProject¶
يمكنك استخدام QgsProject لاسترجاع معلومات عن جدول المحتويات وجميع الطبقات المحمّلة.
عليك إنشاء instance من QgsProject واستخدام دوالها للحصول على الطبقات المحمّلة.
الدالة الرئيسية هي mapLayers()، وهي تُرجع قاموسًا بالطبقات المحمّلة:
layers = QgsProject.instance().mapLayers()
print(layers)
{'countries_89ae1b0f_f41b_4f42_bca4_caf55ddbe4b6': <QgsVectorLayer: 'countries' (ogr)>}
مفاتيح القاموس keys هي معرّفات الطبقات الفريدة، بينما القيم 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)>}
يمكنك أيضًا الاستعلام في جدول المحتويات باستخدام اسم الطبقة:
country_layer = QgsProject.instance().mapLayersByName("countries")[0]
ملاحظة
تُرجَع قائمة بجميع الطبقات المطابقة، لذا نستخدم الفهرس [0] للحصول على أول طبقة تحمل هذا الاسم.
4.2. QgsLayerTreeGroup class¶
شجرة الطبقات بنية شجرية تقليدية مكوّنة من عُقد. يوجد حاليًا نوعان من العُقد: عُقد المجموعات (QgsLayerTreeGroup) وعُقد الطبقات (QgsLayerTreeLayer).
يمكن الوصول إلى شجرة طبقات المشروع بسهولة باستخدام الدالة layerTreeRoot() من الصنف QgsProject:
root = QgsProject.instance().layerTreeRoot()
العقدة root عقدة مجموعة ولها أبناء:
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 على دوال مفيدة أخرى كثيرة يمكن استخدامها للحصول على مزيد من المعلومات عن جدول المحتويات:
# list of all the checked layers in the TOC
checked_layers = root.checkedLayers()
print(checked_layers)
[<QgsVectorLayer: 'countries' (ogr)>]
لنُضف الآن بعض الطبقات إلى شجرة طبقات المشروع. هناك طريقتان للقيام بذلك:
الإضافة الصريحة باستخدام الدالتين
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)
الإضافة الضمنية: بما أن شجرة طبقات المشروع متصلة بسجل الطبقات، يكفي إضافة الطبقة إلى سجل طبقات الخريطة:
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(). في المثال أدناه، يضيف الأول مجموعة إلى نهاية جدول المحتويات، بينما يتيح لك الثاني إضافة مجموعة أخرى داخل مجموعة موجودة:
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)
نقل طبقة داخل مفتاح الخريطة أعقد قليلًا:
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)