รับเลเยอร์ตามชื่อใน PyQGIS?


15

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

ฉันแค่อยากรู้ว่าการชี้ชื่อเลเยอร์เฉพาะในโค้ดจะทำให้เกิดข้อผิดพลาดในการทำซ้ำหรือไม่แม้ว่ามีเลเยอร์อื่นอยู่บ้าง?

ด้านล่างเป็นรหัสของฉันโปรดบอกฉันว่าฉันควรจะทำการเปลี่ยนแปลงที่ไหนและจะมีการเปลี่ยนแปลงอย่างไร

    if dist and centerCity:
        #QMessageBox.information(self.dlg, "info", "both True")
        st = '"name" = \'' + centerCity + '\''
        exp = QgsExpression(st)
    else:
        QMessageBox.warning(self.dlg, "Enter the distance","Enter the distance and try again.")        
        return          #terminate the function

    layer = self.iface.activeLayer() 
    it = layer.getFeatures(QgsFeatureRequest(exp))
    feature = it.next()
    mbuf = feature.geometry().buffer(dist, 2)       

    iterFeat = layer.getFeatures()

    for f in iterFeat:
        geom2 = f.geometry()
        valTest = QgsGeometry.within(geom2, mbuf)

คำตอบ:


41

อัปเดต: 10.04.2018

ใช้QGIS 3.xคุณสามารถใช้mapLayersByNameวิธีการจากQgsProjectชั้นเรียนด้วยวิธีนี้:

layers = QgsProject.instance().mapLayersByName('my layer name')

เนื่องจากคุณสามารถมีหลายเลเยอร์ใน QGIS ที่มีชื่อเดียวกันในพาเนลเลเยอร์วิธีการด้านบนจะแสดงรายการเลเยอร์ที่ตรงกัน


สำหรับQGIS 2.x :

คุณเพียงแค่ต้องทำให้แน่ใจว่าเลเยอร์ของคุณมีชื่อที่คุณสามารถแยกความแตกต่างจากคนอื่น ๆ แทนที่จะlayer = self.iface.activeLayer()ทำ:

layer=None
for lyr in QgsMapLayerRegistry.instance().mapLayers().values():
    if lyr.name() == "YOUR_LAYER_NAME":
        layer = lyr
        break

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

layer=None
for lyr in QgsMapLayerRegistry.instance().mapLayers().values():
    if lyr.source() == "/path/to/shapefile.shp":
        layer = lyr
        break

แก้ไข: @Jakob ได้ชี้ให้เห็นในความคิดเห็นคุณสามารถเขียนบล็อกแรกในหนึ่งบรรทัด:

layerList = QgsMapLayerRegistry.instance().mapLayersByName("YOUR_LAYER_NAME")

หรือ:

layerList = [lyr for lyr in QgsMapLayerRegistry.instance().mapLayers().values() if lyr.name() == "YOUR_LAYER_NAME"]

อย่างไรก็ตามคุณจะต้องตรวจสอบว่าlayerListไม่ว่างเปล่าก่อนที่จะเข้าถึงองค์ประกอบแรก:

if layerList: 
    layer = layerList[0]

2
พิมพ์ [lyr สำหรับ lyr ใน QgsMapLayerRegistry.instance (). mapLayers (). values ​​() ถ้า lyr.name () == "LAND"] [0] .name ()
Jakob

7
layer = QgsMapLayerRegistry.instance (). mapLayersByName ("mylayername") [0]
Jakob

ทำไมคุณถึงตั้งค่าlayer = noneที่จุดเริ่มต้นของรหัสของคุณ? ดูเหมือนไม่จำเป็นโดยเฉพาะถ้าอยู่ในฟังก์ชั่น
user32882

1
มันเป็นค่าเริ่มต้นเพราะมีถ้าภายในสำหรับ ถ้าหากไม่เคยเจอกันเลเยอร์จะไม่ปรากฏเลยหลังจาก for ดังนั้นเพื่อให้แน่ใจว่าคุณสามารถอ่านตัวแปรเลเยอร์ได้ในภายหลัง
Germán Carrillo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.