R 如何从 geotiff 读取 nodatavalue 标签 - R Raster 包

Lea*_*ser 3 r raster no-data

我遇到了一个不寻常的结果,R 中的栅格没有数据值。下面的代码 - 我有一个没有导入的数据值的栅格 (-9999)。QGIS 也读取 nodatavalue,arcgis。R 在读入 geotiff 时,将 nodata 值分配给 -INF。

我不知道为什么。但是我决定尝试从头开始制作一个 - 并且结果相同。我的过程有什么问题?如何确保 R 正确读取 nodatavalues?

注意:我下面的示例是创建的栅格/ geotiff。但我实际上是在导入一个组织生产的相当大的 geotiff。所以我无法控制它们的编写方式,但如果需要,我可以要求他们调整标签。

library(raster)
#create a raster from the matrix
myRaster1 <- raster(nrow=4, ncol=4)

#assign some random data to the raster
myRaster1[]<- 1:ncell(myRaster1)

myRaster1[5] <- -9999

#ensure the data have some decimals
myRaster1[2] <- 34.5

#assign no data value to raster
myRaster1@file@nodatavalue <- -9999

#make sure it worked
NAvalue(myRaster1)
myRaster1@file@nodatavalue

#view attributes of the raster
myRaster1


#write out raster
#write the geotiff - change overwrite=TRUE to overwrite=FALSE if you want to make sure you don't overwrite your files!
writeRaster(myRaster1,"newDel.tif","GTiff", overwrite=TRUE)


#import raster
newr <- raster("newDel.tif")
newr@file@nodatavalue
Run Code Online (Sandbox Code Playgroud)

感谢您提供有关 R 如何从 geotiff 导入标签的任何建议/解释。

Rob*_*ans 5

感谢您创建一个可重现的示例,但您创建的示例可能不是最有帮助的。为插槽分配值( a 后面的名称@)不是“合法的”。除非您具有 Raster 对象的高级知识,否则您应该使用用户界面(函数、方法)。所以,永远不要这样做:

myRaster1@file@nodatavalue <- -9999
Run Code Online (Sandbox Code Playgroud)

此槽中的值仅供内部使用;并且仅与从磁盘获取值的对象相关。同样地,

newr@file@nodatavalue
# [1] -Inf
Run Code Online (Sandbox Code Playgroud)

并不意味着NA值以"newDel.tif"这种方式存储。

要在写入时设置某个值,请使用writeRaster.

现在,您的问题似乎是您有值 -9999 的文件应该被视为NA,但不知何故这不会发生。奇怪的是它可以在 QGIS 中工作,因为使用了相同的信息和相同的底层软件 ( GDAL)。但这里有一个你可以处理的方法:

创建一个 geotiff 文件,其值为 -9999 不被识别为 NA

library(raster)
r <- raster(nrow=5, ncol=5)
values(r) <- 1:25
r[1:5] <- -9999
writeRaster(r, 'test.tif', overwrite=TRUE)
Run Code Online (Sandbox Code Playgroud)

你的情况:

x <- raster('test.tif')
plot(x)
Run Code Online (Sandbox Code Playgroud)

这可能会解决它:

NAvalue(x) <- -9999
plot(x)
Run Code Online (Sandbox Code Playgroud)

  • @RobertH 上面的解释有很大帮助(电子邮件也是如此)。我不明白引擎盖下发生了什么。现在我知道了。所以我将在文件上使用 GDALinfo 来查看 nodata 值。然后,当我写入栅格时,我可以使用 NAflag= 为输出 tif 分配我想要的 nodata 值。感谢您帮助我理解这一点!我很感激所花费的时间! (2认同)