독립형 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의 버전은 무엇입니까?
raphael

당시 Windows 7x64에서 QGIS 2.16.2를 사용하고있었습니다. 이후 2.18.2에서 시도했지만 여전히 작동하지 않았습니다.
KJYDavis

내가 링크 된 질문은 QGIS 내에서 적용되기 때문에 재개에 대한이 질문에 플래그하지만,이 솔루션은 독립형 파이썬 스크립트에서 작업을하지 않습니다
라파엘

시도해 보셨습니까 : layers = QgsMapLayerRegistry.instance (). mapLayers (). keys ()
Albert

당신은 QgsApplication.processEvents()바로 삽입 할 수 있습니까 project.read?
Matthias Kuhn

답변:


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

1
@Joseph, 다른 점을 설명해 주시겠습니까?
raphael

@raphael-감사합니다. 주요 차이점을 포함하도록 게시물을 편집했습니다.)
Joseph

1
Win7x64 QGIS 2.14.9x64 작업
raphael
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.