Damit QGIS 2.x-Python-Code in QGIS 3.x funktioniert? Objekt hat kein Attribut 'legendInterface' Problem

12

Der folgende Code funktioniert gut in QGIS 2.x, funktioniert jedoch nicht 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())

Dies ist der Fehler, den ich beim Ausführen des Codes erhalte:

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'

Weiß jemand, was 'legendInterface' in der neuen Version ersetzt hat oder welche anderen Änderungen ich möglicherweise vornehmen muss, damit dies in QGIS 3.0 ausgeführt wird?

Trashmonk
quelle

Antworten:

14

Sie könnten einfach ersetzen:

layers = iface.legendInterface().layers()

mit

layers = [layer for layer in QgsProject.instance().mapLayers().values()]
Joseph
quelle
Diese Lösung funktionierte für mich nicht gut genug, da die erhaltenen Schichten nicht in derselben Reihenfolge waren, wie sie im Ebenenbedienfeld aufgeführt sind.
AleksMat
@AleksMat - Gut zu wissen, dass Sie eine Methode für Ihr Problem gefunden haben :)
Joseph
9

Das Äquivalent von

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

in QGIS 3.0 ist

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

Dadurch werden alle Ebenen rekursiv gefunden und in derselben Reihenfolge zurückgegeben, wie sie im Ebenenbedienfeld aufgeführt sind.

AleksMat
quelle
3

Ich habe dies gefunden, um Ebenen aufzulisten:

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

SzieberthAdam
quelle
2

Schauen Sie sich https://qgis.org/api/api_break.html an - es gibt buchstäblich Tausende von Änderungen an der API, für deren Handhabung 2.x.scripts aktualisiert werden müssen.

Ndawson
quelle