QGIS 3.x에서 QGIS 2.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-문제에 대한 방법을 찾았 음을 알게되어 기쁩니다. –
Joseph

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.