在R中读取二进制栅格文件

4
我希望能在R中读取二进制整数并将其转换为光栅网格。 文件的特征如下:
NCols= 4320
NRows= 2160
pixel-size: 1/12=0.833 degrees
upper-left-lat: 90.0-1/24
upper-left-lon: -180.0+1/24
lower-right-lat: -90.0+1/24
lower-right-lon: 180.0
nodata= -5000
scale-factor= 10000
datatype: 16-bit signed integer
byte-order: big endian

以下是我的工作内容:

file <-"http://nasanex.s3.amazonaws.com/AVHRR/GIMMS/3G/1980s/geo81aug15a.n07-VI3g"
dat <- readBin(file,what="integer", size=4, signed = TRUE, n = NRows * NCols, endian = "big")
r <- raster(nrow=2160, ncol=4320)
r[] <- dat

但这似乎不太对,我欢迎任何建议。

不太确定你想要什么,你能更详细地描述一下吗? - Badger
我认为数据有子集。以下是我从文档中找到的内容:每个NDVI数据集都是一个INT16文件,保存为ieee-big_endian,范围从-10000->(10000->10004),flagW文件加入到ndvi值中如下: ndvi3g = round(ndvi*10000) + flagW - 1; flagW范围为1->7 为检索原始的ndvi和flagW值, flagW = ndvi3g-floor(ndvi3g/10)*10 + 1; ndvi = floor(ndvi3g/10)/1000 您知道我如何提取ndvi值吗? - Geo-sp
@DNM 你对这些文件的精确文件格式有特别的兴趣并想了解这些细节吗?还是只是想得到一个光栅图像以便于显示? - WhiteViking
也许这个链接可以帮到你。这个问题更适合在GIS Stack上提问,你可以在那里找到更多的帮助。祝你好运! - Badger
@WhiteViking,现在我只想能够正确地将它们制作成栅格网格,然后重新投影和分析它们。 - Geo-sp
2个回答

4

我从GitHub下载了greenbrown源代码并编译,但是发现处理单个文件的时间相当长。

system.time(
  r1 <- ReadVI3g("http://nasanex.s3.amazonaws.com/AVHRR/GIMMS/3G/1980s/geo81aug15a.n07-VI3g")
)

#   user  system elapsed 
#  3.252   0.973 143.846

因此,我建议查看 gimms 软件包,它专门为这种类型的数据设计,并且可以从 CRAN 获取。请注意,与 ReadVI3g 不同,它尚未提供自动化质量控制功能,但该功能已计划在下一个版本更新中推出。同时,应使用 raster 包中的 overlay 来丢弃低质量值。
# install.packages("gimms")
library(gimms)

system.time({
  ## download file, see ?downloadGimms for further options
  f <- updateInventory()
  f <- downloadGimms(f[3], overwrite = TRUE) # download 3rd file in 'f', viz. geo81aug15a.n07-VI3g

  ## rasterize ndvi and flags
  ndvi <- rasterizeGimms(f)
  flag <- rasterizeGimms(f, flag = TRUE)

  ## perform quality control
  r2 <- overlay(ndvi, flag, fun = function(x, y) {
    x[y[] > 1] <- NA
    return(x)
  })
})

#   user  system elapsed 
#  4.538   3.894  26.781

两个生成的图像显然是相同的。
> unique(r1 - r2, na.rm = TRUE)
[1] 0

但是如您所见,基于 gimms 的代码执行速度更快。此外它还提供了并行功能(通过 doParallel),以便一次下载和处理多个文件。


谢谢@fdetsch!这非常有趣! - Geo-sp

2

您可以使用 greenbrown R 包来读取此类文件。

在 R 中安装该包的方法如下:

install.packages("greenbrown", repos="http://R-Forge.R-project.org")

如果由于软件包需要由其作者重新构建而导致安装失败,则另一种选择是首先直接从repo下载源代码,然后按照greenbrown安装说明中所述手动安装。在后一种情况下,您可能还需要手动安装greenbrown依赖的一些软件包:Kendallbfaststrucchange
安装完成后,从URL读取raster就像这样简单:
library(greenbrown)
r <- ReadVI3g("http://nasanex.s3.amazonaws.com/AVHRR/GIMMS/3G/1980s/geo81aug15a.n07-VI3g")
< p >greenbrown::ReadVI3g返回的对象是一个RasterLayer。我们可以使用以下代码将其显示:

plot(r)

这提供了一种方法,

输入图像描述


看起来是一个有趣的软件包!但正如你所指出的,这个软件包无法安装。 - Geo-sp
@DNM 对我来说也失败了,但我使用 svn 在本地克隆了仓库,然后按照我在答案中提供的安装说明“手动”安装了该软件包。(很简单,只需要几分钟。) - WhiteViking
谢谢,现在它可以工作了!我先在Linux下构建了它,然后将包复制到Windows环境中。看起来他们为这些数据集创建了一个函数,但我仍然想知道如何手动读取数据。感谢您的帮助! - Geo-sp
如果您想了解如何手动读取数据的详细信息,只需查看greenbrown包源代码即可...文件greenbrown/pkg/greenbrown/R/ReadVI3g.R仅实现了ReadVI3g()。它有很好的文档,简洁易懂。它也使用了readBin(),就像您开始的一样。 - WhiteViking

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接