Utilisation d'algorithmes de traitement QGIS3 à partir de scripts PyQGIS autonomes (en dehors de l'interface graphique)

24

J'écris un script qui doit fonctionner en dehors de l'interface graphique de QGIS. J'appelle certaines fonctions API à partir de qgis.core mais j'aimerais utiliser le plugin de traitement.

Je peux importer le traitement avec sys.path.append () mais je ne peux exécuter aucun processus. De plus, tous les algs "natifs" sont manquants dans QgsApplication.processingRegistry (). Algorithms ()

Est-il donc possible d'exécuter le traitement de cette façon? Qu'est-ce que je rate ?

import os, sys
from qgis.core import *
QgsApplication.setPrefixPath('/usr', True)
qgs = QgsApplication([], False)
qgs.initQgis()

sys.path.append('/usr/share/qgis/python/plugins')
from processing.core.Processing import Processing
Processing.initialize()
import processing

layer1 = QgsVectorLayer('data/ROUTE_PRIMAIRE.SHP')
layer2 = QgsVectorLayer('data/ROUTE_SECONDAIRE.SHP')

processing.run('qgis:union', layer1, layer2, 'test.shp') # returns nothing

Je suis sur QGIS 3.0.1 - Debian 9

vidlb
la source

Réponses:

30

Vous pouvez exécuter un algorithme de traitement QGIS en mode autonome (sans interface graphique) de cette manière:

import sys

from qgis.core import (
     QgsApplication, 
     QgsProcessingFeedback, 
     QgsVectorLayer
)

# See /gis//a/155852/4972 for details about the prefix 
QgsApplication.setPrefixPath('/usr', True)
qgs = QgsApplication([], False)
qgs.initQgis()

# Append the path where processing plugin can be found
sys.path.append('/docs/dev/qgis/build/output/python/plugins')

import processing
from processing.core.Processing import Processing
Processing.initialize()

layer1 = QgsVectorLayer('/path/to/geodata/lines_1.shp', 'layer 1', 'ogr')
layer2 = QgsVectorLayer('/path/to/geodata/lines_2.shp', 'layer 2', 'ogr')

# You can see what parameters are needed by the algorithm  
# using: processing.algorithmHelp("qgis:union")
params = { 
    'INPUT' : layer1,
    'OVERLAY' : layer2, 
    'OUTPUT' : '/path/to/output_layer.gpkg|layername=output'
}
feedback = QgsProcessingFeedback()

res = processing.run('qgis:union', params, feedback=feedback)
res['OUTPUT'] # Access your output layer

Algorithmes natifs

Maintenant, si vous souhaitez utiliser un algorithme natif (c'est-à-dire un algorithme du fournisseur natif, dont les algorithmes sont écrits en C ++), vous devez ajouter le fournisseur après avoir initialisé le traitement:

import sys

from qgis.core import (
     QgsApplication, 
     QgsProcessingFeedback, 
     QgsVectorLayer
)
from qgis.analysis import QgsNativeAlgorithms

# See /gis//a/155852/4972 for details about the prefix 
QgsApplication.setPrefixPath('/usr', True)
qgs = QgsApplication([], False)
qgs.initQgis()

# Append the path where processing plugin can be found
sys.path.append('/docs/dev/qgis/build/output/python/plugins')

import processing
from processing.core.Processing import Processing
Processing.initialize()
QgsApplication.processingRegistry().addProvider(QgsNativeAlgorithms())

layer = QgsVectorLayer('/path/to/geodata/lines.shp', 'my layer', 'ogr')

# You can see what parameters are needed by the algorithm  
# using: processing.algorithmHelp("native:extractvertices")
params = {
    'INPUT': layer,
    'OUTPUT': 'memory:'
}
feedback = QgsProcessingFeedback()

res = processing.run("native:extractvertices", params, feedback=feedback)
res['OUTPUT'] # Access your output layer
Germán Carrillo
la source
Fonctionne bien, merci! Est-il correct d'écrire la sortie sur le disque en même temps, si un chemin est fourni?
vidlb
Bien sûr, c'est aussi une option très utile.
Germán Carrillo
1
C'est de la pure magie - Merci de partager vos solutions détaillées!
root676
@ GermánCarrillo D'une manière ou d'une autre, un code très similaire ne fonctionne pas. Voir plus: gis.stackexchange.com/questions/286281/…
M. Che
J'essaie d'exécuter un algorithme QGIS dans un plugin QGIS, cela fonctionne-t-il de la même manière? Parce que je ne peux pas le faire fonctionner
gHupf
1

J'ai eu une erreur "NameError: le nom 'QgsNativeAlgorithms' n'est pas défini" lorsque j'ai essayé d'utiliser un algorithme natif comme ci-dessus, dans une installation OSGeo4W qui comprenait QGIS 3.4.4. La solution s'est avérée être une importation manquante:

from qgis.analysis import QgsNativeAlgorithms

(à partir du script autonome QGIS 3.4 / 3.6 )

Andrew_S
la source