首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用另一个子矩阵的值的子集HDF5矩阵

使用另一个子矩阵的值的子集HDF5矩阵
EN

Stack Overflow用户
提问于 2014-03-18 08:55:19
回答 1查看 533关注 0票数 0

我一直在处理HDF5文件,并且能够在rhdf5中做一些子设置。有三个文件:.经度、纬度和ColumnAmountNO2Trop。在一年中的所有日子里,我都把它提取为“文件”中的一个列表。

代码语言:javascript
复制
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"

子文件如下:

代码语言:javascript
复制
out.list <- lapply(files, h5read, attribute)
Lon <- lapply(files, h5read, attribute2)
Lat<-lapply(files, h5read, attribute3)

但是,我需要根据纬度和经度值来子集out.list(它包含一年中所有日子的“ColumnAmountNO2Trop”),以缩小我的地理参考区域。我能够使用行号和列号对它们进行子集:

代码语言:javascript
复制
lapply(out.list, function(x) x[2:8,2:8]) 

然而,第一天2,2的地理位置可能与第二天不一样。我试图将经度和纬度值定义为下面的子集,但它返回了一条错误消息。

代码语言:javascript
复制
Lond<-c(2,9)
Latd<-c(2,9)
lonKeep <- which(Lon > Lond[1] & Lon < Lond[2])
latKeep <- which(lat> latRan[1] & lat< latRan[2]) 

请问如何对Lon 2-9和Lat 2-9进行“out.list”子集?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-18 23:02:24

您将找到其他方法,可能会有更接近您需要的解决方案。使用hdf5和光栅的一个选项是从hdf5文件中提取相关数据,构建光栅,将其裁剪到ROI并获取该区域的值。

我会这样做:

代码语言:javascript
复制
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"

读取单个文件

代码语言:javascript
复制
m1 <- h5read(file.path(my_wd, files[1]), name = attribute)
dim(m1) # file dimension
# [1] 60 54
prod(dim(m1))
# [1] 3060

在从rasterLayer和atribute3中提取地理范围之后,我们将使用它来构建一个atribute2

代码语言:javascript
复制
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

我们可以用上面的信息建立一个光栅

代码语言:javascript
复制
m1m <- matrix(m1, nrow = 60)    
m1r <- raster(m1m, xmn = xmin, xmx = xmax,
              ymn =  ymin, ymx = ymax)

获取一些空间数据以覆盖

代码语言:javascript
复制
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米

代码语言:javascript
复制
delta <- readOGR(dsn = './africa_shoreline_30m',
                 layer = 'nigeria_delta')

建立一个ROI范围

代码语言:javascript
复制
frm <- extent(c(2, 9, 2, 9))
pfrm <- as(frm, 'SpatialPolygons')

图谋

代码语言:javascript
复制
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中获取值

代码语言:javascript
复制
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'))

代码语言:javascript
复制
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)

一旦您同意这一点,就很容易遍历您的文件文件夹并获取您的数据。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22474417

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档