在 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 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)
这给出了
我从源代码构建了 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),以防您想一次下载和处理多个文件。
我想在 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 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)
这给出了
我从源代码构建了 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),以防您想一次下载和处理多个文件。