¿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?

Respuestas:


14

Podrías simplemente reemplazar:

layers = iface.legendInterface().layers()

con

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

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.


3

Encontré esto para enumerar capas:

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


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.