3 votos

Utilización de la salida temporal en un algoritmo de la Calculadora Raster

Estoy haciendo un poco de procesamiento de MDT, el primer par de etapas son un cálculo de la pendiente y luego un proceso de calculadora Raster utilizando la calculadora Raster nativa de QGIS. Quiero utilizar la capa de salida de mi cálculo de la pendiente dentro de la fórmula. La pendiente se hace de la siguiente manera, y funciona bien:

    Slope = processing.run("native:slope", {
    'INPUT':set_NoData_toNull['OUTPUT'], #There is a step before, Nullifying <0 values
    'Z_FACTOR':1,
    'OUTPUT': 'TEMPORARY_OUTPUT' })

La calculadora es para eliminar cualquier valor de Raster inferior a una pendiente de 45 grados, esta fórmula funciona cuando se utiliza en una capa de Raster con nombre y la sustitución de la @1 con "layername@1", pero para ahorrar poder de procesamiento no quiero guardar la salida de "Slope" cada vez que ejecute este script, y en su lugar quiero utilizar el 'TEMPORARY_OUTPUT' de "Slope", aunque después de mucho leer todavía no puedo averiguar cómo debo Llamar a esto en el campo 'EXPRESSION' de la calculadora de Raster.

     calculatedOver45deg = processing.run("qgis:rastercalculator", {
    'EXPRESSION':'((\"@1\">45)*\"@1\") / ((\"@1\">45)*1 + (\"@1\"<=45)*0)',
    'LAYERS': Slope['OUTPUT'],
    'CELLSIZE':None,
    'EXTENT':None,
    'CRS':QgsCoordinateReferenceSystem('EPSG:32633'),
    'OUTPUT': 'TEMPORARY_OUTPUT' })

¿Alguien sabe cómo se llama 'TEMPORARY_OUTPUT' de slope y, por tanto, cómo se puede utilizar en la expresión en sustitución de @1.

Gracias

4voto

Yada Puntos 9489

Siguiendo script (con ruta a mi primera capa directamente: utah_demUTM2_clip en la imagen de abajo) me funciona. He utilizado el método de procesamiento 'runAndLoadResults' en lugar del método 'run'.

import processing

layer = iface.activeLayer()

parameters = {'INPUT': layer,
              'Z_FACTOR':1,
              'OUTPUT': 'TEMPORARY_OUTPUT' }

processing.runAndLoadResults("native:slope", parameters)

calculatedOver45deg = processing.runAndLoadResults("qgis:rastercalculator", {
    'EXPRESSION':'((\"Slope@1\">45)*\"Slope@1\") / ((\"Slope@1\">45)*1 + (\"Slope@1\"<=45)*0)',
    'LAYERS': Slope['OUTPUT'],
    'CELLSIZE':None,
    'EXTENT':None,
    'CRS':QgsCoordinateReferenceSystem('EPSG:32633'),
    'OUTPUT': 'TEMPORARY_OUTPUT' })

Después de ejecutarlo en la consola de Python de QGIS 3, obtuve el resultado de la siguiente imagen:

enter image description here

En la leyenda del mapa, la salida es la capa resultante de las operaciones con el método de procesamiento "qgis:rastercalculator".

3voto

Rebecca Puntos 51

Su variable OUTPUT['TEMPORARY_OUTPUT'] contiene una cadena que es un ID interno de la capa creada.

Así que si lo haces

layer=QgsProject.instance().mapLayer(output['TEMPORARY_OUTPUT'])
name=layer.name()

Debe tener el nombre de la capa

Aunque, como dijo xunilk en su respuesta, el nombre de la capa es siempre 'Output'. El problema es que puedes acabar cogiendo la capa equivocada en caso de que estés haciendo más procesamientos. Al tener la variable de la capa, puedes darle a tu capa un nombre único y/o descriptivo de forma programada,

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