7 votos

Cierto si $a no es igual a $b.

Tengo dos binarios rásteres con los valores de NaN y 254. Quiero generar una nueva trama que se compone de los píxeles que tienen un valor NaN de mapa de bits a y 254 de mapa de bits B y viceversa - los que deben ser 1, el resto debe ser NaN de nuevo.

Quiero usar gdal_calc.py en un script de bash para que. Mi fragmento de código se parece a esto:

gdal_calc.py -A S2_2015_AOI_NDBI_bin.tif -B S2_2015_AOI_NDSI_bin.tif --outfile=S2_2015_AOI_diff_auto.tif --calc="1*(A!=B)" --NoDataValue=0

Pero todo lo que se devuelve es un nuevo ráster con NaN todas partes.

También probé --calc="1*(not_equal(A,B), --calc="1*(logical_or(logical_and(A==254, not_equal(B, 254)), logical_and(B==254, not_equal(A, 254))))", y varias otras combinaciones que se me podía venir. Nada funcionaba todavía.

Cosa extraña es, que funciona a la perfección en el QGIS Raster Calculator con la fórmula ("S2_2015_AOI_NDBI_bin@1" != "S2_2015_AOI_NDSI_bin@1") = 1, pero quiero que esto sea automático. También, esta calculadora arroja 0 en lugar de NaN, lo cual no es adecuado para su posterior procesamiento como el I plan.

La entrada de dos rásteres fueron previamente generado por:

gdal_calc.py -A S2_2015_AOI_NDBI.tif --outfile=S2_2015_AOI_NDBI_bin.tif --calc="254*(A>-0.15)" --NoDataValue=0

y

gdal_calc.py -A S2_2015_AOI_NDSI.tif --outfile=S2_2015_AOI_NDSI_bin.tif --calc="254*(A>0.4)" --NoDataValue=0`

Los rásteres todos tienen el mismo CRS. Estoy corriendo GDAL v. 1.11.3, es un poco anticuado, podría ser esta el problema?


ACTUALIZACIÓN

He resuelto el problema por saltarse el paso de la creación de la "binario" los rásteres de entrada con 254 y NaN valores (véase la pregunta del segundo y tercer bloques de código). El código se ve como esta ahora:

gdal_calc.py -A S2_2015_AOI_NDBI.tif -B S2_2015_AOI_NDSI.tif --outfile=out.tif --calc="1*(logical_and(A>-0.15, B<0.4))" --NoDataValue=0

Esto proporciona el resultado que quería.

Aunque esta es una solución adecuada para mí, personalmente, todavía no responde a la pregunta original.

4voto

thecohenoam Puntos 14

Si usted realmente tiene valores NaN en su rásteres, la siguiente debería funcionar (no probado).

gdal_calc.py -A raster_a.tif -B raster_b.tif --outfile=output.tif \
--calc="(isnan(A) * (B==254)) + ((A==254) * isnan(B)) + nan*((isnan(A) * isnan(B)) + ((A==254) * (B==254)))" \
--NoDataValue=0

La idea es conseguir 1 donde un raster es NaN y el otro es 254 y NaN, donde tanto los rásteres tienen el mismo valor. La operación en la cual los rásteres son el mismo no puede ser realizada usando equal o == porque NaN no evaluar de que manera (marque np.nan == np.nan en una consola de python, devuelve False).

EDITAR: Sabiendo ahora que los rásteres sólo contienen 254 y 0 debería ser tan fácil como hacer una desigualdad de verificación como lo había hecho en QGIS. Usted probablemente ha perdido su imagen de la huella máscara si había uno antes de hacer raster_a/b

gdal_calc.py -A raster_a.tif -B raster_b.tif --outfile=output.tif \
--calc="(A != B)" \
--NoDataValue=0 --type=Byte

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