Como o código python do QGIS 2.x funciona no QGIS 3.x? objeto não tem problema de atributo 'legendInterface'

12

O seguinte trecho de código funciona bem no QGIS 2.x, no entanto, não funciona no 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())

Este é o erro que recebo quando executo o código:

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'

Alguém sabe o que substituiu 'legendInterface' na nova versão ou que outras alterações eu devo fazer para que isso seja executado no QGIS 3.0?

Trashmonk
fonte

Respostas:

14

Você pode substituir:

layers = iface.legendInterface().layers()

com

layers = [layer for layer in QgsProject.instance().mapLayers().values()]
Joseph
fonte
Essa solução não funcionou bem o suficiente para mim, pois as camadas obtidas não estavam na mesma ordem listada no Painel de camadas.
precisa
@AleksMat - É bom saber que você encontrou um método para o seu problema :)
Joseph
9

O equivalente a

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

no QGIS 3.0 é

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

Isso encontra recursivamente todas as camadas e as retorna na mesma ordem listada no painel Camadas.

AleksMat
fonte
3

Encontrei isso para listar camadas:

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

SzieberthAdam
fonte
2

Dê uma olhada em https://qgis.org/api/api_break.html - existem literalmente milhares de alterações na API, com as quais os scripts 2.x.sys precisam ser atualizados.

ndawson
fonte