2 votos

Acceso a los resultados del algoritmo de procesamiento desde las herramientas de caja blanca en PyQGIS

Cuando ejecuto un algoritmo de procesamiento GDAL desde la consola de Python en QGIS que carga un raster de resultados:

resultClip = processing.runAndLoadResults("gdal:cliprasterbymasklayer", { 
                                          'ALPHA_BAND' : False, 
                                          'CROP_TO_CUTLINE' : True, 
                                          'DATA_TYPE' : 0, 
                                          'EXTRA' : '', 
                                          'INPUT' : 'E:/geodata/nsw100k.vrt', 
                                          'KEEP_RESOLUTION' : False, 
                                          'MASK' : 'C:/Users/brennant/Downloads/data.geojson', 
                                          'MULTITHREADING' : False, 
                                          'NODATA' : None, 'OPTIONS' : '', 
                                          'OUTPUT' : 'TEMPORARY_OUTPUT', 
                                          'SET_RESOLUTION' : False, 
                                          'SOURCE_CRS' : None, 
                                          'TARGET_CRS' : None, 
                                          'X_RESOLUTION' : None, 
                                          'Y_RESOLUTION' : None })

Puedo acceder al archivo temporal de salida rasterizado a través de resultClip['OUTPUT']

Sin embargo, cuando hago lo mismo con uno de los algoritmos de Whitebox Tools (por ejemplo, BreachDepressions):

resultBreach = processing.runAndLoadResults("wbt:BreachDepressions", { 'dem' : resultClip['OUTPUT'], 'max_depth' : '20.0', 'flat_increment' : 0.00001, 'fill_pits' : 1, 'output' : 'TEMPORARY_OUTPUT' })

resultBreach['output'] devuelve un QgsProcessingOutputLayerDefinition variable:

<QgsProcessingOutputLayerDefinition {'sink':TEMPORARY_OUTPUT, 'createOptions': {}}>}

La capa temporal se crea y se carga en la ventana de capas, pero desde el punto de vista del procesamiento de PyQGIS, no veo cómo acceder a ella para utilizarla en futuros pasos.

Y si miro ambos algoritmos usando processing.algorithmHelp por ejemplo

processing.algorithmHelp("gdal:cliprasterbymasklayer")

el tipo de salida para ambos es el mismo (QgsProcessingOutputRasterLayer)

Se aceptan sugerencias.

1voto

Yada Puntos 9489

Los archivos temporales se almacenan en carpetas especiales en su PC. Cuando se desactiva, todos los archivos temporales se eliminan automáticamente. Por alguna razón, los desarrolladores de Caja blanca implementado un borrado automático de archivos cuando se crean como 'TEMPORARY_OUTPUT' en un algoritmo de herramienta de procesamiento con métodos 'run' y 'runAndLoadResults'. Sin embargo, esto no es un problema. En mi sistema operativo Linux, los archivos temporales se almacenan en /tmp carpeta. Si utiliza un Windows sistema se puede leer este artículo para obtener información sobre la ubicación de la carpeta TEMP en ese sistema.

Para probar la herramienta "wbt:BreachDepressions", mi archivo de salida (OutputFile.tif) fue puesto en /tmp como definiciones de parámetros. He utilizado el método 'run' para no recuperarlo de esa carpeta con esa herramienta. Entonces, en el mismo código, para acceder al archivo creado, puedo definir una nueva capa como:

new_layer = QgsRasterLayer('/tmp/OutputFile.tif', 
            'OutputFile')

Sólo con fines de visualización, para probar que esta capa fue creada, la cargué con el método 'addMapLayer' de QgsProject . Por otro lado, también puedo sondearlo con:

>>>resultBreach['output']
'/tmp/OutputFile.tif'

en la consola de Python. Esta es una mejor opción para usar en futuros pasos.

El código completo es el siguiente:

import processing

layer = iface.activeLayer()

resultBreach = processing.run("wbt:BreachDepressions", 
                                          { 'dem' : layer, 
                                            'max_depth' : '20.0', 
                                            'flat_increment' : 0.00001, 
                                            'fill_pits' : 1, 
                                            'output' : '/tmp/OutputFile.tif' })

new_layer = QgsRasterLayer('/tmp/test.tif', 
            'OutputFile')

QgsProject.instance().addMapLayer(new_layer)

print("done");

Después de ejecutar el código anterior en la consola de Python de QGIS, funciona como se esperaba.

enter image description here

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