将像素二进制文件交错的波段转换为光栅网格
Converting band interleaved by pixel binary files into raster grids
我有一个 BIP 二进制文件 https://drive.google.com/open?id=0BwkLXkUMkLd4SnBmUHNmMW5CcDg
包含以下信息:
ncol <- 193
nrow <- 94
xmin <- -180
xmax<- 180
ymin <- -88.542000
ymax <- 88.542000
该文件有 365 个波段,我希望能够将它们转换为栅格(栅格堆栈)。
我可以阅读 R 中的文件,但我不知道如何处理乐队。这是我到目前为止所做的:
cnt <- ncol*nrow*365
data <- readBin(file,what= "double", n=cnt, size=4,endian=.Platform$endian)
data.m <- matrix(data, ncol=193, nrow=94) # I don't know how to add the bands
data.r <- raster(data.m, xmn=xmin, xmx=xmax, ymn=ymin, ymx=ymax)
plot(data.r)
使用raster::brick,因为它是一个基于具有多个波段(包括 BIL 和 BIP)的文件创建多波段栅格的函数。
如果它偶然不能识别你的 georef 数据,你可以在读取文件时将其作为参数输入:ncols=193, xmn=-180, xmx=180, ymn=-88.542000, ymx=88.542000, nl=365.
这是一个基于您提供的文件的示例实现。由于它未被识别为 BIP 文件,您首先必须读取它并将其转换为 3D 数组。然后你可以简单地将它与 brick 命令一起使用来创建光栅堆栈。现在,棘手的是数据文件的尺寸顺序与 brick 命令不兼容,因此您必须使用 aperm 函数转置尺寸。之后,直接将整个数组转换为地理参考堆栈。
wd="D:/temp/"
setwd(wd)
library(raster)
ncol <- 193
nrow <- 94
nbands <- 365
cnt <- ncol*nrow*nbands
data <- readBin("Tavg.dat",what= "double", n=cnt, size=4,endian=.Platform$endian)
data2=array(data,c(nbands, ncol, nrow))
data2 <- aperm(data2, c(3,2,1)) #for transposing
raster_brick=brick(data2, xmn=-180, xmx=180, ymn=-88.542000, ymx=88.542000)
plot(raster_brick[[1]])
这是第一张乐队图片:
你也可以写一个头文件。例如,将 'Tavg.dat' 重命名为 'Tavg.gri' 并将以下内容保存到名为 'Tavg.grd'
的文本文件中
[georeference]
nrows=94
ncols=193
xmin=-180
ymin=-88.542
xmax=180
ymax=88.542
projection=+proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0
[data]
datatype=FLT4S
byteorder=little
nbands=365
bandorder=BIP
nodatavalue=-9999
[description]
layername=''
那你可以做
library(raster)
b <- brick('Tavg.grd')
我有一个 BIP 二进制文件 https://drive.google.com/open?id=0BwkLXkUMkLd4SnBmUHNmMW5CcDg
包含以下信息:
ncol <- 193
nrow <- 94
xmin <- -180
xmax<- 180
ymin <- -88.542000
ymax <- 88.542000
该文件有 365 个波段,我希望能够将它们转换为栅格(栅格堆栈)。 我可以阅读 R 中的文件,但我不知道如何处理乐队。这是我到目前为止所做的:
cnt <- ncol*nrow*365
data <- readBin(file,what= "double", n=cnt, size=4,endian=.Platform$endian)
data.m <- matrix(data, ncol=193, nrow=94) # I don't know how to add the bands
data.r <- raster(data.m, xmn=xmin, xmx=xmax, ymn=ymin, ymx=ymax)
plot(data.r)
使用raster::brick,因为它是一个基于具有多个波段(包括 BIL 和 BIP)的文件创建多波段栅格的函数。 如果它偶然不能识别你的 georef 数据,你可以在读取文件时将其作为参数输入:ncols=193, xmn=-180, xmx=180, ymn=-88.542000, ymx=88.542000, nl=365.
这是一个基于您提供的文件的示例实现。由于它未被识别为 BIP 文件,您首先必须读取它并将其转换为 3D 数组。然后你可以简单地将它与 brick 命令一起使用来创建光栅堆栈。现在,棘手的是数据文件的尺寸顺序与 brick 命令不兼容,因此您必须使用 aperm 函数转置尺寸。之后,直接将整个数组转换为地理参考堆栈。
wd="D:/temp/"
setwd(wd)
library(raster)
ncol <- 193
nrow <- 94
nbands <- 365
cnt <- ncol*nrow*nbands
data <- readBin("Tavg.dat",what= "double", n=cnt, size=4,endian=.Platform$endian)
data2=array(data,c(nbands, ncol, nrow))
data2 <- aperm(data2, c(3,2,1)) #for transposing
raster_brick=brick(data2, xmn=-180, xmx=180, ymn=-88.542000, ymx=88.542000)
plot(raster_brick[[1]])
这是第一张乐队图片:
你也可以写一个头文件。例如,将 'Tavg.dat' 重命名为 'Tavg.gri' 并将以下内容保存到名为 'Tavg.grd'
的文本文件中[georeference]
nrows=94
ncols=193
xmin=-180
ymin=-88.542
xmax=180
ymax=88.542
projection=+proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0
[data]
datatype=FLT4S
byteorder=little
nbands=365
bandorder=BIP
nodatavalue=-9999
[description]
layername=''
那你可以做
library(raster)
b <- brick('Tavg.grd')