Comment répertorier les couches de projet dans un script PyQGIS autonome?

9

J'essaie de charger un projet .qgs existant et d'obtenir une liste des couches à l'intérieur. Il me semble que je peux ouvrir le projet, mais je ne parviens pas à obtenir la liste des couches. Je suis un peu confus quant à la syntaxe de base de PyQGIS, et le livre de recettes ne couvre pas cet exemple spécifique.

from qgis.core import *
from PyQt4.QtCore import QFileInfo


QgsApplication.setPrefixPath(r"C:\OSGeo4W\apps\qgis-ltr", True)
qgs = QgsApplication([], False)
qgs.initQgis()
# Get the project instance
project = QgsProject.instance()
# Open the project
project.read(QFileInfo(
        r'C:\path\to\project\project.qgs'))
print project.fileName()
# Get the layers in the project
layers = QgsMapLayerRegistry.instance().mapLayers()

print layers
qgs.exitQgis()

Actuellement, cela layersrenvoie simplement un dict vide, malgré le fait que le projet existe et comporte de nombreuses couches.

KJYDavis
la source
J'ai le même problème dans les QGIS 2.18.2étapes éprouvées de OP et @ GermánCarrillo. Quelle est la version d'OP?
raphael
J'utilisais QGIS 2.16.2 sur Windows 7x64 à l'époque. J'ai depuis essayé la 2.18.2 et cela n'a toujours pas fonctionné.
KJYDavis
J'ai signalé cette question pour la réouverture car la question liée s'applique à QGIS, mais la solution ne fonctionne pas dans un script Python autonome
raphael
Avez-vous essayé: layers = QgsMapLayerRegistry.instance (). MapLayers (). Keys ()
Albert
Pouvez-vous essayer d'insérer QgsApplication.processEvents()juste après project.read?
Matthias Kuhn

Réponses:

7

Je reçois également un dictionnaire vide lorsque j'exécute votre code, mais ce qui suit fonctionne pour moi, ce qui est légèrement différent:

from qgis.core import *
from PyQt4.QtCore import QFileInfo
from PyQt4.QtGui import QApplication
import os

from os.path import expanduser
home = expanduser("~")

QgsApplication( [], False, home + "/AppData/Local/Temp" )
QgsApplication.setPrefixPath("C:/OSGeo4W64/apps/qgis", True)
app = QApplication([], True)
QgsApplication.initQgis()

# Get the project instance
project = QgsProject.instance()
# Open the project
project.read(QFileInfo('C:\path\to\project\project.qgs'))
print project.fileName()
# Get the layers in the project
layers = QgsMapLayerRegistry.instance().mapLayers()
print layers

QgsApplication.exitQgis()
app.exit()

Testé sur QGIS 2.18.3 pour Windows 7 64 bits.

Résultat



Éditer:

La principale différence, je crois, entre votre code et ce que j'ai utilisé est que vous devez créer l'objet QApplication avant de créer QgsApplication. Vous devrez donc remplacer:

qgs = QgsApplication([], False)

avec ça:

qgs = QApplication([], False)

Mais la classe QApplication doit être importée, nous devons donc ajouter ce qui suit:

from PyQt4.QtGui import QApplication

Et enfin, si vous voulez faire un nettoyage, vous devez ajouter ce qui suit à la fin.

QgsApplication.exitQgis()

Vous pouvez donc essayer d'utiliser le code suivant qui est plus proche de votre code d'origine:

from qgis.core import *
from PyQt4.QtCore import QFileInfo
from PyQt4.QtGui import QApplication

QgsApplication.setPrefixPath("C:/OSGeo4W64/apps/qgis", True)
qgs = QApplication([], False)
QgsApplication.initQgis()
# Get the project instance
project = QgsProject.instance()
# Open the project
project.read(QFileInfo('C:/path/to/project/project.qgs'))
print project.fileName()
# Get the layers in the project
layers = QgsMapLayerRegistry.instance().mapLayers()

print layers
QgsApplication.exitQgis()
Joseph
la source
Cela a fonctionné sur Win7x64 QGIS 2.8.6 32 bits. Je vérifierai d'autres versions plus tard dans la semaine.
KJYDavis
1
@Joseph, pourriez-vous expliquer ce qui est différent?
raphael
@raphael - Merci, j'ai édité le post pour inclure les principales différences;)
Joseph
1
A également travaillé sur Win7x64 QGIS 2.14.9x64
raphael