¿Cómo puedo enumerar capas de proyecto en un script PyQGIS independiente?

9

Estoy tratando de cargar un proyecto .qgs existente y obtener una lista de las capas dentro. Parece que puedo abrir el proyecto, pero no puedo obtener la lista de capas. Estoy un poco confundido en cuanto a la sintaxis básica de PyQGIS, y el libro de cocina no cubre este ejemplo específico.

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

Actualmente, esto solo layersdevuelve un dict vacío, a pesar de que el proyecto existe y tiene muchas capas.

KJYDavis
fuente
Tengo el mismo problema en los QGIS 2.18.2pasos probados de OP y @ GermánCarrillo. ¿Cuál es la versión de OP?
raphael
Estaba usando QGIS 2.16.2 en Windows 7x64 en ese momento. Desde entonces he probado en 2.18.2 y todavía no funcionó.
KJYDavis
Marqué esta pregunta para reabrirla porque la pregunta vinculada se aplica dentro de QGIS, pero la solución no funciona en un script de Python independiente
raphael
¿Has probado: layers = QgsMapLayerRegistry.instance (). MapLayers (). Keys ()
Albert
¿Puedes intentar insertar QgsApplication.processEvents()justo después project.read?
Matthias Kuhn

Respuestas:

7

También recibo un diccionario vacío cuando ejecuto su código, pero lo siguiente funciona para mí, que es ligeramente diferente:

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

Probado en QGIS 2.18.3 para Windows 7 de 64 bits.

Resultado



Editar:

La principal diferencia, creo, entre su código y lo que usé es que necesita crear el objeto QApplication antes de crear QgsApplication. Entonces necesitarías reemplazar:

qgs = QgsApplication([], False)

con este:

qgs = QApplication([], False)

Pero la clase QApplication debe importarse, por lo que debemos agregar lo siguiente:

from PyQt4.QtGui import QApplication

Y finalmente, si desea hacer una limpieza, debe agregar lo siguiente al final.

QgsApplication.exitQgis()

Por lo tanto, puede intentar usar el siguiente código que está más cerca de su código original:

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()
José
fuente
Esto funcionó en Win7x64 QGIS 2.8.6 de 32 bits. Comprobaré otras versiones más adelante en la semana.
KJYDavis
1
@ Joseph, ¿podrías explicar qué es diferente?
raphael
@raphael - Gracias, he editado la publicación para incluir las principales diferencias;)
Joseph
1
También trabajó en Win7x64 QGIS 2.14.9x64
raphael