Este es un ejemplo de cómo acceder a processing
para ejecutar el proceso de "estadísticas ráster" de QGIS, que devuelve información útil sobre una capa ráster. En particular, las estadísticas ráster son útiles para obtener la suma de todos los valores de un ráster, lo que (AFAIK) no puede hacerse sólo en GDAL.
#!/usr/bin/env python3
import os
import sys
import warnings
from functools import wraps
def ignore_warnings(f):
@wraps(f)
def inner(*args, **kwargs):
with warnings.catch_warnings(record=True) as w:
warnings.simplefilter("ignore")
response = f(*args, **kwargs)
return response
return inner
def import_qgis_processing():
sys.path.append('/usr/lib/qgis')
sys.path.append('/usr/share/qgis/python/plugins')
from qgis.core import QgsApplication, QgsProcessingFeedback, QgsRasterLayer
app = QgsApplication([], False)
feedback = QgsProcessingFeedback()
return (app, feedback, QgsRasterLayer)
app, feedback, QgsRasterLayer = import_qgis_processing()
app.initQgis()
@ignore_warnings # Ignored because we want the output of this script to be a single value, and "import processing" is noisy
def initialise_processing(app):
from qgis.analysis import QgsNativeAlgorithms
import processing
from processing.core.Processing import Processing
Processing.initialize()
app.processingRegistry().addProvider(QgsNativeAlgorithms())
return (app, processing,)
def check_input_validity(QgsRasterLayer):
raster = QgsRasterLayer(sys.argv[1], 'raster', 'gdal')
if not raster.isValid():
raise Exception('Invalid raster')
def raster_stats():
params = {
'INPUT': sys.argv[1],
'BAND': 1
}
return processing.run(
"qgis:rasterlayerstatistics",
params, feedback=feedback
)
def get_raster_stat(stat='SUM'):
return raster_stats().get(stat)
app, processing = initialise_processing(app)
check_input_validity(QgsRasterLayer)
print(get_raster_stat(stat=sys.argv[2]))
app.exitQgis()
Le site ignore_warnings
porque sin ella se emiten tres advertencias de obsoleto al importar processing
y quería que el script tuviera una salida simple a stdout. Puede omitirlo si lo desea.
La importación de módulos dentro de funciones se realiza para controlar el orden de importación, y para detener linters (por ejemplo. autopep8
) de intentar mover todas las sentencias import a la parte superior.
Los lugares clave que hay que incluir en sys.path
son:
/usr/lib/qgis
/usr/share/qgis/python/plugins
Estos serían diferentes en diferentes sistemas operativos, y probablemente en diferentes distribuciones de Linux.
Este script se puede ejecutar como: ./rasterstats.py ./somefile.tif SUM
y mostrará la suma de todos los valores de la trama en stdout (ignorando los valores sin datos si los hay). MAX
, MIN
etc. también funcionan.
Las funciones clave son import_qgis_processing
y initialise_processing
.