r-terra数字精度管理:在写入文件时修改十进制光栅值



由于数字内部表示的经典问题,在写入外部文件时会修改光栅值,我想:

library(terra)
r <- rast(ncol=2, nrow=2, vals=c(5.3, 7.1, 3, 1.2))
sprintf("%.8f",values(r))
# [1] "5.30000000" "7.10000000" "3.00000000" "1.20000000"

t <- writeRaster(r, "test.tif", overwrite=TRUE)
sprintf("%.8f",values(t))
#[1] "5.30000019" "7.09999990" "3.00000000" "1.20000005"

这可能是一个很大的问题。什么是";最好的";是否有足够的变通方法?我测试了四舍五入和整数格式的写作,结果成功了:

r <- rast(ncol=2, nrow=2, vals=c(5.3, 7.1, 3, 1.2))
sprintf("%.8f",values(r))
#[1] "5.30000000" "7.10000000" "3.00000000" "1.20000000"
r=10*r

t <- writeRaster(r, "test.tif", overwrite=TRUE,wopt=list(datatype="INT4S"))
t=t/10

sprintf("%.8f",values(t))
#[1] "5.30000000" "7.10000000" "3.00000000" "1.20000000"

有更好的解决方法吗?特别是,是否存在任何";精度";属性,可以与每个光栅关联,从而为用户更简单、更高效地管理这些问题?

您可以使用双精度浮点(FLT8S(

library(terra)
r <- rast(ncol=2, nrow=2, vals=c(5.3, 7.1, 3, 1.2))
t <- writeRaster(r, "test.tif", overwrite=TRUE, wopt=list(datatype="FLT8S"))
sprintf("%.8f",values(t))
#[1] "5.30000000" "7.10000000" "3.00000000" "1.20000000"

是否存在";精度";terra中的属性,可以关联到每个光栅

没有。如果有,那就需要传播规则?在写作时设置它可能更容易?需要注意的一点是,一些写入临时文件的内容可能会被忽视。要将默认值设置为FLT8S,可以使用terraOptions(datatype="FLT8S")

最新更新