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。
我打算做的事情很简单。我下载了二进制文件(例如这个: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。