Mendapatkan QGIS 2.x kode python untuk bekerja di QGIS 3.x? objek tidak memiliki masalah atribut 'legendaInterface'

12

Sepotong kode berikut berfungsi dengan baik di QGIS 2.x, namun tidak berfungsi di QGIS 3.x.

myDir = 'd:/work/output_folder/'
layers = iface.legendInterface().layers()
pipe = QgsRasterPipe()
for layer in layers:
 extent = layer.extent()
 width, height = layer.width(), layer.height()
 renderer = layer.renderer()
 provider=layer.dataProvider()
 crs = layer.crs().toWkt() 
 pipe.set(provider.clone())
 pipe.set(renderer.clone())
 opts = ["COMPRESS=LZW"] 
 file_writer = QgsRasterFileWriter(myDir + layer.name() + ".tif")
 file_writer.setCreateOptions(opts)
 file_writer.writeRaster(pipe,
      width,
         height,
         extent,
         layer.crs())

Ini adalah kesalahan yang saya dapatkan ketika saya menjalankan kode:

Traceback (most recent call last):
  File "C:\PROGRA~1\QGIS3~1.0\apps\Python36\lib\code.py", line 91, in runcode
    exec(code, self.locals)
  File "<input>", line 1, in <module>
AttributeError: 'QgisInterface' object has no attribute 'legendInterface'

Apakah ada yang tahu apa yang menggantikan 'legendInterface' di versi baru atau perubahan apa yang harus saya buat untuk menjalankannya di QGIS 3.0?

Trashmonk
sumber

Jawaban:

14

Anda bisa saja mengganti:

layers = iface.legendInterface().layers()

dengan

layers = [layer for layer in QgsProject.instance().mapLayers().values()]
Yusuf
sumber
Solusi ini tidak bekerja cukup baik bagi saya karena lapisan yang diperoleh tidak dalam urutan yang sama seperti yang tercantum di Panel Layers.
AleksMat
@AlexMat - Senang mengetahui bahwa Anda menemukan metode untuk masalah Anda :)
Joseph
9

Setara dengan

layers = self.iface.legendInterface().layers()

di QGIS 3.0 adalah

layers = [tree_layer.layer() for tree_layer in QgsProject.instance().layerTreeRoot().findLayers()]

Ini secara rekursif menemukan semua lapisan dan mengembalikannya dalam urutan yang sama seperti yang tercantum di Panel Layers.

AleksMat
sumber
3

Saya menemukan ini ke daftar lapisan:

layers = qgis.core.QgsProject.instance().layerTreeRoot().layerOrder()

SzieberthAdam
sumber