¿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.


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

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.