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?

Odpowiedzi:


14

Możesz po prostu wymienić:

layers = iface.legendInterface().layers()

z

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

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.


3

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

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


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.