Wie kann ich Projektebenen in einem eigenständigen PyQGIS-Skript auflisten?

9

Ich versuche, ein vorhandenes .qgs-Projekt zu laden und eine Liste der darin enthaltenen Ebenen abzurufen. Ich scheine in der Lage zu sein, das Projekt zu öffnen, aber ich kann die Liste der Ebenen nicht erhalten. Ich bin etwas verwirrt über die grundlegende PyQGIS-Syntax, und das Kochbuch behandelt dieses spezielle Beispiel nicht.

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()

Derzeit wird nur layersein leeres Diktat zurückgegeben, obwohl das Projekt vorhanden ist und viele Ebenen enthält.

KJYDavis
quelle
Ich habe das gleiche Problem in den QGIS 2.18.2erprobten Schritten von OP und @ GermánCarrillo. Was ist die OP-Version?
Raphael
Ich habe damals QGIS 2.16.2 unter Windows 7x64 verwendet. Habe seitdem 2.18.2 anprobiert und immer noch nicht funktioniert.
KJYDavis
Ich habe diese Frage zum erneuten Öffnen markiert, da die verknüpfte Frage für QGIS gilt, aber die Lösung funktioniert nicht in einem eigenständigen Python-Skript
Raphael
Haben Sie versucht: Ebenen = QgsMapLayerRegistry.instance (). MapLayers (). Keys ()
Albert
Können Sie versuchen, QgsApplication.processEvents()gleich danach einzufügen project.read?
Matthias Kuhn

Antworten:

7

Ich erhalte auch ein leeres Wörterbuch, wenn ich Ihren Code ausführe, aber das Folgende funktioniert für mich, was etwas anders ist:

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()

Getestet unter QGIS 2.18.3 für Windows 7 64-Bit.

Ergebnis



Bearbeiten:

Ich glaube, der Hauptunterschied zwischen Ihrem Code und dem, was ich verwendet habe, besteht darin, dass Sie das QApplication-Objekt erstellen müssen, bevor Sie die QgsApplication erstellen. Sie müssten also Folgendes ersetzen:

qgs = QgsApplication([], False)

mit diesem:

qgs = QApplication([], False)

Die QApplication-Klasse muss jedoch importiert werden, sodass Folgendes hinzugefügt werden muss:

from PyQt4.QtGui import QApplication

Wenn Sie eine Bereinigung durchführen möchten, müssen Sie am Ende Folgendes hinzufügen.

QgsApplication.exitQgis()

Sie können also versuchen, den folgenden Code zu verwenden, der Ihrem ursprünglichen Code näher kommt:

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
quelle
Dies funktionierte unter Win7x64 QGIS 2.8.6 32-Bit. Ich werde später in der Woche andere Versionen überprüfen.
KJYDavis
1
@ Joseph, kannst du erklären, was anders ist?
Raphael
@raphael - Danke, ich habe den Beitrag bearbeitet, um die Hauptunterschiede aufzunehmen;)
Joseph
1
Arbeitete auch an Win7x64 QGIS 2.14.9x64
Raphael