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?

Jawaban:


14

Anda bisa saja mengganti:

layers = iface.legendInterface().layers()

dengan

layers = [layer for layer in QgsProject.instance().mapLayers().values()]

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.


3

Saya menemukan ini ke daftar lapisan:

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


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.