5 votos

Combinación de dos rásteres con ningún valor de datos

Tengo dos rásteres: Raster a y B. Trama tiene Un sólo tiene valores de 0. El área en blanco en la Trama B No son los valores de los Datos. Quiero combinar a un mapa de bits (Raster C). Así que, básicamente, quiero que todos los píxeles en la Trama B con un No valor de los Datos a tener un valor de 0.

Traté de hacerlo con la calculadora ráster en QGIS mediante la adición de Una Trama a Trama B, pero sólo devuelve de nuevo Raster B.

Estoy buscando soluciones con QGIS, GDAL, o Grass GIS.

enter image description here

1voto

Peter and the wolf Puntos 121

Terminé de escribir un GDAL secuencia de comandos de python, que sustituye a la NoDataValue con un nuevo valor (en mi caso 0):

import gdal, ogr, osr, os
import numpy as np

def raster2array(rasterfn):
    raster = gdal.Open(rasterfn)
    band = raster.GetRasterBand(1)
    return band.ReadAsArray()

def getNoDataValue(rasterfn):
    raster = gdal.Open(rasterfn)
    band = raster.GetRasterBand(1)
    return band.GetNoDataValue()

def array2raster(rasterfn,newRasterfn,array):
    raster = gdal.Open(rasterfn)
    geotransform = raster.GetGeoTransform()
    originX = geotransform[0]
    originY = geotransform[3] 
    pixelWidth = geotransform[1] 
    pixelHeight = geotransform[5]
    cols = raster.RasterXSize
    rows = raster.RasterYSize

    driver = gdal.GetDriverByName('GTiff')
    outRaster = driver.Create(newRasterfn, cols, rows, 1, gdal.GDT_Float32)
    outRaster.SetGeoTransform((originX, pixelWidth, 0, originY, 0, pixelHeight))
    outband = outRaster.GetRasterBand(1)
    outband.WriteArray(array)
    outRasterSRS = osr.SpatialReference()
    outRasterSRS.ImportFromWkt(raster.GetProjectionRef())
    outRaster.SetProjection(outRasterSRS.ExportToWkt())
    outband.FlushCache()


rasterfn = 'Slope.tif'
newValue = 0
newRasterfn = 'SlopeNew.tif'

# Convert Raster to array
rasterArray = raster2array(rasterfn)

# Get no data value of array
noDataValue = getNoDataValue(rasterfn)

# Updata no data value in array with new value
rasterArray[rasterArray == noDataValue] = newValue

# Write updated array to new raster
array2raster(rasterfn,newRasterfn,rasterArray)

0voto

Nikola Puntos 21

Una solución puede ser esta secuencia de comandos por lotes:

set nodatavalue=-99999
gdalwarp -srcnodata None rasterB_with_NoData.tif rasterB_without_NoData.tif
python gdal_calc.py -A rasterB_without_NoData.tif --outfile=rasterB_updated_with_NoData.tif --calc="(A<>%nodatavalue%)*A"
gdalwarp -srcnodata None rasterB_updated_with_NoData.tif rasterB_updated_without_NoData.tif

El truco es -srcnodata None ofrecido por gdalwarp, lo cual es muy útil en orden a ignorar intrínseca nodata configuración en el dataset de origen (de la doc). En detalle, tenemos que aplicarlo dos veces: en primer lugar, porque tenemos que sustituir el valor NoData con 0 y por tanto tenemos que incluir en el cálculo, en segundo lugar, porque gdal_calc.py introduce el valor NoData de nuevo.

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