Proje katmanlarını bağımsız bir PyQGIS komut dosyasında nasıl listeleyebilirim?


9

Varolan bir .qgs projesini yüklemeye ve içindeki katmanların bir listesini almaya çalışıyorum. Projeyi açabiliyor gibiyim, ancak katmanların listesini alamıyorum. Temel PyQGIS sözdizimi konusunda biraz kafam karıştı ve yemek kitabı bu özel örneği kapsamıyor.

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

Şu anda, layersprojenin var olmasına ve içinde birçok katmana sahip olmasına rağmen, boş bir dikte döndürüyor.


Ben QGIS 2.18.2OP ve @ GermánCarrillo denenmiş adımlarda aynı sorun var . OP'nin sürümü nedir?
raphael

O sırada Windows 7x64'te QGIS 2.16.2 kullanıyordum. O zamandan beri 2.18.2 denedim ve hala işe yaramadı.
KJYDavis

Bağlantılı soru QGIS içinde geçerli olduğu için bu soruyu yeniden açılmak üzere işaretledim, ancak çözüm bağımsız bir Python komut dosyasında çalışmıyor
raphael

Bunu denediniz mi: layers = QgsMapLayerRegistry.instance (). MapLayers (). Keys ()
Albert

QgsApplication.processEvents()Hemen arkasına yerleştirmeyi deneyebilir misiniz project.read?
Matthias Kuhn

Yanıtlar:


7

Kodunuzu çalıştırdığımda da boş bir sözlük alıyorum ama aşağıdakiler benim için biraz farklı çalışıyor:

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 bit için QGIS 2.18.3 üzerinde test edilmiştir.

Sonuç



Düzenle:

Kodunuz ve kullandığım arasındaki temel fark, QgsApplication oluşturmadan önce QApplication nesnesini oluşturmanız gerektiğidir. Bu yüzden değiştirmeniz gerekir:

qgs = QgsApplication([], False)

Bununla:

qgs = QApplication([], False)

Ancak QApplication sınıfının içe aktarılması gerekir, bu nedenle aşağıdakileri eklemeliyiz:

from PyQt4.QtGui import QApplication

Ve son olarak, bir temizlik yapmak istiyorsanız, sonunda aşağıdakileri eklemeniz gerekir.

QgsApplication.exitQgis()

Böylece, orijinal kodunuza daha yakın olan aşağıdaki kodu kullanmayı deneyebilirsiniz:

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

Bu Win7x64 QGIS 2.8.6 32-bit üzerinde çalıştı. Haftanın ilerleyen saatlerinde diğer sürümleri kontrol edeceğim.
KJYDavis

1
@Joseph, neyin farklı olduğunu açıklayabilir misin?
raphael

@raphael - Teşekkürler, ana farklılıkları dahil etmek için gönderiyi düzenledim;)
Joseph

1
Ayrıca Win7x64 üzerinde çalıştı QGIS 2.14.9x64
raphael
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.