Come posso elencare i livelli di progetto in uno script PyQGIS autonomo?


9

Sto cercando di caricare un progetto .qgs esistente e ottenere un elenco dei livelli all'interno. Mi sembra di poter aprire il progetto, ma non riesco a ottenere l'elenco dei livelli. Sono un po 'confuso riguardo alla sintassi di base di PyQGIS e il libro di cucina non tratta questo esempio specifico.

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

Attualmente, questo layersrestituisce solo un vuoto, nonostante il fatto che il progetto esista e contenga molti livelli.


Ho lo stesso problema nei QGIS 2.18.2passaggi provati di OP e @ GermánCarrillo. Qual è la versione di OP?
Raffaello,

All'epoca stavo usando QGIS 2.16.2 su Windows 7x64. Da allora ho provato il 2.18.2 e ancora non ha funzionato.
KJYDavis,

Ho contrassegnato questa domanda per la riapertura perché la domanda collegata si applica a QGIS, ma la soluzione non funziona in uno script Python autonomo
raphael

Hai provato: layers = QgsMapLayerRegistry.instance (). MapLayers (). Keys ()
Albert

Puoi provare a inserire QgsApplication.processEvents()subito dopo project.read?
Matthias Kuhn,

Risposte:


7

Ricevo anche un dizionario vuoto quando eseguo il tuo codice ma quanto segue funziona per me che è leggermente diverso:

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

Testato su QGIS 2.18.3 per Windows 7 a 64 bit.

Risultato



Modificare:

La differenza principale, credo, tra il tuo codice e quello che ho usato è che devi creare l'oggetto QApplication prima di creare QgsApplication. Quindi dovresti sostituire:

qgs = QgsApplication([], False)

con questo:

qgs = QApplication([], False)

Ma la classe QApplication deve essere importata, quindi dobbiamo aggiungere quanto segue:

from PyQt4.QtGui import QApplication

E infine, se si desidera eseguire una pulizia, è necessario aggiungere quanto segue alla fine.

QgsApplication.exitQgis()

Quindi potresti provare a usare il seguente codice che è più vicino al tuo codice originale:

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

Funzionava con Win7x64 QGIS 2.8.6 a 32 bit. Controllerò altre versioni più avanti nella settimana.
KJYDavis,

1
@Joseph, potresti spiegare cosa c'è di diverso?
Raffaello,

@raphael - Grazie, ho modificato il post per includere le differenze principali;)
Joseph

1
Ha anche lavorato su Win7x64 QGIS 2.14.9x64
raphael il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.