如何从HDF5降水文件提取变量为TIFF栅格或获取指定坐标像素值
嘿,我来帮你搞定这两个关于GPM HDF5数据处理的需求!看你已经用R的rhdf5等工具加载了文件并查看了Groups和Datasets,接下来分两部分给你具体的实现代码和注意事项:
一、将HDF5中的变量提取为TIFF栅格
首先你需要明确要提取的具体数据集路径(可以从list.datasets(a)的输出里复制),下面以GPM常见的/Grid/precipitationCal变量为例演示:
- 读取目标数据集
# 替换成你实际要提取的数据集路径 target_dataset <- "/Grid/precipitationCal" # 从HDF5文件中读取数据 var_data <- h5read(a, target_dataset)
- 获取地理空间属性(确保栅格有正确的坐标信息)
GPM的HDF5文件通常在/Grid组的属性里存储了经纬度范围和分辨率,我们可以提取这些信息:
# 读取Grid组的属性 grid_attrs <- h5readAttributes(a, "/Grid") # 提取经度、纬度的范围和分辨率 lon_min <- grid_attrs$lonMin lon_max <- grid_attrs$lonMax lon_res <- grid_attrs$lonRes lat_min <- grid_attrs$latMin lat_max <- grid_attrs$latMax lat_res <- grid_attrs$latRes
- 创建并校正Raster对象
注意GPM的纬度数据是从北到南排列的,所以需要翻转纬度方向:
# 创建初始栅格对象(注意转置数据,因为HDF5中数据维度是lat×lon) var_raster <- raster(t(var_data), xmn = lon_min, xmx = lon_max, ymn = lat_min, ymx = lat_max, crs = CRS("+proj=longlat +datum=WGS84")) # 翻转纬度,让栅格的纬度从南到北正确排列 var_raster <- flip(var_raster, direction = "y")
- 保存为TIFF文件
# 替换成你想要的输出文件名 writeRaster(var_raster, "extracted_precipitation.tif", format = "GTiff", overwrite = TRUE)
二、通过CSV坐标获取变量的像素值
假设你的CSV文件(比如coords.csv)包含longitude和latitude两列的坐标数据,步骤如下:
- 读取CSV坐标文件
coords_df <- read.csv("coords.csv")
- 创建空间点对象(确保坐标系和GPM数据一致,即WGS84经纬度)
# 基于坐标列创建空间点数据框 coords_sp <- SpatialPointsDataFrame( coords = coords_df[, c("longitude", "latitude")], data = coords_df, proj4string = CRS("+proj=longlat +datum=WGS84") )
- 提取栅格像素值并保存结果
# 提取刚才创建的栅格中对应坐标的像素值 coords_df$target_value <- extract(var_raster, coords_sp) # 将带像素值的结果保存为新的CSV write.csv(coords_df, "coords_with_values.csv", row.names = FALSE)
一些注意事项
- 一定要替换代码中的数据集路径和文件名为你实际的内容
- 如果你的目标变量维度不是
lat×lon,需要调整raster()函数中的数据转置逻辑 - 如果CSV中的坐标不是WGS84经纬度,需要先使用
spTransform()函数进行投影转换
内容的提问来源于stack exchange,提问作者Sikandar Ali
相关产品推荐
相关产品推荐

