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

Read binary raster files in R

我想在 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

但这似乎不对,我很感激任何建议。 .

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

在 R 中安装它
install.packages("greenbrown", repos="http://R-Forge.R-project.org")

如果因为包的作者需要重新构建而失败,另一种方法是首先直接从存储库下载源,然后手动安装它们,如 greenbrown installation instructions 中所述。在后一种情况下,您可能还必须手动安装几个 greenbrown 首先依赖的软件包:install.packages on Kendallbfaststrucchange.

安装后,从 URL 读取光栅就像:

library(greenbrown)
r <- ReadVI3g("http://nasanex.s3.amazonaws.com/AVHRR/GIMMS/3G/1980s/geo81aug15a.n07-VI3g")

greenbrown::ReadVI3g返回的对象是一个RasterLayer。我们可以用

显示
plot(r)

这给出了

我从源代码构建了 greenbrown(基于 GitHub 上暂存的文件),发现处理一个文件需要相当长的时间。

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 来丢弃 low-quality 值。

# 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),以防您想一次下载和处理多个文件。