Accéder au `traitement` avec Python?

16

Je veux accéder à la fonction d'éclatement des lignes en Python en dehors de QGIS à partir d'un script autonome.

Quel module dois-je charger pour l'utiliser?

Comment puis-je y accéder processing?

from qgis.core import *

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

processing.runalg('qgis:explodelines', layerInput, 'temp.shp')
ustroetz
la source
2
Je pense que vous devez utiliser import processing.
Joseph
@Joseph Désolé de ne pas être précis: mais je veux y accéder à partir d'un script autonome.
ustroetz
Ahh pas de soucis :). Dans ce cas, excuses mais je ne sais pas car je l'exécute toujours dans QGIS. J'espère que d'autres vous conseilleront.
Joseph
Salut @ustroetz, avez-vous réussi à exécuter cela à partir de votre script autonome? Je demande parce que j'essaie également d'exécuter des scripts externes.
Joseph
@Joseph Non, je n'ai pas
ustroetz

Réponses:

25

MISE À JOUR 24.04.2018: Découvrez comment procéder dans QGIS v3.x ici .


Pour QGIS v2.x

Enfin trouvé la bonne façon d'exécuter des algorithmes de traitement via des scripts PyQGIS autonomes.

En utilisant le plugin de traitement version 2.2.0-2, vous pouvez essayer le script suivant:

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

Les versions de traitement plus récentes peuvent être localisées à /usr/share/qgis/python/plugins, vous devrez donc peut-être les utiliser en sys.path.append('/usr/share/qgis/python/plugins')conséquence.

J'ai trouvé l'exemple de travail dans Error: Algorithm not found , qui est à son tour basé sur une discussion sur la liste de diffusion Qgis-dev .

Germán Carrillo
la source
1
Le plugin de traitement n'est peut-être pas à '/home/user/.qgis2/python/plugins'. Vous pouvez trouver l'emplacement en ouvrant QGIS et en cliquant sur plugins/Manage and install pluginsfaire défiler vers le bas pour le traitement et vous verrez l'emplacement d'installation dans la description.
M. Purple
2
J'ai reçu beaucoup d'avertissements à propos cannot-create-a-qpixmapde cette fonction autonome, mais je vois que vous avez également résolu ce problème dans cette question gis.stackexchange.com/questions/188074/…
M. Violet
1
Vous pouvez rendre le script autonome encore plus générique en layerInputsupprimant et en modifiant la ligne runalg en: general.runalg(*sys.argv[1:])sans oublier que ce script peut être la base d'un traitement SIG parallèle selon cette question: gis.stackexchange.com/questions/119961/…
Mr Violet
Est-il possible de faire le même framework mais d'exécuter des PLUGINS à partir d'un Python autonome (pas à l'intérieur de QGIS)? J'ai exécuté la fonction alglist () et je ne vois pas mes plugins installés dans mon QGIS là-dedans ...
Irene
3

Jusqu'à ce que j'arrive à travailler de la manière générique de le faire, je vais vous dire une solution de contournement.

J'utilise le plugin de traitement version 2.2.0-2 (je vous suggère d'utiliser cette version), qui est installé /home/germap/.qgis2/python/plugins/sur mon ordinateur. Vous devez connaître cet emplacement de dossier, car vous importez le module de traitement à partir de là.

Puisque vous connaissez le fournisseur ( qgis) et l'algorithme ( explodelines), vous pouvez regarder /home/germap/.qgis2/python/plugins/processing/algs/qgis/pour prendre le nom du script d'éclatement des lignes: Explode.pyCes informations vous permettent d'importer l'algorithme directement dans votre script autonome Python.

Alors, ouvrez une console Python et copiez le script suivant (j'utilise GNU / Linux, donc les variables d'environnement sont définies par défaut, ce qui me permet d'importer des bibliothèques qgis et PyQt4 en un clin d'œil):

# 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 vous n'obtenez pas de messages d'erreur, c'est tout. Le calque de sortie a été enregistré dans le chemin de sortie que vous avez spécifié ( /home/user/data/out.shp)

Remarque: Concernant une méthode générique (c'est-à-dire appeler des algorithmes par leur nom), j'ai trouvé quelques problèmes que je dois résoudre avant de les publier. Dès que je le ferai fonctionner, je le posterai.

Germán Carrillo
la source