วนรอบแผนที่ใน QGIS Python หรือไม่


30

ฉันมีปัญหาในการหาวิธีวนรอบแผนที่เลเยอร์ ฉันสามารถเข้าถึงเลเยอร์ที่ไฮไลต์อยู่ในสารบัญได้ในขณะนี้iface.activeLayer()แต่ฉันต้องการให้โค้ดของฉันทำงานในทุกเลเยอร์

ฉันไม่เห็นอะไรเลยใน API ที่ให้การเข้าถึงฟังก์ชั่นนี้ได้ง่ายและไม่พบตัวอย่างออนไลน์ที่ดี แต่ฉันอาจพลาดอะไรบางอย่าง


ฉันไม่เห็นว่าคุณใช้ QgsMapLayerRegistry หรือ QgsProject อย่างไร ใน QGIS 3.0.2 สิ่งนี้ไม่ทำงาน อย่างไรก็ตาม iface.mapCanvas (). layer () ทำ ชนิดของ ดูเหมือนจะให้เลเยอร์ที่ใช้งานอยู่เท่านั้น (สิ่งที่คุณตรวจสอบในบานหน้าต่างเลเยอร์) ไม่มีใครรู้วิธีรับรายชื่อของเลเยอร์ทั้งหมดแม้แต่สิ่งที่ไม่ได้เลือกในบานหน้าต่างเลเยอร์ นอกจากนี้หากใช้ตัวสร้างปลั๊กอินมันจะสร้างเชลล์ของปลั๊กอินให้คุณ ฟังก์ชัน run มีพารามิเตอร์ "self" ซึ่งจำเป็นต้องใช้ iface เช่น self.iface.mapCanvas (). layer () เพียง fyi
ajpieri

คำตอบ:


24

ลอง...

# substitute 'self' with 'qgis.utils.iface' when run from Python console
# 'self.iface = iface' would usually precede this command in your class 
layers = self.iface.legendInterface().layers()

for layer in layers:
    layerType = layer.type()
    if layerType == QgsMapLayer.VectorLayer:
        # do some stuff here

คัดมาจากconsolidatethread.pyจากQConsolidate ปลั๊กอิน

คำอธิบายของวัตถุ QgsLegendInterfaceส่งคืนจาก legendInterface ()

แก้ไข : เพิ่มข้อมูลเกี่ยวกับ 'ตนเอง' ด้านบน


ขอบคุณ! นั่นเป็นการหลอกลวง ฉันเดาว่าฉันคุ้นเคยกับโลกของ ESRI มากเกินไปซึ่งคำอธิบายแผนภูมิเป็นวัตถุในเค้าโครงแผนที่และสารบัญอ้างอิงถึงรายการเลเยอร์
spencerrecneps

2
โปรดทราบว่ามีความแตกต่างในสิ่งที่ส่งคืนระหว่างสิ่งนี้กับเทคนิค mapCanvas () ที่นาธานกล่าวถึง วัตถุ legendInterface () จะส่งคืนเลเยอร์ทั้งหมดแม้ว่าจะไม่แสดงในพื้นที่วาดแผนที่ในขณะที่ mapCanvas () ส่งคืนเฉพาะชั้นที่แสดงบนผืนผ้าใบเท่านั้น การใช้ mapCanvas () เป็นวิธีที่ดีและรวดเร็วในการรับการอ้างอิงไปยังเลเยอร์ที่มองเห็นได้
dakcarto

1
ในอีกหมายเหตุหนึ่งเวอร์ชั่นล่าสุดของ QGIS (> = 1.8) อนุญาตให้ผู้ใช้กำหนดลำดับการแสดงผลของเลเยอร์แยกต่างหากจากลำดับที่แสดงไว้ในคำอธิบายแผนภูมิ (ดีมาก!) The legendInterface () และ mapCanvas () วิธีการส่งกลับลำดับชั้นสำหรับแต่ละคนตามลำดับ
dakcarto

19

นอกจากนี้ยังมีอีกสองวิธี:

layers = self.iface.mapCanvas().layers()

จะให้รายการของเลเยอร์

หรือ

layers = QgsMapLayerRegistry.instance().mapLayers()

for name, layer in layers.iteritems():
     print name, layer.type()

คำตอบนี้ดูเหมือนจะไม่ได้ผล2.16และเหนือกว่า
ฟาเอล

10

สำหรับ QGIS 2.6 นี่คือรหัสเพื่อระบุแต่ละเลเยอร์และจัดกลุ่มพวกเขา:

#make the desired groups for layers
toc = self.iface.legendInterface()
root = QgsProject.instance().layerTreeRoot()
group1 = root.insertGroup(0, "Group Point")
group2 = root.insertGroup(1, "Group Line")
group3 = root.insertGroup(2, "Group Polygon")
#get the list of layers  from registry
layers = QgsMapLayerRegistry.instance().mapLayers()
#segregate layers into groups 
for name, layer in layers.iteritems():
    # check the layer geometry type 
    if layer.geometryType() == QGis.Point:
        toc.moveLayer(layer, 0)

    if layer.geometryType() == QGis.Line:
        toc.moveLayer(layer, 1)

    if layer.geometryType() == QGis.Polygon:
        toc.moveLayer(layer, 2)

หมายเหตุ: root.removeLayer(lyr)การจัดกลุ่มผมต้องเอาชั้นที่ซ้ำกันดังนั้นผมจึงใช้


9

สำหรับ QGIS 3 QgsMapLayerRegistryฟังก์ชั่น 's QgsProjectได้ถูกย้ายไป

ดังนั้นสำหรับการวนซ้ำเลเยอร์แผนที่คุณควรใช้โครงสร้างนั้น:

layers = QgsProject.instance().mapLayers()

.mapLayers(){layer_x_id: layer_x, layer_y_id: layer_y, ....}กลับพจนานุกรมโครงสร้างเป็น จากนั้นคุณสามารถวนซ้ำเลเยอร์เช่น:

for layer_id, layer in layers.items():
    print(layer.name())

เนื่องจาก.mapLayers()คืนค่าพจนานุกรม ( dict) คุณยังสามารถใช้.values()วิธีการตั้งค่าพจนานุกรมซึ่งส่งคืนเฉพาะlistชั้นที่มีเลเยอร์ในกรณีนั้น จากนั้นคุณสามารถวนซ้ำเลเยอร์เช่น:

layers = QgsProject.instance().mapLayers().values()

for layer in layers:
    print(layer.name())

หากคุณต้องการคุณสามารถทำซ้ำในวิธีนี้:

layers = QgsProject.instance().mapLayers() # dictionary

for layer in layers.values():
    print(layer.name())

Hi! ขอขอบคุณที่แบ่งปัน เพื่อพิมพ์ชื่อของเลเยอร์ทำงานได้ดี ... แต่ฉันไม่สามารถพิมพ์คีย์ของพจนานุกรมได้ คุณช่วยฉันได้ไหม
Caio villaca

1
for layer in layers: print(layer)คุณสามารถใช้สคริปต์เพื่อพิมพ์คีย์ หรือเพียงแค่ใช้print(layers.keys())โดยไม่ต้องforห่วง
Kadir Şahbaz
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.