ฉันจะแสดงรายการเลเยอร์โครงการในสคริปต์ 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ส่งคืนทictที่ว่างเปล่าแม้ว่าจะมีโครงการอยู่และมีหลายเลเยอร์อยู่


ฉันมีปัญหาเดียวกันในQGIS 2.18.2ขั้นตอนการทดลองของ OP และ @ GermánCarrillo รุ่นของ OP คืออะไร
ฟาเอล

ฉันใช้ QGIS 2.16.2 ใน Windows 7x64 ในเวลานั้น ได้ลองตั้งแต่วันที่ 2.18.2 และยังใช้งานไม่ได้
KJYDavis

ฉันตั้งค่าสถานะคำถามนี้เพื่อเปิดใหม่เนื่องจากคำถามที่เชื่อมโยงใช้กับภายใน QGIS แต่โซลูชันไม่ทำงานในสคริปต์ Python แบบสแตนด์อโลน
raphael

คุณได้ลองแล้ว: 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()

ทดสอบกับ 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 - ขอบคุณฉันได้แก้ไขโพสต์ที่จะรวมถึงความแตกต่างหลัก;)
โจเซฟ

1
ยังทำงานใน Win7x64 QGIS 2.14.9x64
ราฟาเอล
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.