Verwenden von QGIS3-Verarbeitungsalgorithmen aus eigenständigen PyQGIS-Skripten (außerhalb der GUI)

23

Ich schreibe ein Skript, das außerhalb der QGIS-GUI funktionieren muss. Ich rufe einige API-Funktionen von qgis.core auf, möchte aber das Verarbeitungs-Plugin verwenden.

Ich kann die Verarbeitung mit sys.path.append () importieren, aber ich kann keinen Prozess ausführen. Darüber hinaus fehlen in QgsApplication.processingRegistry () alle "nativen" Algorithmen ().

Ist es also möglich, die Verarbeitung auf diese Weise auszuführen? Was vermisse ich ?

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

Ich bin auf QGIS 3.0.1 - Debian 9

vidlb
quelle

Antworten:

28

Sie können einen QGIS-Verarbeitungsalgorithmus wie folgt im Standalone-Modus (ohne GUI) ausführen:

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

Native Algorithmen

Wenn Sie nun einen nativen Algorithmus verwenden möchten (dh einen Algorithmus vom nativen Anbieter, dessen Algorithmen in C ++ geschrieben sind), müssen Sie den Anbieter nach der Initialisierung von Processing hinzufügen:

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
quelle
Funktioniert gut, danke! Ist es in Ordnung, die Ausgabe gleichzeitig auf die Festplatte zu schreiben, wenn ein Pfad angegeben ist?
VIDLB
Klar, das ist auch eine sehr nützliche Option.
Germán Carrillo
1
Das ist pure Magie - Vielen Dank, dass Sie uns Ihre detaillierten Lösungen mitgeteilt haben!
root676
@ GermánCarrillo Irgendwie funktioniert ein sehr ähnlicher Code nicht. Weitere Informationen
Mr. Che
Ich versuche, einen QGIS-Algorithmus in einem QGIS-Plugin auszuführen. Funktioniert das genauso? Weil ich es nicht zum Laufen bringen kann
gHupf
1

Ich hatte einen Fehler "NameError: Name 'QgsNativeAlgorithms' ist nicht definiert", als ich in einer OSGeo4W-Installation, die QGIS 3.4.4 enthielt, versuchte, einen nativen Algorithmus wie oben zu verwenden. Die Lösung stellte sich als fehlender Import heraus:

from qgis.analysis import QgsNativeAlgorithms

(aus QGIS 3.4 / 3.6 Standalone-Skript )

Andrew_S
quelle