Bagaimana saya bisa membuat daftar lapisan proyek dalam skrip PyQGIS mandiri?

9

Saya mencoba memuat proyek .qgs yang ada dan mendapatkan daftar lapisan di dalamnya. Saya sepertinya bisa membuka proyek, tetapi saya tidak bisa mendapatkan daftar layer. Saya agak bingung dengan sintaks PyQGIS dasar, dan buku masak tidak mencakup contoh khusus ini.

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

Saat ini, ini hanya layersmengembalikan dict kosong, terlepas dari kenyataan bahwa proyek itu ada dan memiliki banyak lapisan di dalamnya.

KJYDavis
sumber
Saya memiliki masalah yang sama dalam QGIS 2.18.2langkah mencoba OP dan @ GermánCarrillo. Apa versi OP?
raphael
Saya menggunakan QGIS 2.16.2 pada Windows 7x64 pada saat itu. Sejak mencoba pada 2.18.2 dan masih tidak berhasil.
KJYDavis
Saya menandai pertanyaan ini untuk dibuka kembali karena pertanyaan terkait berlaku di dalam QGIS, tetapi solusinya tidak berfungsi dalam skrip Python mandiri
raphael
Sudahkah Anda mencoba: layers = QgsMapLayerRegistry.instance (). MapLayers (). Keys ()
Albert
Bisakah Anda mencoba menyisipkan QgsApplication.processEvents()setelah itu project.read?
Matthias Kuhn

Jawaban:

7

Saya juga menerima kamus kosong ketika saya menjalankan kode Anda tetapi yang berikut ini berfungsi untuk saya yang sedikit berbeda:

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

Diuji pada QGIS 2.18.3 untuk Windows 7 64-bit.

Hasil



Edit:

Perbedaan utama, saya percaya, antara kode Anda dan apa yang saya gunakan adalah bahwa Anda perlu membuat objek QApplication sebelum membuat QgsApplication. Jadi, Anda perlu mengganti:

qgs = QgsApplication([], False)

dengan ini:

qgs = QApplication([], False)

Tetapi kelas QApplication perlu diimpor sehingga kami harus menambahkan yang berikut:

from PyQt4.QtGui import QApplication

Dan akhirnya, jika Anda ingin melakukan pembersihan, Anda perlu menambahkan yang berikut di akhir.

QgsApplication.exitQgis()

Jadi Anda dapat mencoba menggunakan kode berikut yang lebih dekat dengan kode asli Anda:

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()
Yusuf
sumber
Ini bekerja pada Win7x64 QGIS 2.8.6 32-bit. Saya akan memeriksa versi lain di minggu ini.
KJYDavis
1
@ Joseph, bisakah Anda menjelaskan apa yang berbeda?
raphael
@raphael - Terima kasih, saya telah mengedit posting untuk memasukkan perbedaan utama;)
Joseph
1
Juga bekerja pada Win7x64 QGIS 2.14.9x64
raphael