Làm cách nào tôi có thể liệt kê các lớp dự án trong tập lệnh PyQGIS độc lập?


9

Tôi đang cố tải một dự án .qss hiện có và nhận danh sách các lớp bên trong. Tôi dường như có thể mở dự án, nhưng tôi không thể có được danh sách các lớp. Tôi hơi bối rối về cú pháp PyQGIS cơ bản và sách dạy nấu ăn không bao gồm ví dụ cụ thể này.

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

Hiện tại, điều này chỉ layerstrả về một lệnh trống, mặc dù thực tế là dự án tồn tại và có nhiều lớp trong đó.


Tôi có cùng một vấn đề trong QGIS 2.18.2các bước đã thử của OP và @ GermánCarrillo. Phiên bản OP là gì?
raphael

Tôi đã sử dụng QGIS 2.16.2 trên Windows 7x64 tại thời điểm đó. Kể từ khi thử vào ngày 2.18.2 và vẫn không hoạt động.
KJYDavis

Tôi đã gắn cờ câu hỏi này để mở lại vì câu hỏi được liên kết áp dụng trong QGIS, nhưng giải pháp không hoạt động trong tập lệnh Python độc lập
raphael

Bạn đã thử chưa: layer = QssMapLayerRegistry.instance (). MapLayers (). Keys ()
Albert

Bạn có thể thử chèn QgsApplication.processEvents()ngay sau đó project.readkhông?
Matthias Kuhn

Câu trả lời:


7

Tôi cũng nhận được một từ điển trống khi tôi chạy mã của bạn nhưng các công việc sau đây đối với tôi hơi khác:

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

Đã thử nghiệm trên QGIS 2.18.3 cho Windows 7 64 bit.

Kết quả



Biên tập:

Sự khác biệt chính, tôi tin rằng, giữa mã của bạn và những gì tôi đã sử dụng là bạn cần tạo đối tượng QApplication trước khi tạo QSSApplication. Vì vậy, bạn sẽ cần phải thay thế:

qgs = QgsApplication([], False)

Với cái này:

qgs = QApplication([], False)

Nhưng lớp QApplication cần phải được nhập vì vậy chúng ta phải thêm vào như sau:

from PyQt4.QtGui import QApplication

Và cuối cùng, nếu bạn muốn dọn dẹp, bạn cần thêm phần sau vào cuối.

QgsApplication.exitQgis()

Vì vậy, bạn có thể thử sử dụng mã sau gần với mã gốc của mình hơn:

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

Điều này đã làm việc trên Win7x64 QGIS 2.8.6 32-bit. Tôi sẽ kiểm tra các phiên bản khác vào cuối tuần.
KJYDavis

1
@Joseph, bạn có thể giải thích những gì khác nhau?
raphael

@raphael - Cảm ơn, tôi đã chỉnh sửa bài đăng để bao gồm những khác biệt chính;)
Joseph

1
Cũng đã làm việc trên Win7x64 QGIS 2.14.9x64
raphael
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.