提问人:Jean-Luc Dupouey 提问时间:10/21/2023 更新时间:11/4/2023 访问量:26
显示的最小值和最大值与实际存储在 Terra 栅格中的值不同
min and max values displayed are different from those actually stored in a terra raster
问:
栅格有时显示的值与栅格中实际存储的值不同的时间和原因?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
感谢您的帮助。
让-吕克
答:
0赞
Robert Hijmans
10/23/2023
#1
您使用 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
0赞
Jean-Luc Dupouey
11/4/2023
#2
谢谢罗伯特,这很清楚。因此,这是一种自由度:检查栅格值与所选参数的一致性,但不检查参数的一致性。GDAL
GDAL
datatype
nbits
因此,如果要恢复初始值(只要它不在 允许的值之外),则可以在读取文件后添加:INT1U
r2[r2!=0] <- minmax(r2)[2]
这有点危险,但它可以完成工作。
评论