QGIS 2.x Python kodunu QGIS 3.x'te mi çalıştırıyorsunuz? nesnede 'legendInterface' özelliği yok


12

Aşağıdaki kod parçası QGIS 2.x'de iyi çalışır, ancak QGIS 3.x'te çalışmaz.

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())

Bu kodu çalıştırdığınızda aldığım hata:

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'

Birisi yeni sürümde 'legendInterface' yerine ne yazdığını ya da bunun QGIS 3.0'da çalışması için ne tür değişiklikler yapmam gerektiğini biliyor mu?

Yanıtlar:


14

Sadece değiştirebilirsiniz:

layers = iface.legendInterface().layers()

ile

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

Elde edilen katmanlar Katmanlar Panelinde listelenen sırada olmadığı için bu çözüm benim için yeterince işe yaramadı.
AleksMat

@AleksMat - Sorununuz için bir yöntem bulduğunuzu bilmek güzel :)
Joseph

9

Eşdeğeri

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

QGIS 3.0'da

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

Bu, tüm katmanları özyinelemeli olarak bulur ve Katmanlar Panelinde listelenen sırayla döndürür.


3

Bunu katmanları listelemek için buldum:

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


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.