Vous voulez que le code python QGIS 2.x fonctionne dans QGIS 3.x? l'objet n'a pas d'attribut 'legendInterface'

12

Le morceau de code suivant fonctionne bien dans QGIS 2.x, mais il ne fonctionne pas dans 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())

Voici l'erreur que j'obtiens lorsque j'exécute le code:

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'

Quelqu'un sait-il ce qui a remplacé «legendInterface» dans la nouvelle version ou quelles autres modifications je devrais apporter pour que cela fonctionne dans QGIS 3.0?

Trashmonk
la source

Réponses:

14

Vous pouvez simplement remplacer:

layers = iface.legendInterface().layers()

avec

layers = [layer for layer in QgsProject.instance().mapLayers().values()]
Joseph
la source
Cette solution ne fonctionnait pas assez bien pour moi car les couches obtenues n'étaient pas dans le même ordre que celui répertorié dans le panneau Calques.
AleksMat
@AleksMat - Bon à savoir que vous avez trouvé une méthode pour votre problème :)
Joseph
9

L'équivalent de

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

dans QGIS 3.0 est

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

Cela recherche récursivement tous les calques et les renvoie dans le même ordre que celui répertorié dans le panneau Calques.

AleksMat
la source
3

J'ai trouvé ceci pour lister les couches:

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

SzieberthAdam
la source
2

Jetez un œil à https://qgis.org/api/api_break.html - il y a littéralement des milliers de modifications à l'API, que les scripts 2.x doivent être mis à niveau pour être gérés.

ndawson
la source