根据数据类型,terra::writeRaster 的意外最大可能值

问题描述

使用 terra::writeraster 时,允许写入的最大可能值取决于数据类型(INT1UINT2SINT2U...)。

文档说明“在写入整数值时,最低可用值(给定数据类型)用于[存储 NA,我想]用于有符号类型,最高值用于无符号值。” .这应该为无符号类型提供以下范围:

INT1U : 0-254(2^8-1,NA 存储减一)

INT2U : 0-65,534(2^16-1,NA 存储减一)

INT4U : 0-4,294,967,294(2^32-1,NA 存储减一)

然而,对于无符号数据类型 INT2UINT4U,我在我的机器上观察到的最大值不符合这些预期:

INT2U : 65,532 INT4U:4,292

为什么会出现这个意想不到的最大值?我问这个问题是因为对于安全的代码编写来说,在编写文件之前准确地知道这些最大值并不是无足轻重的。

我在 Windows 10 下工作。这是我用来检查的几行代码

library(terra)
terra version 1.3.4
Warning message:
package ‘terra’ was built under R version 4.0.5 

r <- rast(ncols=1,nrows=2)
values(r) <- c(65532,65533)

writeraster(r,"test.tif",wopt=list(datatype="INT2U"))

t <- rast("test.tif")
values(t)
     lyr.1
[1,] 65532
[2,]   NaN

解决方法

使用开发版本,我现在得到了预期的结果

library(terra)
r <- rast(ncols=1,nrows=4)
values(r) <- 65533:65536

2 字节无符号整数

x <- writeRaster(r,"test.tif",datatype="INT2U",overwrite=TRUE)
values(x)
#     lyr.1
#[1,] 65533
#[2,] 65534
#[3,]   NaN
#[4,]   NaN

x <- writeRaster(r,NAflag=0,overwrite=TRUE)
values(x)
#[1,] 65535
#[4,]   NaN

4 字节无符号整数

values(r) <- 4294967293:4294967296
x <- writeRaster(r,datatype="INT4U",overwrite=TRUE)
values(x)
#          lyr.1
#[1,] 4294967293
#[2,] 4294967294
#[3,]        NaN
#[4,]        NaN


x <- writeRaster(r,overwrite=TRUE,)
values(x)
#          lyr.1
#[1,] 4294967295
#[4,]        NaN

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...