スタンドアロンの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.2OPと@GermánCarrilloの試行されたステップで同じ問題を抱えています。OPのバージョンは何ですか?
ラファエル2016

当時、Windows 7x64でQGIS 2.16.2を使用していました。それ以来2.18.2を試してみましたが、それでも機能しませんでした。
KJYDavis 16

リンクされた質問はQGIS内に適用されるため、この質問に再び
開くよう

お試しください:layers = QgsMapLayerRegistry.instance()。mapLayers()。keys()
Albert

QgsApplication.processEvents()直後挿入してみproject.readませんか?
Matthias Kuhn 2017年

回答:


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 for Windows 7 64ビットでテスト済み。

結果



編集:

あなたのコードと私が使用したものとの主な違いは、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 2017年

1
@ジョセフ、何が違うのか説明してくれませんか?
ラファエル2017年

@raphael-ありがとう、私は主な違いを含むように投稿を編集しました;)
ジョセフ

1
Win7x64 QGIS 2.14.9x64でも作業
ラファエル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.