Uso de algoritmos de procesamiento QGIS3 de secuencias de comandos PyQGIS independientes (fuera de la GUI)

24

Estoy escribiendo un script que debe funcionar fuera de QGIS GUI. Llamo a algunas funciones de API desde qgis.core pero me gustaría usar el complemento de procesamiento.

Puedo importar el procesamiento con sys.path.append () pero no puedo ejecutar ningún proceso. Además, faltan todas las algs "nativas" en QgsApplication.processingRegistry (). Algoritmos ()

Entonces, ¿es posible ejecutar el procesamiento de esa manera? Qué me estoy perdiendo ?

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

Estoy en QGIS 3.0.1 - Debian 9

vidlb
fuente

Respuestas:

29

Puede ejecutar un algoritmo de procesamiento QGIS en modo independiente (sin GUI) de esta manera:

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

Algoritmos Nativos

Ahora, si desea utilizar un algoritmo nativo (es decir, un algoritmo del proveedor nativo, cuyos algoritmos están escritos en C ++), debe agregar el proveedor después de inicializar el Procesamiento:

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
fuente
Funciona bien, gracias! ¿Está bien escribir la salida en el disco al mismo tiempo, si se proporciona una ruta?
vidlb
Claro, esa también es una opción muy útil.
Germán Carrillo
1
Esto es pura magia. ¡Gracias por compartir sus soluciones detalladas!
root676
@ GermánCarrillo De alguna manera, un código muy similar no funciona. Ver más: gis.stackexchange.com/questions/286281/…
Sr. Che
Intento ejecutar un algoritmo QGIS en un complemento QGIS, ¿funciona de la misma manera? Porque no puedo hacerlo funcionar
gHupf
1

Tuve un error "NameError: el nombre 'QgsNativeAlgorithms' no está definido" cuando intenté usar un algoritmo nativo como el anterior, en una instalación de OSGeo4W que incluía QGIS 3.4.4. La solución resultó ser una importación faltante:

from qgis.analysis import QgsNativeAlgorithms

(del script independiente QGIS 3.4 / 3.6 )

Andrew_S
fuente