对于数据类型为 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)
如您所见,对于 r1
,NAValue
的值是 -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 创建
我有来自数据类型为 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)
如您所见,对于 r1
,NAValue
的值是 -3.4e + 38
。
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 创建