Acessando `processing` com Python?

16

Eu quero acessar a função de linhas de explosão no Python fora do QGIS a partir de um script independente.

Que módulo eu tenho que carregar para usá-lo?

Como posso acessar processing?

from qgis.core import *

layerInput = QgsVectorLayer('test.shp', 'test', 'ogr')

processing.runalg('qgis:explodelines', layerInput, 'temp.shp')
ustroetz
fonte
2
Eu acho que você tem que usar import processing.
Joseph
@ Joseph Desculpe por não ser específico: mas eu quero acessá-lo a partir de um script independente.
ustroetz
Ahh não se preocupe :). Nesse caso, peço desculpas, mas não sei, pois sempre o executo no QGIS. Espero que outros o aconselhem.
Joseph
Oi @ustroetz, você conseguiu executar isso a partir do seu script independente? Eu pergunto porque também estou tentando executar scripts externos.
Joseph
@ Joseph Não, eu não tenho
ustroetz

Respostas:

25

ATUALIZAÇÃO 24.04.2018: Veja como fazer isso no QGIS v3.x aqui .


Para QGIS v2.x

Finalmente, encontrei a maneira correta de executar algoritmos de processamento por meio de scripts PyQGIS independentes.

Usando o plugin de processamento versão 2.2.0-2, você pode tentar o seguinte script:

# Prepare the environment
import sys
from qgis.core import *
from PyQt4.QtGui import *
app = QApplication([])
QgsApplication.setPrefixPath("/usr", True)
QgsApplication.initQgis()

# Prepare processing framework 
sys.path.append('/home/user/.qgis2/python/plugins') # Folder where Processing is located
from processing.core.Processing import Processing
Processing.initialize()
from processing.tools import *

# Run the algorithm
layerInput = QgsVectorLayer('test.shp', 'test', 'ogr')
general.runalg('qgis:explodelines', layerInput, 'temp.shp')

# Exit applications
QgsApplication.exitQgis()
QApplication.exit()

As versões mais recentes de processamento podem estar localizadas em /usr/share/qgis/python/plugins, portanto, você pode precisar usá-lo sys.path.append('/usr/share/qgis/python/plugins')adequadamente.

Encontrei o exemplo de trabalho em Erro: Algoritmo não encontrado , que por sua vez é baseado em uma discussão na lista de discussão do Qgis-dev .

Germán Carrillo
fonte
1
O plug-in de processamento pode não estar em '/home/user/.qgis2/python/plugins'. Você pode encontrar o local abrindo o QGIS e clicando em plugins/Manage and install pluginsrolar para baixo para processamento e você verá o local da instalação na descrição.
Sr. Purple
2
Recebi muitas advertências sobre cannot-create-a-qpixmapcom este suporte função sozinho, mas eu vejo que você resolveu que também nesta questão gis.stackexchange.com/questions/188074/...
Sr. Roxo
1
Você pode tornar o script independente ainda mais genérico, layerInputremovendo e alterando a linha runalg para: para general.runalg(*sys.argv[1:])não mencionar que esse script pode ser a base do processamento paralelo de GIS conforme esta pergunta: gis.stackexchange.com/questions/119961/…
Sr. Purple
É possível fazer a mesma estrutura, mas executar PLUGINS a partir de um Python independente (não dentro do QGIS)? I executada alglist function () e eu não posso ver o meu plugins instalados no meu QGIS lá ...
Irene
3

Até que eu comece a trabalhar da maneira genérica de fazê-lo, eu direi uma solução alternativa.

Eu uso o plugin Processing versão 2.2.0-2 (sugiro que você use esta versão), instalada no /home/germap/.qgis2/python/plugins/meu computador. Você precisa conhecer o local desta pasta, porque você importa o módulo de processamento a partir daí.

Como você conhece o provedor ( qgis) e o algoritmo ( explodelines), pode /home/germap/.qgis2/python/plugins/processing/algs/qgis/usar o nome do script das linhas de explosão: Explode.pyEssas informações permitem importar o algoritmo diretamente para o script independente do Python.

Portanto, abra um console Python e copie o seguinte script (eu uso o GNU / Linux, para que as variáveis ​​de ambiente sejam definidas por padrão, permitindo que eu importe as bibliotecas qgis e PyQt4 com facilidade):

# Prepare the environment
import sys
from PyQt4.QtGui import *
from qgis.core import *
app = QApplication([])
QgsApplication.setPrefixPath("/usr", True)
QgsApplication.initQgis()

# Tell Python where you will get processing from
sys.path.append('/home/germap/.qgis2/python/plugins')

# Reference the algorithm you want to run
from processing.algs.qgis.Explode import *
alg = Explode() 

# Set input and output
inLayer = QgsVectorLayer('/home/user/data/in.shp', 'input', 'ogr')
outLayer = '/home/user/data/out.shp'
alg.setParameterValue('INPUT', inLayer)
alg.setOutputValue('OUTPUT', outLayer)

# Run the algorithm
from processing.core.SilentProgress import SilentProgress
progress = SilentProgress()
alg.processAlgorithm(progress)

Se você não receber mensagens de erro, é isso. A camada de saída foi salva no caminho de saída que você especificou ( /home/user/data/out.shp)

Nota: Em relação a uma maneira genérica (ou seja, chamar algoritmos pelo nome), encontrei alguns problemas que preciso resolver antes de publicá-lo. Assim que eu funcionar, eu a publicarei.

Germán Carrillo
fonte