Accedere a `processing` con Python?


16

Voglio accedere alla funzione delle linee di esplosione in Python al di fuori di QGIS da uno script autonomo.

Quale modulo devo caricare per usarlo?

Come posso accedere processing?

from qgis.core import *

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

processing.runalg('qgis:explodelines', layerInput, 'temp.shp')

2
Penso che devi usare import processing.
Joseph,

@Joseph Siamo spiacenti per non essere specifici: ma voglio accedervi da uno script autonomo.
ustroetz,

Ahh nessuna preoccupazione :). In tal caso, mi scuso ma non lo so perché lo eseguo sempre all'interno di QGIS. Spero che altri lo consiglieranno.
Joseph,

Ciao @ustroetz, sei riuscito a eseguirlo dal tuo script autonomo? Lo chiedo perché sto anche cercando di eseguire script esterni.
Joseph,

@Joseph No, non ho
ustroetz il

Risposte:


25

AGGIORNAMENTO 24.04.2018: guarda come fare in QGIS v3.x qui .


Per QGIS v2.x

Finalmente ho trovato il modo corretto di eseguire algoritmi di elaborazione tramite script PyQGIS autonomi.

Utilizzando il plug-in di elaborazione versione 2.2.0-2, puoi provare il seguente 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()

Le versioni di elaborazione più recenti potrebbero trovarsi in /usr/share/qgis/python/plugins, quindi potrebbe essere necessario utilizzarle di sys.path.append('/usr/share/qgis/python/plugins')conseguenza.

Ho trovato l'esempio funzionante in Errore: algoritmo non trovato , che a sua volta si basa su una discussione sulla mailing list di Qgis-dev .


1
Il plug-in di elaborazione potrebbe non essere disponibile '/home/user/.qgis2/python/plugins'. È possibile trovare la posizione aprendo QGIS e facendo clic su plugins/Manage and install pluginsverso il basso per l'elaborazione e vedrai la posizione di installazione nella descrizione.
Sig. Purple,

2
Ho ricevuto molti avvisi cannot-create-a-qpixmapcon questa funzione autonoma, ma vedo che anche tu hai risolto questo problema in questa domanda gis.stackexchange.com/questions/188074/…
Mr Purple

1
Puoi rendere lo script autonomo ancora più generico rilasciando layerInpute modificando la riga runalg in: per general.runalg(*sys.argv[1:])non parlare del fatto che questo script può essere la base per l'elaborazione GIS parallela secondo questa domanda: gis.stackexchange.com/questions/119961/…
Mr Viola

È possibile fare lo stesso framework ma eseguire PLUGINS da un Python autonomo (non all'interno di QGIS)? Ho eseguito la funzione alglist () e non riesco a vedere i miei plugin installati nel mio QGIS lì dentro ...
Irene,

3

Fino a quando non riuscirò a lavorare nel modo generico di farlo, ti dirò una soluzione alternativa.

Uso il plug-in di elaborazione versione 2.2.0-2 (ti consiglio di utilizzare questa versione), che è installato /home/germap/.qgis2/python/plugins/sul mio computer. È necessario conoscere il percorso di questa cartella, poiché da lì si importa il modulo di elaborazione.

Dato che conosci il provider ( qgis) e l'algoritmo ( explodelines), puoi guardare /home/germap/.qgis2/python/plugins/processing/algs/qgis/per prendere il nome dello script delle linee di esplosione: Explode.pyquesta informazione ti consente di importare l'algoritmo direttamente nello script autonomo di Python.

Quindi, apri una console Python e copia il seguente script (uso GNU / Linux, quindi le variabili di ambiente sono impostate di default, permettendomi di importare le librerie qgis e PyQt4 in un gioco da ragazzi):

# 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 non ricevi messaggi di errore, è tutto. Il livello di output è stato salvato nel percorso di output specificato ( /home/user/data/out.shp)

Nota: per quanto riguarda un modo generico (es. Chiamare algoritmi per nome), ho riscontrato alcuni problemi che devo risolvere prima di pubblicarlo. Non appena lo farò funzionare, lo pubblicherò.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.