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


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.