对于数据类型为 INT2U 的栅格图层,如何处理 R 中的 NA 值?

How do I handle NA values in R for raster layer with datatype INT2U?

我有来自数据类型为 INT2U 的 geotiff 文件的栅格层,又名无符号短。原始数据(浮点数)通过乘以 100 然后四舍五入进行编码,以减小文件大小并便于使用不适用于浮点值的软件进行快速显示。

我需要通过将栅格值除以 100 来提取原始数据。问题是对原始数据进行地理校正的软件使用了值 65535。当询问栅格时,我得到的 NA 值是多少 'negative infinity' 和 INT2U 值都是正数。结果是 65535 个值被视为有效值而不是 NA。 65535 是无符号整数可能的更大整数。

> r <- rasters[[1]]
> NAvalue(r)
[1] -Inf
> maxValue(r)
[1] 65535
> minValue(r)
[1] 0
> r1 <- r/100
> maxValue(r1)
[1] 655.34
> NAvalue(r)
[1] -Inf

我有一些代码可以检查一个值是否有效,即它不在图像的角落 - 飞机从东北飞到西南,所以在对图像进行地理校正后,图像角落的像素结果图像不是有效数据。

如何取消(恢复原始数据)将 65535 值设置为标准 NA?

不过也没什么难的。只需通过简单赋值设置新值 NAvalue 即可。 请参阅此示例。

library(raster)

r1 <- raster(system.file("external/rlogo.grd", package="raster"))
NAvalue(r1)
#[1] -3.4e+38
plot(r1)

如您所见,对于 r1NAValue 的值是 -3.4e + 38

好吧,让我们把它改成例如200

NAvalue(r1) = 200
NAvalue(r1)
#[1] 200
plot(r1)

仅此而已。希望这就是你的意思。

作为您评论@Nate Lockwood 的后续行动,问题不在于“INT2U”格式。我刚刚准备了一个小的 REPREX(见下文),它表明您可以毫无问题地将值 NA 分配给 INT2U 格式的栅格。

老实说,我不知道你遇到的问题是从哪里来的,但很可能是其他原因。

不过,希望这对您找到问题的根源有所帮助。

REPREX:

library(raster)
#> Le chargement a nécessité le package : sp
# Creating a raster
r <- raster(ncols = 3, nrows = 3)
(values(r) <- seq(length(r)))
#> [1] 1 2 3 4 5 6 7 8 9
dataType(r)
#> [1] "FLT4S"
# Converting to INT2U format
r_convert <- tempfile("raster", fileext = ".tif")

writeRaster(r, r_convert, datatype = "INT2U", overwrite = TRUE)
r_INT2U <- raster(r_convert)

# Checking format of r_INT2u
dataType(r_INT2U)
#> [1] "INT2U"
# Creating object rc_INT2U to keep the original raster object 'r_INT2U'
rc_INT2U <- r_INT2U

rc_INT2U[rc_INT2U == 9] <- NA

values(rc_INT2U)
#> [1]  1  2  3  4  5  6  7  8 NA

reprex package (v2.0.1)

于 2021-09-18 创建