¿Conseguir que el código de Python QGIS 2.x funcione en QGIS 3.x? el objeto no tiene ningún atributo 'legendInterface' problema

12

El siguiente código funciona bien en QGIS 2.x, sin embargo, no funciona en 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 es el error que obtengo cuando ejecuto el 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'

¿Alguien sabe qué ha reemplazado 'legendInterface' en la nueva versión o qué otros cambios podría tener que hacer para que esto se ejecute en QGIS 3.0?

Trashmonk
fuente

Respuestas:

14

Podrías simplemente reemplazar:

layers = iface.legendInterface().layers()

con

layers = [layer for layer in QgsProject.instance().mapLayers().values()]
Joseph
fuente
Esta solución no funcionó lo suficientemente bien para mí, ya que las capas obtenidas no estaban en el mismo orden que se enumeran en el Panel de capas.
AleksMat
@AleksMat - Es bueno saber que encontró un método para su problema :)
Joseph
9

El equivalente de

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

en QGIS 3.0 es

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

Esto busca recursivamente todas las capas y las devuelve en el mismo orden que se enumera en el Panel de capas.

AleksMat
fuente
3

Encontré esto para enumerar capas:

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

SzieberthAdam
fuente