R:将二进制文件转换为光栅文件

R: Convert Binary to Raster File

我打算做的事情很简单。我下载了二进制文件(例如这个:ftp://ftp.star.nesdis.noaa.gov/pub/smcd/jhuang/npp.viirs.aerosol.data/edraot550/monthly/2015/)并想使用 R 将它们转换为常规栅格格式(例如 tif)。这些文件包含关于气溶胶光学厚度的网格化全球数据。

我尝试使用 x <- readBin(filename, "double", endian = "little") 读取文件。但是,生成的对象只包含一个数字。插入另一个 what 选项而不是 double 只会改变给定的数字,但不能解决问题。

数据源没有提供头文件。文档 (ftp://ftp.star.nesdis.noaa.gov/pub/smcd/jhuang/npp.viirs.aerosol.data/edraot550/1README.txt) 提供了对我完全没有经验的 Fortran 和 IDL 的评论。因此,在 R 中完成这个相当简单的任务会很棒。从直觉上讲,解决方案应该是一个或两个命令的问题。

感谢您的意见和建议。

对于此文件:

g <- 'npp_aot550_edr_gridded_0.25_201503_201505_am.bin.gz'

先解压

library(R.utils)
gunzip(g)

现在可以使用list.files获取bin文件

f <- list.files(pattern='\.bin$')[1]

不过我会 hard-code 它:

f <- 'npp_aot550_edr_gridded_0.25_201503_201505_am.bin'

制作一个与所描述的范围和分辨率分辨率相匹配的模板栅格。

library(raster)
r <- raster(res=.25)

保存到文件。数据类型设置文件大小,这就是我如何看到它必须是 'FLT8S'.

writeRaster(r, 'test.grd', datatype='FLT8S', overwrite=T)

复制header

file.copy('test.grd', extension(f, '.grd'))

用值

重命名文件
file.rename(f, extension(f, '.gri'))

创建一个 RasterLayer object 并设置正确的 NA 标志值

r <- raster(extension(f, '.gri'))
NAvalue(r) <- -999.9

值是从下往上存储的,所以需要'flipped'。我在同一步骤中将它们保存到一个 tif 文件中

x <- flip(r, 'y', filename=extension(f, 'tif'))

类似于 Robert Hijmans 的回答,但从零开始创建光栅对象:

library(raster)

x <- readBin('~/Downloads/npp_aot550_edr_gridded_0.25_201503_201505_am.bin','double', n = 1036800, endian = "little")

x[x < -900] <- NA

m <- matrix(data = x, nrow = 720, ncol = 1440, byrow = T)

r <- flip(raster(m, xmn=-180, xmx=180, ymn=-90, ymx=90),direction = 2)

library(classInt)
library(RColorBrewer)
library(sp)

pal = brewer.pal(7,"Greens")
brks.qt = classIntervals(x[!is.na(x)], n = 7, style = "quantile")

spplot(r, at=brks.qt$brks,col.regions=pal)

顺便说一下,当我读取值时,有 -999.9,而不是文档中所说的 -9999.0。