如何在terra中访问NetCDF文件的元数据与属性?
在terra中提取NetCDF文件的模型元数据问题
我从Climate Data Store下载了包含多个集合成员月度数据的数据集,需要将成员编号与对应模型关联起来。但使用terra工具时,找不到访问NetCDF文件中关键元数据的方法(这些元数据在原文件中确实存在)。
在ncdf4中的实现方式
用ncdf4可以轻松获取属性列表并提取模型名称:
library(ncdf4) nc <- nc_open('filepath.nc') attributes(nc$var) $names [1] "lat_bnds" "lon_bnds" "time_bnds" "member_id" [5] "gcm_institution" "gcm_model" "gcm_variant" "t" [9] "crs" "height2m" head(ncvar_get(nc, "gcm_model")) [1] "ACCESS-CM2" "ACCESS-ESM1-5" "AWI-CM-1-1-MR" "BCC-CSM2-MR" "CAMS-CSM1-0" [6] "CESM2-WACCM"
在terra中遇到的问题
使用terra读取文件后,meta()能显示包含所需属性的信息,meta(., layers=TRUE)显示属性关联到'coordinates',但不知道如何直接获取模型名称列表并关联到图层名称:
rterra <- rast('filepath.nc') head(names(rterra)) [1] "t_member=1_1" "t_member=1_2" "t_member=1_3" "t_member=1_4" "t_member=1_5" [6] "t_member=1_6" meta(rterra) ... [48,] "member_id height2m time lat lon gcm_institution gcm_model gcm_variant" ... meta(rterra, layers=TRUE) "coordinates" "member_id height2m time lat lon gcm_institution gcm_model gcm_variant"
补充说明:原文件包含多集合成员数据,已准备小子集用于测试。
解决方法(terra内实现)
不需要依赖ncdf4或ncdfCF,terra本身提供了读取NetCDF变量的方法:
- 直接读取
gcm_model变量
使用read_nc()函数读取NetCDF中的特定变量,将其转换为向量即可得到模型名称列表:
library(terra) # 读取gcm_model变量 gcm_model_rast <- read_nc("filepath.nc", var = "gcm_model") # 转换为向量格式 model_names <- as.vector(gcm_model_rast)
- 提取图层中的成员编号并关联
从图层名称中提取成员编号,再与模型名称一一对应:
# 读取主数据 rterra <- rast("filepath.nc") # 从图层名提取成员编号 member_ids <- sub("t_member=(\\d+)_.*", "\\1", names(rterra)) # 生成关联数据框 model_member_map <- data.frame( member_id = as.integer(member_ids), model_name = model_names, layer_name = names(rterra) ) # 查看结果 head(model_member_map)
- 查看完整元数据(可选)
使用nc_meta()可以查看NetCDF文件的详细元数据,确认变量信息:
nc_meta("filepath.nc")
内容的提问来源于stack exchange,提问作者Jaken
相关产品推荐
相关产品推荐

