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

问题描述 投票:0回答:2

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
。在读取文件期间或之后如何正确执行此操作?

感谢您的帮助。

让-吕克

file max raster min terra
2个回答
0
投票

您使用 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
投票

谢谢罗伯特,很清楚了。因此,这是一种

GDAL
慷慨:
GDAL
确实检查栅格值与所选
datatype
参数的一致性,但不检查
nbits
参数的一致性。

所以,如果你想恢复初始值(只要不超出

INT1U
允许的值),你可以在读取文件后添加:

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

这有点危险,但它可以完成任务。

© www.soinside.com 2019 - 2024. All rights reserved.