读取R

时间:2015-09-24 18:10:29

标签: r binary raster

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

但这似乎不对,我感谢任何建议。

2 个答案:

答案 0 :(得分:4)

我从源代码构建 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相比,它尚未提供自动质量控制,但此功能计划用于下一版本更新。在此期间,应使用栅格包中的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 ),以防您想一次下载和处理多个文件。

答案 1 :(得分:2)

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

使用

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

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

安装后,从URL读取栅格就像以下一样简单:

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

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

显示它
plot(r)

给出了

enter image description here