Como posso listar as camadas do projeto em um script PyQGIS independente?

9

Estou tentando carregar um projeto .qgs existente e obter uma lista das camadas dentro. Parece que consigo abrir o projeto, mas não consigo obter a lista de camadas. Estou um pouco confuso quanto à sintaxe básica do PyQGIS, e o livro de receitas não cobre este exemplo 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()

Atualmente, isso apenas layersretorna um ditado vazio, apesar do fato de o projeto existir e ter muitas camadas nele.

KJYDavis
fonte
Eu tenho o mesmo problema nas QGIS 2.18.2etapas experimentadas do OP e @ GermánCarrillo. Qual é a versão do OP?
Raphael
Eu estava usando o QGIS 2.16.2 no Windows 7x64 na época. Desde então, tentei a 2.18.2 e ainda não funcionou.
KJYDavis
I marcado esta pergunta para a reabertura porque a questão ligada aplica-se a dentro QGIS, mas a solução não funciona em um autônomo Python roteiro
raphael
Já experimentou: camadas = QgsMapLayerRegistry.instance () mapLayers () teclas ()..
Albert
Você pode tentar inserir QgsApplication.processEvents()logo depois project.read?
Matthias Kuhn

Respostas:

7

Também recebo um dicionário vazio quando executo seu código, mas o seguinte funciona para mim, que é um pouco 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()

Testado no QGIS 2.18.3 para Windows 7 de 64 bits.

Resultado



Editar:

A principal diferença, acredito, entre seu código e o que eu usei é que você precisa criar o objeto QApplication antes de criar o QgsApplication. Então você precisaria substituir:

qgs = QgsApplication([], False)

com isso:

qgs = QApplication([], False)

Mas a classe QApplication precisa ser importada, portanto, devemos adicionar o seguinte:

from PyQt4.QtGui import QApplication

E, finalmente, se você quiser fazer uma limpeza, adicione o seguinte no final.

QgsApplication.exitQgis()

Portanto, você pode tentar usar o código a seguir, mais próximo do 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()
Joseph
fonte
Isso funcionou no Win7x64 QGIS 2.8.6 de 32 bits. Vou verificar outras versões no final da semana.
precisa saber é o seguinte
11
@ Joseph, você poderia explicar o que é diferente?
Raphael
@raphael - Obrigado, eu editei o post para incluir as principais diferenças;)
Joseph
11
Também trabalhou no Win7x64 QGIS 2.14.9x64
raphael