Mendapatkan lapisan dengan nama di PyQGIS?


14

Saya memiliki plugin yang menemukan buffer untuk daftar kota, asalkan jaraknya. Nama negara bagian dan kota diambil dari tabel atribut dan akan difilter sesuai. Yang saya inginkan adalah plugin saya harus mengidentifikasi nama lapisan atau urutan lapisan dalam kanvas, terlepas dari lapisan lain yang ada di kanvas dan mengakses atribut yang sesuai dari lapisan itu.

Saya juga hanya ingin tahu apakah menunjuk nama lapisan tertentu dalam kode akan menyebabkan kesalahan dalam iterasi meskipun beberapa lapisan lain ada?

Di bawah ini adalah kode saya, tolong beri tahu saya di mana saya harus melakukan perubahan dan apa perubahannya?

    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)

Jawaban:


38

UPDATE: 10.04.2018

Menggunakan QGIS 3.x Anda dapat menggunakan mapLayersByNamemetode dari QgsProjectkelas dengan cara ini:

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

Karena Anda dapat memiliki beberapa lapisan dalam QGIS dengan nama yang sama di panel lapisan, metode di atas memberi Anda daftar lapisan yang cocok.


Untuk QGIS 2.x :

Anda hanya perlu memastikan layer Anda memiliki nama yang dapat Anda bedakan dari yang lain. Alih-alih layer = self.iface.activeLayer(), lakukan:

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

Jika Anda tidak mempercayai nama layer (setelah semua, itu dapat diubah oleh pengguna kapan saja), Anda dapat mencoba memeriksa sumber layer. Jika layer Anda adalah Shapefile, Anda bisa memeriksa jalur ke Shapefile, dengan cara ini:

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

EDIT: Seperti yang ditunjukkan oleh Jakob dalam komentar, Anda dapat menulis blok pertama dalam satu baris:

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

Atau:

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

Bagaimanapun, Anda perlu memeriksa bahwa layerListitu tidak kosong sebelum mengakses elemen pertamanya:

if layerList: 
    layer = layerList[0]

2
cetak [lyr untuk lyr di QgsMapLayerRegistry.instance (). mapLayers (). values ​​() if lyr.name () == "LAND"] [0] .name ()
Jakob

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

mengapa Anda mengatur layer = nonedi awal kode Anda? Tampaknya tidak perlu terutama jika itu dalam suatu fungsi
user32882

1
Ini nilai default, karena ada if di dalam for. Jika if tidak pernah bertemu, layer tidak akan ada sama sekali setelah untuk. Jadi, hanya untuk memastikan Anda dapat membaca variabel layer setelahnya.
Germán Carrillo
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.