Как я могу перечислить слои проекта в автономном скрипте 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возвращает пустой диктат, несмотря на то, что проект существует и имеет много слоев.

KJYDavis
источник
У меня та же проблема в QGIS 2.18.2пробных шагах OP и @ GermánCarrillo. Какая версия ОП?
Рафаэль
В то время я использовал QGIS 2.16.2 на Windows 7x64. С тех пор попробовал на 2.18.2 и до сих пор не работает.
KJYDavis
Я пометил этот вопрос для повторного открытия, потому что связанный вопрос относится к QGIS, но решение не работает в автономном скрипте Python
Raphael
Вы пробовали: слои = QgsMapLayerRegistry.instance (). 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-bit.

Результат



Редактировать:

Я полагаю, что основное различие между вашим кодом и тем, что я использовал, заключается в том, что вам нужно создать объект 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-bit. Я проверю другие версии позже на этой неделе.
KJYDavis
1
@ Джозеф, не могли бы вы объяснить, в чем дело?
Raphael
@raphael - Спасибо, я отредактировал пост, включив в него основные различия;)
Джозеф
1
Также работал на Win7x64 QGIS 2.14.9x64
Raphael