เมื่อฉันโหลดเลเยอร์จำนวนมากลงใน 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หรือปลั๊กอินหรือโหลดลงในคอนโซลใหม่ในต้นแบบ) หลังจากเพิ่มเลเยอร์แล้ว มันจะสร้างกลุ่มที่มีชื่อเรียงได้เพิ่มเลเยอร์ลงในกลุ่มที่ถูกต้องจากนั้นเรียงลำดับทั้งหมด ข้อแม้เดียวกันใช้เช่นเดียวกับข้างต้น
การตรวจสอบเพิ่มเติมสำหรับดัชนีกลุ่มที่ถูกต้องจะเป็นสิ่งจำเป็นสำหรับโซลูชันที่มีประสิทธิภาพมากขึ้นเมื่อเพิ่มเลเยอร์ใหม่ในโครงการที่มีอยู่ด้วยเลเยอร์และกลุ่มที่โหลดแล้ว