أكثر

تجميع طبقات متعددة برمجيًا في مجموعات منفصلة باستخدام QGIS؟

تجميع طبقات متعددة برمجيًا في مجموعات منفصلة باستخدام QGIS؟


أحاول تجميع عدد كبير من الطبقات معًا بناءً على جزء مشترك من سلسلة الاسم. إنها مزيج من المضلعات والنقاط. أرغب في إنشاء مجموعات فردية باستخدام جزء من اسم الطبقة. هل لدي احد اى افكار؟ كنت أتطلع إلى إنشاء مكون إضافي ولكني غير قادر على ذلك (بسبب قدراتي في الترميز).

لقد أرفقت صورة لإظهار ما أبحث عنه كنتيجة نهائية. لدي مشاريع بكمية كبيرة من المعلومات التي يجب تجميعها.


يمكنك القيام بذلك في ثلاث خطوات: الحصول على أسماء المجموعات وإنشاء المجموعات ونقل الطبقات.

لأغراض الاختبار ، قمت بتكرار نموذج السيناريو الخاص بك:

قم بتشغيل مقتطف الشفرة التالي في وحدة تحكم QGIS Python الخاصة بك:

# 1. احصل على أسماء المجموعات وقائمة معرّفات الطبقة root = QgsProject.instance (). layerTreeRoot ()ictGroups = {} للطبقة في root.findLayers (): if QgsLayerTree.isLayer (layer): البادئة = "Site" + layer .layerName (). split ("_") [0] # اضبط هذا ليناسب احتياجاتك إذا لم تكن البادئة فيictGroups :ictGroups [بادئة] = []ictGroups [بادئة] .append (layer.layerId ()) # 2. إنشاء مجموعات للمفتاح فيictGroups: root.addGroup (مفتاح) # 3. انقل الطبقات للمفتاح فيictGroups: parent = root.findGroup (مفتاح) للمعرف فيictGroups [المفتاح]: layer = root.findLayer (id) clone = layer .clone () parent.insertChildNode (0، clone) root.removeChildNode (طبقة)

يجب أن تحصل على شيء مثل هذا:


أنا فقط أضيف القليل الإضافي هنا لكن آمل أن يساعد الشرح الآخرين.

قضيت وقتًا طويلاً في التفاف رأسي حول العقد مقابل الطبقات.

يبدو أن الطبقات هي "الوزن الثقيل" الكائنات الأساسية ، ويتم استخدام العقد لتمثيل الترتيب في الشجرة. (https://qgis.org/api/classQgsLayerTreeNode.html#details)

أقدم الكود أدناه مع بعض المزايا على المنشور الذي تم قبوله (ولم أكن لأحصل هنا بدون الإجابة المقبولة ، لذلك شكرًا لك على Germán Carrillo):

  1. يتلاعب في شجرة بدلاً من أي طبقات. (في الواقع ، تحقق فقط من المستندات مرتين - يقوم findLayer في الواقع بإرجاع LayerTreeNode (مثل LayerTreeLayer) ، لذلك يبقى في مجال "العقدة". في بعض الأحيان قد يؤدي تقصير الأسماء إلى توجيه خاطئ ...)
  2. يحصل على العقد المحددة ويشكلها فقط في مجموعة فرعية. (كانت هذه حالة الاستخدام الشخصية الخاصة بي ، وليس بالضرورة ما طلب OP).
  3. يحتفظ بمراجع الكائن (العقدة) بدلاً من التجميع وإعادة البحث عن معرفات طبقة QGIS.
  4. الاستخداماتaddChildNodeعوضا عنinsertChildNode (0 ، ...، من أجل الحفاظ على ترتيب العقد في المجموعة الجديدة.
  5. استخدام حلقة إضافية عن عمد حتى أتمكن من التحقق من صحة العمل قبل حذف العقد الأصلية. (يمكن بالفعل دمج الحلقات الثلاث الأخيرة.)

#

v = iface.layerTreeView () # v.collapseAllNodes () nodes = v.selectedNodes () parent = nodes [0] .parent () groups = {} لـ n في العقد: key = n.name () [: 1] إذا لم يكن المفتاح في المجموعات: groups [key] = [] groups [key] .append (n) new_groups = {} للمفتاح في المجموعات: grp_name = key + '00 'grp = parent.addGroup (grp_name) new_groups [key] = grp للمفتاح في المجموعات: new_group = new_groups [مفتاح] لـ n في المجموعات [key]: clone = n.clone () new_group.addChildNode (clone) للمفتاح في المجموعات: لـ n في المجموعات [المفتاح]: parent.removeChildNode ( ن)

شاهد الفيديو: دورة الفوتوشوب. 03 نافذة الطبقات Layers