Підключення QGIS 2.x коду python для роботи в 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'

Хтось знає, що замінило '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.