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
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:
(à partir du script autonome QGIS 3.4 / 3.6 )
la source