Far funzionare il codice Python di QGIS 2.x in QGIS 3.x? L'oggetto non presenta alcun problema di attributo "legendInterface"


12

Il seguente pezzo di codice funziona bene in QGIS 2.x, tuttavia non funziona in 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())

Questo è l'errore che ottengo quando eseguo il codice:

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'

Qualcuno sa cosa ha sostituito "legendInterface" nella nuova versione o quali altre modifiche potrei dover apportare per farlo funzionare in QGIS 3.0?

Risposte:


14

Potresti semplicemente sostituire:

layers = iface.legendInterface().layers()

con

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

Questa soluzione non ha funzionato abbastanza bene per me poiché i livelli ottenuti non erano nello stesso ordine di quelli elencati nel pannello Livelli.
AleksMat,

@AleksMat - Buono a sapersi che hai trovato un metodo per il tuo problema :)
Joseph

9

L'equivalente di

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

in QGIS 3.0 è

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

Questo trova in modo ricorsivo tutti i livelli e li restituisce nello stesso ordine elencato nel pannello Livelli.


3

Ho trovato questo per elencare i livelli:

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


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.