Czy kod Pythona QGIS 2.x działa w QGIS 3.x? obiekt nie ma problemu z atrybutem „legendInterface”

12

Poniższy fragment kodu działa dobrze w QGIS 2.x, jednak nie działa w 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())

Oto błąd, który pojawia się po uruchomieniu kodu:

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'

Czy ktoś wie, co zastąpiło „legendę interfejsu” w nowej wersji lub jakie inne zmiany muszę wprowadzić, aby uruchomić to w QGIS 3.0?

Trashmonk
źródło

Odpowiedzi:

14

Możesz po prostu wymienić:

layers = iface.legendInterface().layers()

z

layers = [layer for layer in QgsProject.instance().mapLayers().values()]
Joseph
źródło
To rozwiązanie nie działało dla mnie wystarczająco dobrze, ponieważ uzyskane warstwy nie były w takiej samej kolejności, jak wymienione w Panelu warstw.
AleksMat
@AleksMat - Dobrze wiedzieć, że znalazłeś metodę swojego problemu :)
Joseph
9

Odpowiednik

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

w QGIS 3.0 jest

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

To rekurencyjnie wyszukuje wszystkie warstwy i zwraca je w takiej samej kolejności, jak podano w Panelu warstw.

AleksMat
źródło
3

Znalazłem to, aby wyświetlić listę warstw:

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

SzieberthAdam
źródło
2

Spójrz na https://qgis.org/api/api_break.html - dosłownie tysiące zmian w interfejsie API, do obsługi których trzeba zaktualizować skrypty 2.x.s.

ndawson
źródło