terra栅格显示最值与存储值不符的原因及原数值恢复方法
问题解析与解决方案
为什么显示的min/max和实际存储值不一致?
这是预期行为,核心原因是你使用了gdal="NBITS=1"参数:
NBITS=1强制GDAL用1位(bit)存储栅格数据,1位只能表示两个值:0和1。因此原数据中的10会被自动转换为1进行存储,而0保持不变。- 栅格显示的min/max值来自写入时的元数据(原数据
r的0和10),但实际存储的是转换后的值,所以出现了显示与实际值的差异。 - 颜色表是1位栅格的默认附带产物,但不是导致数值变化的直接原因,本质还是位深度压缩的影响。
是正常行为还是读取错误?
这不是读取错误,是使用NBITS=1参数后的正常结果——该参数的作用就是通过减少位深度来压缩数据,必然会丢失原数值的多样性(只能保留两个离散值)。
如何恢复原有的0和10值?
方案1:写入时避免丢失数值
如果要保留原数据的0和10,不要使用NBITS=1参数,改用其他不改变位深度的压缩方式,比如:
r2 <- writeRaster(r, filename="r_DEFLATE.tif", overwrite=TRUE, gdal="COMPRESS=DEFLATE", datatype="INT1U")
这样既能压缩文件,又能完整保留原数据的数值信息,min/max也会和实际值一致。
方案2:对已生成的r2进行值映射
如果已经生成了用NBITS=1压缩的栅格,可以通过值替换恢复原数值(前提是你明确知道原非0值是10):
# 将1替换为10 r2[r2 == 1] <- 10 # 强制更新元数据的min/max为实际值 setMinMax(r2, force=TRUE) # 验证结果 table(values(r2)) # > 0 10 # > 51 49
内容的提问来源于stack exchange,提问作者Jean-Luc Dupouey
相关产品推荐
相关产品推荐

