我想在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
但这似乎不对,我感谢任何建议。
答案 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
上的Kendall
,bfast
,strucchange
。
安装后,从URL读取栅格就像以下一样简单:
library(greenbrown)
r <- ReadVI3g("http://nasanex.s3.amazonaws.com/AVHRR/GIMMS/3G/1980s/geo81aug15a.n07-VI3g")
greenbrown::ReadVI3g
返回的对象是RasterLayer。我们可以用
plot(r)
给出了