38 votos

Uso de algoritmos de procesamiento QGIS3 desde scripts PyQGIS independientes (fuera de la GUI)

Estoy escribiendo un script que debe funcionar fuera de la GUI de QGIS. 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 todos los algoritmos "nativos" en QgsApplication.processingRegistry ().

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

59voto

Elliott Maynard Puntos 11

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 https://gis.stackexchange.com/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()

# See https://gis.stackexchange.com/a/276979/4972 for a list of algorithms
res = processing.run('qgis:union', params, feedback=feedback)
res['OUTPUT'] # Access your output layer

Nota para las versiones de QGIS MENORES DE 3.16.5

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 Processing:

 import sys
from qgis.core import (
     QgsApplication, 
     QgsProcessingFeedback, 
     QgsVectorLayer
)
from qgis.analysis import QgsNativeAlgorithms

# See https://gis.stackexchange.com/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()

# See https://gis.stackexchange.com/a/276979/4972 for a list of algorithms
res = processing.run("native:extractvertices", params, feedback=feedback)
res['OUTPUT'] # Access your output layer

3voto

Andrew_S Puntos 91

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

(de la secuencia de comandos independiente QGIS 3.4 / 3.6 )

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X