รับรหัสหลาม 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'

มีใครรู้บ้างไหมว่าสิ่งใดที่เข้ามาแทนที่ '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()]

สิ่งนี้จะค้นหาเลเยอร์ทั้งหมดซ้ำและส่งกลับในลำดับเดียวกันตามที่ระบุในแผงเลเยอร์



โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.