显示的最小值和最大值与实际存储在 Terra 栅格中的值不同

min and max values displayed are different from those actually stored in a terra raster

提问人:Jean-Luc Dupouey 提问时间:10/21/2023 更新时间:11/4/2023 访问量:26

问:

栅格有时显示的值与栅格中实际存储的值不同的时间和原因?terraminmax

 # 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 

这是正常行为还是对此类压缩文件的误读?它与出现在 和 之间的颜色表有关吗?geotiffrr2

我知道我可以使用以下方法强制值一致:

 setMinMax(r2, force=TRUE)

但这不是我想要的。我宁愿在栅格中取回原始的 0 和 10 值。如何在读取文件期间或之后正确执行此操作?r2

感谢您的帮助。

让-吕克

文件 : max raster , min terra

评论


答:

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

谢谢罗伯特,这很清楚。因此,这是一种自由度:检查栅格值与所选参数的一致性,但不检查参数的一致性。GDALGDALdatatypenbits

因此,如果要恢复初始值(只要它不在 允许的值之外),则可以在读取文件后添加:INT1U

r2[r2!=0] <- minmax(r2)[2]

这有点危险,但它可以完成工作。