เรียงลำดับเลเยอร์ในสารบัญของ QGIS?


12

เมื่อฉันโหลดเลเยอร์จำนวนมากลงใน QGIS จาก PostGIS พวกเขาดูเหมือนจะโหลดตามลำดับตัวอักษรแบบย้อนกลับ

มีเครื่องมือหรือปลั๊กอินใดบ้างที่อนุญาตให้คุณจัดเรียง QGIS TOC อย่างรวดเร็วในลำดับที่ต่างออกไป? ตัวอย่างเช่นฉันนึกถึงตัวเลือกสองตัวที่หนึ่งอาจต้องการ:

  1. จัดเรียงเลเยอร์ตามเรขาคณิตที่มีจุดอยู่ด้านบนแล้วบรรทัด polys และ rasters
  2. เรียงลำดับเลเยอร์ตามชื่อ (เรียงตามตัวอักษรย้อนกลับเรียงตามตัวอักษร)
  3. เรียงลำดับตามเรขาคณิตแล้วตามด้วยชื่อ นี่จะเป็นการรวมกันของ # 1 & # 2 เลเยอร์ของจุดจะถูกจัดเรียงไปด้านบน (เช่นเดียวกับ # 1) แต่จากนั้นเลเยอร์ของจุดจะถูกจัดเรียงตามตัวอักษร (point-a, point-b, point-c, ฯลฯ )

เมื่อทำการโหลดเลเยอร์จำนวนมากสิ่งนี้จะช่วยสร้างการสั่งซื้อที่เหมาะสมสำหรับการผลิตแผนที่อย่างรวดเร็ว


เป็นความคิดที่ดีมาก! ฉันไม่คิดว่ามีปลั๊กอินใด ๆ ที่จะทำงานดังกล่าว (ถ้าหลามเพียงพอฉันสามารถทำงานได้ แต่ฉันเชื่อว่านี่จะซับซ้อน) บางทีคุณสามารถส่งคำขอคุณสมบัติให้กับทีม QGIS dev
Curlew

1
ฉันได้โพสต์คำขอคุณสมบัติสำหรับฟังก์ชั่นนี้
RyanKDalton

คำตอบ:


7

เมื่อฉันโหลดเลเยอร์จำนวนมากลงใน QGIS จาก PostGIS พวกเขาดูเหมือนจะโหลดตามลำดับตัวอักษรแบบย้อนกลับ

ปรากฏขึ้นนี้จะเป็นปัญหาที่ (แม้ในสาขาหลัก) เมื่อใช้การดำเนินการชั้นเพิ่มเพิ่มเลเยอร์ PostGIS ...และควรได้รับรายงานเกี่ยวกับการติดตาม QGIS ข้อผิดพลาด อย่างไรก็ตามหากคุณใช้เบราว์เซอร์ใหม่เพื่อโหลดเลเยอร์ PostGIS พวกมันจะไม่ถูกย้อนกลับ ตัวจัดการฐานข้อมูลใหม่ไม่อนุญาตให้มีการเลือกหลายตารางดังนั้นจึงไม่มีปัญหา (นอกเหนือจากการขาดการเลือกหลายตัว)

มีเครื่องมือหรือปลั๊กอินใดบ้างที่อนุญาตให้คุณจัดเรียง QGIS TOC อย่างรวดเร็วในลำดับที่ต่างออกไป? ตัวอย่างเช่นฉันนึกถึงตัวเลือกสองตัวที่หนึ่งอาจต้องการ:

2) เรียงลำดับเลเยอร์ตามชื่อ (เรียงตามตัวอักษรย้อนกลับเรียงตามตัวอักษร)

สิ่งนี้สามารถทำได้โดยใช้คอลัมน์ดั้งเดิมหรือการเรียงลำดับรายการของคลาสฐานของ QgsLegend ( QTreeWidget ) สิ่งนี้จะจัดเรียงรายการทั้งหมดทั้งเลเยอร์และกลุ่มเข้าด้วยกันไม่ใช่กลุ่มที่จัดกลุ่มด้านบนหรือด้านล่างเลเยอร์ระดับบนสุด มันจะเรียงลำดับภายในกลุ่ม ไม่มีการแยกประเภทเช่นนี้

from PyQt4.QtCore import *
from PyQt4.QtGui import *
from qgis.utils import iface

mw = iface.mainWindow()
lgd = mw.findChild(QTreeWidget, "theMapLegend")  # get ref to object by type/objectName
lgd.sortItems(0, Qt.AscendingOrder)  # sort first column (Qt.DescendingOrder to reverse)

Caveat : หากคำอธิบายแผนภูมิหลักยังควบคุมลำดับการสร้างเลเยอร์ (ค่าเริ่มต้น) สิ่งนี้ควรใช้งานได้ หากวิดเจ็ต Layer Order dock ถูกใช้แยกต่างหากเพื่อควบคุมการแสดงผลดังนั้นการเรียงลำดับในตำนานจะไม่ได้รับเกียรติและการดำเนินการเรียงลำดับต่อไปนี้อาจนำไปสู่ผลลัพธ์ที่ไม่ต้องการ (ดำเนินการจากด้านบน):

lo = mw.findChild(QListWidget, "theMapLayerOrder")
lo.sortItems(Qt.AscendingOrder)

จากรหัสนี้คุณจะเห็นว่ารายการสั่งซื้อเลเยอร์เป็นQListWidgetไม่ใช่ QTreeWidget ซึ่งหมายความว่าการเรียงลำดับจะไม่คำนึงถึงการจัดกลุ่มใด ๆ เลเยอร์ทั้งหมดจะถูกนำเสนอในรายการแบบแบนราวกับว่าพวกเขาอยู่ในระดับบนสุดทั้งหมด ดังนั้นเลเยอร์ใด ๆ ที่ซ้อนกันอยู่ในกลุ่มอาจเรียงลำดับอยู่ด้านล่างเลเยอร์ระดับบนสุดหากคุณใช้โค้ดการเรียงลำดับด้านบนกับ QListWidget

1) เรียงเลเยอร์ตามเรขาคณิตที่มีจุดอยู่ด้านบนแล้วเส้น polys และ rasters

3) เรียงลำดับตามเรขาคณิตแล้วตามชื่อ นี่จะเป็นการรวมกันของ # 1 & # 2 เลเยอร์ของจุดจะถูกจัดเรียงไปด้านบน (เช่นเดียวกับ # 1) แต่จากนั้นเลเยอร์ของจุดจะถูกจัดเรียงตามตัวอักษร (point-a, point-b, point-c, ฯลฯ )

ขณะนี้การใช้ Python มีฟังก์ชั่น จำกัด สำหรับการจัดการ QgsLegend มีเป็นQgsLegendInterfaceแต่นี้ไม่ได้มีสารพัดทั้งหมดที่มีอยู่ในQgsLegend , QgsLegendLayerที่สืบทอดมาQgsLegendItemหรือใด ๆ ของชั้นเรียนอื่น ๆที่เกี่ยวข้องกับการ QgsLegend

แม้ว่าหากคุณเริ่มต้นด้วยโปรเจ็กต์ที่สะอาดและไม่สนใจการใช้กลุ่มในขณะนี้คุณสามารถทำสิ่งต่อไปนี้ได้ (ดำเนินการต่อจากบล็อกโค้ดเริ่มต้น):

li = iface.legendInterface()
li.addGroup('A_Points')
li.addGroup('B_Lines')
li.addGroup('C_Polygons')
li.addGroup('D_Rasters')

for l in li.layers():
  if l.type() == QgsMapLayer.VectorLayer:
    if l.geometryType() == QGis.Point:
      li.moveLayer(l, 0)
    elif l.geometryType() == QGis.Line:
      li.moveLayer(l, 1)
    elif l.geometryType() == QGis.Polygon:
      li.moveLayer(l, 2)
  elif l.type() == QgsMapLayer.RasterLayer:
    li.moveLayer(l, 3)

lgd.sortItems(0, Qt.AscendingOrder)

( สมมติว่าไม่มีกลุ่มอื่นอยู่ ) ซึ่งจะเรียกใช้จากคอนโซล (หรือสคริปต์ScriptRunnerหรือปลั๊กอินหรือโหลดลงในคอนโซลใหม่ในต้นแบบ) หลังจากเพิ่มเลเยอร์แล้ว มันจะสร้างกลุ่มที่มีชื่อเรียงได้เพิ่มเลเยอร์ลงในกลุ่มที่ถูกต้องจากนั้นเรียงลำดับทั้งหมด ข้อแม้เดียวกันใช้เช่นเดียวกับข้างต้น

การตรวจสอบเพิ่มเติมสำหรับดัชนีกลุ่มที่ถูกต้องจะเป็นสิ่งจำเป็นสำหรับโซลูชันที่มีประสิทธิภาพมากขึ้นเมื่อเพิ่มเลเยอร์ใหม่ในโครงการที่มีอยู่ด้วยเลเยอร์และกลุ่มที่โหลดแล้ว


การเปลี่ยนแปลงเลเยอร์การแสดงตามลำดับตัวอักษรเพิ่งถูกรวมเข้ากับสาขาหลัก: github.com/qgis/QGIS/pull/4965
MatzFan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.