Як я можу перерахувати шари проектів у самостійному сценарії PyQGIS?


9

Я намагаюся завантажити існуючий проект .qgs і отримати список шарів всередині. Здається, я можу відкрити проект, але я не можу отримати список шарів. Я трохи розгублений щодо основного синтаксису PyQGIS, і кулінарна книга не висвітлює цей конкретний приклад.

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

Наразі це просто layersповертає порожній диктант, незважаючи на те, що проект існує і в ньому багато шарів.


У мене така ж проблема у QGIS 2.18.2перепробуваних кроках ОП та @ GermánCarrillo. Яка версія OP?
raphael

У той час я використовував QGIS 2.16.2 на Windows 7x64. З тих пір спробував 2.18.2 і все ще не вийшло.
KJYDavis

Я позначив це питання на повторне відкриття, оскільки пов'язане питання стосується QGIS, але рішення не працює в окремому сценарії Python
raphael

Ви пробували: шари = QgsMapLayerRegistry.instantion (). MapLayers (). Keys ()
Альберт

Чи можете ви спробувати вставити QgsApplication.processEvents()відразу після project.read?
Маттіас Кун

Відповіді:


7

Я також отримую порожній словник, коли запускаю ваш код, але для мене це працює трохи інше:

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

Тестовано на QGIS 2.18.3 для Windows 7 64-розрядні.

Результат



Редагувати:

Я вважаю, що головна відмінність між вашим кодом і тим, що я використав, полягає в тому, що вам потрібно створити об'єкт QApplication перед створенням QgsApplication. Тому вам потрібно буде замінити:

qgs = QgsApplication([], False)

з цим:

qgs = QApplication([], False)

Але клас QApplication потрібно імпортувати, тому ми мусимо додати наступне:

from PyQt4.QtGui import QApplication

І нарешті, якщо ви хочете зробити очищення, вам потрібно додати наступне в кінці.

QgsApplication.exitQgis()

Тож ви можете спробувати скористатися наступним кодом, який ближче до початкового коду:

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

Це працювало на Win7x64 QGIS 2.8.6 32-розрядному. Пізніше тижня я перевірю інші версії.
KJYDavis

1
@ Джозеф, ти можеш пояснити, що відрізняється?
Рафаель

@raphael - Дякую, я відредагував пост, щоб включити основні відмінності;)
Йосип

1
Також працював на Win7x64 QGIS 2.14.9x64
Raphael
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.