Jak mogę wyświetlić warstwy projektu w samodzielnym skrypcie PyQGIS?

9

Próbuję załadować istniejący projekt .qgs i uzyskać listę warstw w środku. Wygląda na to, że mogę otworzyć projekt, ale nie mogę uzyskać listy warstw. Jestem trochę zdezorientowany co do podstawowej składni PyQGIS, a książka kucharska nie obejmuje tego konkretnego przykładu.

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

Obecnie layerszwraca to tylko pusty dyktand, mimo że projekt istnieje i zawiera wiele warstw.

KJYDavis
źródło
Mam ten sam problem w QGIS 2.18.2wypróbowanych krokach OP i @ GermánCarrillo. Jaka jest wersja OP?
raphael
W tym czasie korzystałem z QGIS 2.16.2 na Windows 7x64. Od tego czasu wypróbowałem 2.18.2 i nadal nie działałem.
KJYDavis,
Oflagowałem to pytanie do ponownego otwarcia, ponieważ powiązane pytanie dotyczy QGIS, ale rozwiązanie nie działa w samodzielnym skrypcie Python
raphael
Czy próbowałeś: layer = QgsMapLayerRegistry.instance (). MapLayers (). Keys ()
Albert
Czy możesz spróbować wstawić QgsApplication.processEvents()zaraz po project.read?
Matthias Kuhn

Odpowiedzi:

7

Po uruchomieniu kodu otrzymuję również pusty słownik, ale dla mnie działa to nieco inaczej:

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

Testowany na QGIS 2.18.3 dla Windows 7 64-bit.

Wynik



Edytować:

Uważam, że główną różnicą między twoim kodem a tym, czego użyłem, jest to, że musisz utworzyć obiekt QApplication przed utworzeniem aplikacji QgsApplication. Musisz więc wymienić:

qgs = QgsApplication([], False)

z tym:

qgs = QApplication([], False)

Ale klasa QApplication musi zostać zaimportowana, dlatego musimy dodać:

from PyQt4.QtGui import QApplication

I na koniec, jeśli chcesz zrobić porządki, musisz dodać następujące na końcu.

QgsApplication.exitQgis()

Możesz więc spróbować użyć następującego kodu, który jest bardziej zbliżony do oryginalnego kodu:

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
źródło
Działa to na 32-bitowej wersji Win7x64 QGIS 2.8.6. Sprawdzę inne wersje później w tym tygodniu.
KJYDavis
1
@Joseph, czy możesz wyjaśnić, co jest inne?
raphael
@raphael - Dzięki, zredagowałem post, aby uwzględnić główne różnice;)
Joseph
1
Pracował również nad Win7x64 QGIS 2.14.9x64
raphael