如何用R将.GRD二进制降雨网格文件转为TXT并合并多文件
用R处理印度气象局GRD降雨数据:转换为TXT并合并
核心参数确认
先明确你的GRD文件关键属性,后续代码会基于这些参数编写:
- 网格维度:135(纬度)×129(经度)
- 经纬度范围:纬度6.5N38.5N,经度66.5E100.0E,步长0.25度
- 记录数:平年365条/闰年366条,每条对应1天的网格降雨数据
- 数据格式:单精度二进制浮点型(印度气象局GRD通用格式)
步骤1:编写单个文件处理函数
这个函数负责读取GRD二进制数据,解析为包含日期、经纬度、降雨量的结构化数据框:
process_single_grd <- function(file_path, target_year) { # 计算当年天数 day_count <- ifelse(target_year %% 4 == 0 & (target_year %% 100 != 0 | target_year %% 400 == 0), 366, 365) # 读取二进制数据:size=4对应单精度浮点,若读取异常可尝试size=8(双精度) raw_data <- readBin(file_path, what = "numeric", n = 135*129*day_count, size = 4) # 转为三维数组:[纬度, 经度, 日期] data_array <- array(raw_data, dim = c(135, 129, day_count)) # 生成经纬度序列 lat_list <- seq(6.5, 38.5, by = 0.25) lon_list <- seq(66.5, 100.0, by = 0.25) # 生成当年日期序列 date_list <- seq(as.Date(paste0(target_year, "-01-01")), as.Date(paste0(target_year, "-12-31")), by = "day") # 转换为长格式数据框 result_df <- expand.grid(Latitude = lat_list, Longitude = lon_list, Date = date_list) # 调整数组维度顺序,匹配数据框的排列逻辑 result_df$Rainfall <- as.vector(aperm(data_array, c(3, 1, 2))) return(result_df) }
步骤2:批量处理并合并所有文件
将所有GRD文件放在同一目录下,批量读取处理后合并为单个数据框:
# 设置GRD文件所在目录,替换为你的实际路径 grd_folder <- "your_grd_files_folder" # 获取所有GRD文件路径 grd_files <- list.files(grd_folder, pattern = "\\.GRD$", full.names = TRUE) # 从文件名提取年份(假设文件名格式类似"rain2000.GRD",需根据你的实际文件名调整匹配规则) year_list <- as.integer(sub(".*([0-9]{4})\\.GRD$", "\\1", basename(grd_files))) # 批量处理所有文件 all_year_data <- lapply(1:length(grd_files), function(i) { process_single_grd(grd_files[i], year_list[i]) }) # 合并所有年份数据 combined_data <- do.call(rbind, all_year_data)
步骤3:导出为TXT格式
将合并后的数据导出为制表符分隔的TXT文件:
write.table(combined_data, file = "combined_rainfall_2000-2020.txt", sep = "\t", row.names = FALSE, quote = FALSE)
常见问题排查
- 若读取数据出现异常值,检查
readBin的size参数是否匹配数据实际精度,可尝试切换size=4或size=8。 - 文件名年份提取失败时,修改
sub函数的正则表达式,匹配你的实际文件名格式。 - 内存不足时,可分年份导出TXT后,用系统命令合并(Windows用
copy *.txt combined.txt,Linux用cat *.txt > combined.txt)。
内容的提问来源于stack exchange,提问作者user68411
相关产品推荐
相关产品推荐

