¿Redefiniendo el valor de nodata a cero en QGIS?


7

Tengo una imagen que hice con un polígono AOI. El área de contorno se configuró en valor de píxel = 0 y tengo un valor de nodata de -32768. Quiero redefinir el valor de nodata en cero. Solía ​​hacer esto con ArcMap fácilmente en la calculadora ráster, pero en QGIS no veo cómo podría hacerlo. ¿Algunas ideas?


2
¿Lo quiere solo para visualización o necesita establecerlo en nulo en el que realizará más cálculos de trama?
Maning

Respuestas:


13

En QGIS, puede usar la Calculadora ráster con el siguiente cálculo:

("your_raster" != -32768) * "your_raster"

Con este cálculo, si el valor de la celda es -32768, obtendrá un 0 en esa celda y si es diferente de -32768, la celda mantendrá el valor que tenía.


1
Buena solución Solo una nota para otros que intentan esto: en QGIS, el valor de los nodos para una capa se puede encontrar en Propiedades de la capa, luego en Información (elemento superior), luego desplácese hacia abajo hasta Bandas.
John

Tenga en cuenta que esto no funciona para valores como -3.40282e + 38.
geordie

12

La solución más simple en un solo paso y, en mi opinión, más confiable para reclasificar NoData a cero es usar la herramienta Reclasificar valores de cuadrícula (SAGA) en la caja de herramientas de procesamiento.

Después de seleccionar el ráster para reclasificar, simplemente desplácese hasta la parte inferior del cuadro de diálogo y asegúrese de que la replace no data valuescasilla esté marcada. El valor predeterminado es cero (pero, por supuesto, puede sustituirlo por otro). Luego, desmarque la replace other valuescasilla y deje todos los demás campos solos (por lo que todo lo que está haciendo es asegurarse de que una casilla esté marcada y desmarcar otra, no se requieren otras configuraciones).


1
Estoy de acuerdo. Nada más realmente funcionó para mí (mi valor de nodata era algo así como -3.4e + 38).
ArMoraer

Tenía exactamente el mismo problema que @ArMoraer. Esta fue la solución más fácil, funcionó perfectamente.
Rauni

Solucioné el problema del valor de nodata a 0, pero por el momento aplicó pequeños cambios a mis otros valores ráster
ZKB

Desafortunadamente, este método ya no parece funcionar en QGIS 3.8. El formulario de procesamiento no se ejecutará sin modificar todas las demás configuraciones. Error: "Valor de parámetro incorrecto o faltante: ...."
geordie

11

Encontré una solución para esto. Primero convierto la imagen en una capa vrt (gdalbuildvrt) con -srcnodata 0, luego la traduzco nuevamente a un archivo tif con gdal_translate -a_nodata. Funcionó bien! :)


8

Supongo que puedes hacer eso con la calculadora ráster .

Si no con la ayuda de GRASS plugin y r.null, lo hará fácilmente. Esa opción significa que primero tendrá que crear un conjunto de mapas GRASS para importar su ráster.


55
¿podría explicar cómo hacer eso con la calculadora ráster?
rudivonstaden

1
r.nullLo hice por mí.
metasequoia

8

Al tener el mismo problema, al final utilicé Python directamente; es posible que tenga que ajustar numpy.where para su propósito específico. En el caso a continuación, los valores de los píxeles se mantienen como están si son> = 0, todos los demás píxeles, en este caso solo los que tienen el valor sin datos, se establecen en "0"

import gdal, gdalconst, numpy
maskfile = gdal.Open('C:\Users\max\Desktop\Baltic2.tif', gdalconst.GA_Update)
maskraster = maskfile.ReadAsArray()
maskraster = numpy.where((maskraster >= 0), maskraster, 0 ) 
maskband = maskfile.GetRasterBand(1)
maskband.WriteArray( maskraster )
maskband.FlushCache()


1

Lo que funcionó para mí fue exportar el ráster como archivo .asc, luego abrirlo en un editor de texto y usar buscar y reemplazar para reemplazar el antiguo valor NoData con el valor que quería.


1

En mi caso, era una imagen satelital que necesitaba convertir a 8 bits y no mostraba valores de datos al usar -scale en gdal_translate.

Pude resolver el problema exportando el ráster (capa de clic derecho -> exportar -> guardar capa como ...) a un nuevo archivo como datos renderizados (casilla de verificación en la parte superior de la ventana de diálogo).


0

Para el script python, puede usar la siguiente línea antes de WriteArray.

maskband.SetNoDataValue(0)
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.