terra
栅格有时会显示 min
和 max
值与栅格中实际存储的值不同的时间和原因?
# create a 10x10 binary raster with values 0 or 10:
r <- rast(nrows=10, ncols=10, vals=ifelse(runif(10*10)>0.5,0,10))
# export it as a binary compressed file:
r2 <- writeRaster(r, filename="r_CCITTFAX4.tif", overwrite=TRUE, gdal="NBITS=1",gdal = "COMPRESS=CCITTFAX4", datatype="INT1U")
# values are known as 0 and 10, as expected:
minmax(r2)
# > lyr.1
# > min 0
# > max 10
# and:
r2
# > class : SpatRaster
# > dimensions : 10, 10, 1 (nrow, ncol, nlyr)
# > resolution : 36, 18 (x, y)
# > extent : -180, 180, -90, 90 (xmin, xmax, ymin, ymax)
# > coord. ref. : lon/lat WGS 84 (EPSG:4326)
# > source : test_CCITTFAX4_INT1Ud.tif
# > color table : 1
# > name : lyr.1
# > min value : 0
# > max value : 10
# but 'true' values stored in the raster are 0 and 1:
table(values(r2))
# > 0 1
# > 51 49
这是正常行为还是对这种类型的压缩
geotiff
文件的误读?是不是和r
和r2
之间出现的颜色表有关?
我知道我可以使用以下方法强制价值观一致:
setMinMax(r2, force=TRUE)
但这不是我想要的。我宁愿取回栅格中的原始 0 和 10 值
r2
。在读取文件期间或之后如何正确执行此操作?
感谢您的帮助。
让-吕克
您使用 GDAL 选项
NBITS=1
r2 <- writeRaster(r, filename="r_CCITTFAX4.tif", overwrite=TRUE, gdal=c("NBITS=1", "COMPRESS=CCITTFAX4"), datatype="INT1U")
写入文件时,会将 10 的值更改为 1。计算最小值和最大值时,10 被视为 INT1U 范围内的有效值。由于 GDAL 选项(如您使用的选项),不会检查写入时值是否发生更改。
在这种情况下,您必须首先转换输出栅格。通过这个例子你可以做到
rr <- r != 0
rr2 <- writeRaster(rr, filename="r_CCITTFAX4.tif", overwrite=TRUE, gdal=c("NBITS=1", "COMPRESS=CCITTFAX4"), datatype="INT1U")
minmax(rr2)
# lyr.1
#min 0
#max 1
谢谢罗伯特,很清楚了。因此,这是一种
GDAL
慷慨:GDAL
确实检查栅格值与所选 datatype
参数的一致性,但不检查 nbits
参数的一致性。
所以,如果你想恢复初始值(只要不超出
INT1U
允许的值),你可以在读取文件后添加:
r2[r2!=0] <- minmax(r2)[2]
这有点危险,但它可以完成任务。