Bắt mã python của QGIS 2.x để hoạt động trong QGIS 3.x? đối tượng không có vấn đề thuộc tính 'LegendInterface'


12

Đoạn mã sau hoạt động tốt trong QGIS 2.x, tuy nhiên nó không hoạt động trong 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())

Đây là lỗi tôi gặp phải khi chạy mã:

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'

Có ai biết cái gì đã thay thế 'LegendInterface' trong phiên bản mới hoặc những thay đổi khác mà tôi có thể phải thực hiện để chạy cái này trong QGIS 3.0 không?

Câu trả lời:


14

Bạn chỉ có thể thay thế:

layers = iface.legendInterface().layers()

với

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

Giải pháp này không hoạt động đủ tốt đối với tôi vì các lớp thu được không theo thứ tự như được liệt kê trong Bảng điều khiển Lớp.
AleksMat

@AleksMat - Thật tốt khi biết rằng bạn đã tìm thấy một phương pháp cho vấn đề của mình :)
Joseph

9

Tương đương với

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

trong QGIS 3.0 là

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

Điều này đệ quy tìm thấy tất cả các lớp và trả về chúng theo cùng thứ tự như được liệt kê trong Bảng điều khiển Lớp.


3

Tôi tìm thấy điều này để liệt kê các lớp:

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


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.