Korzystanie z algorytmów przetwarzania QGIS3 z samodzielnych skryptów PyQGIS (poza GUI)

24

Piszę skrypt, który musi działać poza GUI QGIS. Wywołuję niektóre funkcje API z qgis.core, ale chciałbym użyć wtyczki przetwarzającej.

Jestem w stanie zaimportować przetwarzanie za pomocą sys.path.append (), ale nie mogę uruchomić żadnego procesu. Ponadto w QgsApplication.processingRegistry (). Algorytmy () brakuje wszystkich „rodzimych” alg.

Czy można w ten sposób uruchomić przetwarzanie? Czego mi brakuje ?

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

Korzystam z QGIS 3.0.1 - Debian 9

vidlb
źródło

Odpowiedzi:

29

Możesz uruchomić algorytm przetwarzania QGIS w trybie autonomicznym (bez GUI) w następujący sposób:

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

Algorytmy natywne

Teraz, jeśli chcesz użyć natywnego algorytmu (tj. Algorytmu od rodzimego dostawcy, którego algorytmy są napisane w C ++), musisz dodać dostawcę po zainicjowaniu Przetwarzania:

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
źródło
Działa dobrze, dzięki! Czy można zapisać dane wyjściowe na dysku w tym samym czasie, jeśli podano ścieżkę?
vidlb
Jasne, to również bardzo przydatna opcja.
Germán Carrillo,
1
To czysta magia - Dziękujemy za podzielenie się szczegółowymi rozwiązaniami!
root676
@ GermánCarrillo Jakoś bardzo podobny kod nie działa. Zobacz więcej: gis.stackexchange.com/questions/286281/…
Mr. Che
Próbuję uruchomić algorytm QGIS we wtyczce QGIS. Czy to działa w ten sam sposób? Ponieważ nie mogę tego uruchomić
gHupf
1

Podczas próby użycia natywnego algorytmu, jak wyżej, w instalacji OSGeo4W zawierającej QGIS 3.4.4 wystąpił błąd „NameError: nazwa„ QgsNativeAl algorytmy ”nie jest zdefiniowana”. Rozwiązaniem okazał się brakujący import:

from qgis.analysis import QgsNativeAlgorithms

(z niezależnego skryptu QGIS 3.4 / 3.6 )

Andrew_S
źródło