Заставить код Python QGIS 2.x работать в QGIS 3.x? У объекта нет атрибута 'legendInterface', проблема


12

Следующий фрагмент кода хорошо работает в QGIS 2.x, однако он не работает в 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())

Это ошибка, которую я получаю при запуске кода:

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'

Кто-то знает, что заменило сказание легенда в новой версии или какие другие изменения мне могут потребоваться, чтобы запустить его в QGIS 3.0?

Ответы:


14

Вы можете просто заменить:

layers = iface.legendInterface().layers()

с участием

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

Это решение не работало достаточно хорошо для меня, так как полученные слои были не в том порядке, который указан в панели слоев.
AleksMat

@AleksMat - Приятно знать, что вы нашли метод для своей проблемы :)
Джозеф,

9

Эквивалент

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

в QGIS 3.0 есть

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

Это рекурсивно находит все слои и возвращает их в том же порядке, который указан на панели слоев.


3

Я нашел это, чтобы перечислить слои:

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


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.