我一直在使用HDF5文件,我已经能够在rhdf5中进行一些子集化。有三个文件:经度,纬度和ColumnAmountNO2Trop。我已经将这一年中的所有日期作为一个列表提取到了#34;文件"。
files <- list.files(pattern = ".he5", full.names = TRUE)
attribute <- "/HDFEOS/SWATHS/ColumnAmountNO2/Data Fields/ColumnAmountNO2Trop"
attribute2<-"/HDFEOS/SWATHS/ColumnAmountNO2/Geolocation Fields/Longitude"
attribute3<-"/HDFEOS/SWATHS/ColumnAmountNO2/Geolocation Fields/Latitude"
以及下面的子文件:
out.list <- lapply(files, h5read, attribute)
Lon <- lapply(files, h5read, attribute2)
Lat<-lapply(files, h5read, attribute3)
但是,我需要根据纬度和经度值对out.list(其中包含&#39; ColumnAmountNO2Trop&#39;一年中的所有日子)进行子集化,以缩小我的地理参考区域。我能够使用行号和列号对它们进行子集化:
lapply(out.list, function(x) x[2:8,2:8])
然而,第一天的2,2的goegraphic位置可能在第2天不同。 我尝试使用下面的子集定义经度和纬度值,但它返回了一条错误消息。
Lond<-c(2,9)
Latd<-c(2,9)
lonKeep <- which(Lon > Lond[1] & Lon < Lond[2])
latKeep <- which(lat> latRan[1] & lat< latRan[2])
如何分组&#39; out.list&#39;对于Lon 2-9和Lat 2-9,请?
答案 0 :(得分:1)
您可以找到other approaches,可能找到更贴近您需求的解决方案。 使用hdf5和raster的选项是从hdf5文件中提取相关数据,构建栅格,将其裁剪到ROI并获取该区域的值。
我做这样的事情:
library(raster)
library(maptools)
source("http://bioconductor.org/biocLite.R")
biocLite("rhdf5")
library(rhdf5)
library(latticeExtra)
my_wd <- './Stackoverflow/22474417'
files <- list.files(path = my_wd, pattern = ".he5", full.names = F)
files
#[1] "M1.he5" "M2.he5"
attribute <- "/HDFEOS/SWATHS/ColumnAmountNO2/Data Fields/ColumnAmountNO2Trop"
attribute2<- "/HDFEOS/SWATHS/ColumnAmountNO2/Geolocation Fields/Longitude"
attribute3<- "/HDFEOS/SWATHS/ColumnAmountNO2/Geolocation Fields/Latitude"
阅读单个文件
m1 <- h5read(file.path(my_wd, files[1]), name = attribute)
dim(m1) # file dimension
# [1] 60 54
prod(dim(m1))
# [1] 3060
在从atribute2和atribute3中提取地理范围后,我们将使用它来构建rasterLayer
Lon <- h5read(file.path(my_wd, files[1]) , attribute2)
Lat <- h5read(file.path(my_wd, files[1]) , attribute3)
xmin <- min(Lon[1:prod(dim(m1))]) # Min. Longitude
# [1] -7.141283
xmax <- max(Lon[1:prod(dim(m1))]) # Max. Longitude
ymin <- min(Lat[1:prod(dim(m1))]) # Min. Longitude
ymax <- max(Lat[1:prod(dim(m1))]) # Max. Longitude
我们可以使用上面的信息
构建一个栅格m1m <- matrix(m1, nrow = 60)
m1r <- raster(m1m, xmn = xmin, xmx = xmax,
ymn = ymin, ymx = ymax)
将一些空间数据叠加到
data(wrld_simpl)
spdata <- wrld_simpl[which(wrld_simpl@data$NAME %in% c('Nigeria', 'Cameroon', 'Benin',
'Togo', 'Ghana',"Cote d'Ivoire",
'Gabon', 'Equatorial Guinea')), ]
从非洲海岸线30米
delta <- readOGR(dsn = './africa_shoreline_30m',
layer = 'nigeria_delta')
建立投资回报率范围
frm <- extent(c(2, 9, 2, 9))
pfrm <- as(frm, 'SpatialPolygons')
绘制它
spplot(m1r,scales = list(draw = TRUE), ylim=c(-1, 10)) +
latticeExtra::layer(sp.polygons(stp, fill = NA, col = 'blue'))+
latticeExtra::layer(sp.polygons(pfrm, fill = NA, col = 'red'))
从ROI中裁剪并获取值
m1rf <- crop(m1r, frm)
spplot(m1rf, scales = list(draw = TRUE), xlim = c(1, 10), ylim=c(1, 10)) +
latticeExtra::layer(sp.lines(delta, fill = NA, col = 'blue'))+
latticeExtra::layer(sp.polygons(pfrm, fill = NA, col = 'red'))
summary(m1rf)
layer
Min. -6.528723e+15
1st Qu. 9.437798e+14
Median 1.440395e+15
3rd Qu. 1.896734e+15
Max. 4.232078e+15
NA's 0.000000e+00
m1vals <- getValues(m1rf)
一旦您同意这一点,就可以轻松遍历文件夹并获取数据。