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?

Réponses:


14

Vous pouvez simplement remplacer:

layers = iface.legendInterface().layers()

avec

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

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.


3

J'ai trouvé ceci pour lister les couches:

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


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.