¿Accediendo al 'procesamiento' con Python?

16

Quiero acceder a la función de líneas de explosión en Python fuera de QGIS desde un script independiente.

¿Qué módulo debo cargar para usarlo?

¿Cómo puedo acceder processing?

from qgis.core import *

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

processing.runalg('qgis:explodelines', layerInput, 'temp.shp')
ustroetz
fuente
2
Creo que tienes que usar import processing.
Joseph
@Joseph Perdón por no ser específico: pero quiero acceder a él desde un script independiente.
ustroetz
Ahh no te preocupes :). En ese caso, me disculpo pero no lo sé, ya que siempre lo ejecuto dentro de QGIS. Esperemos que otros lo aconsejen.
Joseph
Hola @ustroetz, ¿lograste ejecutar esto desde tu secuencia de comandos independiente? Pregunto porque también estoy tratando de ejecutar scripts externos.
Joseph
@Joseph No, no lo he hecho
ustroetz

Respuestas:

25

ACTUALIZACIÓN 24.04.2018: Vea cómo hacer esto en QGIS v3.x aquí .


Para QGIS v2.x

Finalmente encontré la forma correcta de ejecutar algoritmos de procesamiento a través de scripts PyQGIS independientes.

Con el complemento de procesamiento versión 2.2.0-2, puede probar el siguiente 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()

Se pueden ubicar versiones más recientes de Processing /usr/share/qgis/python/plugins, por lo que es posible que deba usarlas en sys.path.append('/usr/share/qgis/python/plugins')consecuencia.

Encontré el ejemplo de trabajo en Error: Algoritmo no encontrado , que a su vez se basa en una discusión de la lista de correo Qgis-dev .

Germán Carrillo
fuente
1
El complemento de procesamiento puede no estar en '/home/user/.qgis2/python/plugins'. Puede encontrar la ubicación abriendo QGIS y haciendo clic en plugins/Manage and install pluginsdesplazarse hacia abajo para procesar y verá la ubicación de instalación en la descripción.
Mr Purple
2
Recibí muchas advertencias sobre cannot-create-a-qpixmapesta función independiente, pero veo que también resolvió eso en esta pregunta gis.stackexchange.com/questions/188074/…
Mr Purple
1
Puede hacer que el script independiente sea aún más genérico al soltar layerInputy cambiar la línea runalg a: general.runalg(*sys.argv[1:])sin mencionar que este script puede ser la base para el procesamiento SIG paralelo según esta pregunta: gis.stackexchange.com/questions/119961/…
Mr Púrpura
¿Es posible hacer el mismo marco pero ejecutar PLUGINS desde un Python independiente (no dentro de QGIS)? Ejecuté la función alglist () y no puedo ver mis complementos instalados en mi QGIS allí ...
Irene
3

Hasta que llegue a trabajar de la forma genérica de hacerlo, le diré una solución alternativa.

Uso el plugin de procesamiento versión 2.2.0-2 (le sugiero que use esta versión), que está instalado en /home/germap/.qgis2/python/plugins/mi computadora. Debe conocer la ubicación de esta carpeta, porque importa el módulo de procesamiento desde allí.

Como conoce el proveedor ( qgis) y el algoritmo ( explodelines), puede mirar /home/germap/.qgis2/python/plugins/processing/algs/qgis/para tomar el nombre del script de líneas de explosión: Explode.pyesta información le permite importar el algoritmo directamente a su script independiente de Python.

Entonces, abra una consola Python y copie el siguiente script (uso GNU / Linux, por lo que las variables de entorno están configuradas de manera predeterminada, lo que me permite importar bibliotecas qgis y PyQt4 en un instante):

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

Si no recibe mensajes de error, eso es todo. La capa de salida se ha guardado en la ruta de salida que especificó ( /home/user/data/out.shp)

Nota: Con respecto a una forma genérica (es decir, llamar a algoritmos por nombre), he encontrado algunos problemas que necesito resolver antes de publicarlo. Tan pronto como lo haga funcionar, lo publicaré.

Germán Carrillo
fuente