Utilizzo degli algoritmi di elaborazione QGIS3 da script PyQGIS autonomi (al di fuori della GUI)


24

Sto scrivendo uno script che deve funzionare al di fuori della GUI di QGIS. Chiamo alcune funzioni API da qgis.core ma mi piacerebbe usare il plugin di elaborazione.

Sono in grado di importare l'elaborazione con sys.path.append () ma non riesco a eseguire alcun processo. Inoltre, tutti gli alg "nativi" mancano in QgsApplication.processingRegistry (). Algoritmi ()

Quindi è possibile eseguire l'elaborazione in questo modo? Cosa mi sto perdendo?

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

Sono su QGIS 3.0.1 - Debian 9

Risposte:


29

È possibile eseguire un algoritmo di elaborazione QGIS in modalità standalone (senza GUI) in questo modo:

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

Algoritmi nativi

Ora, se si desidera utilizzare un algoritmo nativo (ovvero un algoritmo del provider nativo, i cui algoritmi sono scritti in C ++), è necessario aggiungere il provider dopo aver inizializzato Elaborazione:

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

Funziona bene, grazie! Va bene scrivere contemporaneamente l'output su disco, se viene fornito un percorso?
vidlb,

Certo, anche questa è un'opzione molto utile.
Germán Carrillo,

1
Questa è pura magia - Grazie per aver condiviso le tue soluzioni dettagliate!
root676

@ GermánCarrillo In qualche modo un codice molto simile non funziona. Per saperne di più: gis.stackexchange.com/questions/286281/…
Mr. Che

Provo a eseguire un algoritmo QGIS in un plug-in QGIS, funziona allo stesso modo? Perché non riesco a farlo funzionare
gHupf

1

Ho avuto un errore "NameError: il nome 'QgsNativeAlgorithms' non è definito" quando ho provato a utilizzare un algoritmo nativo come sopra, in un'installazione OSGeo4W che includeva QGIS 3.4.4. La soluzione si è rivelata un'importazione mancante:

from qgis.analysis import QgsNativeAlgorithms

(dallo script autonomo di QGIS 3.4 / 3.6 )

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.