如何在独立的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尽管该项目存在并且其中包含许多层,但是这仅返回一个空dict。


QGIS 2.18.2OP和@GermánCarrillo的尝试步骤中,我遇到了同样的问题。OP的版本是什么?
拉斐尔

我当时在Windows 7x64上使用QGIS 2.16.2。此后尝试在2.18.2上仍然无法正常工作。
KJYDavis

我将此问题标记为重新开放,因为链接的问题适用于QGIS,但是该解决方案在独立的Python脚本中不起作用
raphael

您是否尝试过:图层= QgsMapLayerRegistry.instance()。mapLayers()。keys()
艾伯特

你可以尝试插入QgsApplication.processEvents()之后project.read
马提亚斯·库恩

Answers:


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

在Windows 7 64位版QGIS 2.18.3上进行了测试。

结果



编辑:

我认为,代码和使用的代码之间的主要区别在于,需要在创建QgsApplication之前创建QApplication对象。因此,您需要替换:

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 '17

1
@Joseph,你能解释一下有什么不同吗?
拉斐尔

@raphael-谢谢,我已经编辑了帖子,包括了主要不同之处;)
约瑟夫

1
还适用于Win7x64 QGIS 2.14.9x64
raphael
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.