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?

Antworten:


14

Sie könnten einfach ersetzen:

layers = iface.legendInterface().layers()

mit

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

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.


3

Ich habe dies gefunden, um Ebenen aufzulisten:

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


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.