You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

咨询.gbl文件的内容构成及R环境下处理与生成相关问题

NOAA .gbl 文件结构解析与R环境生成方案

一、.gbl 文件核心结构

.gbl 是NOAA为HYSPLIT大气轨迹模型定义的ASCII文本格式地面气象数据文件,用于驱动轨迹计算。结构分为固定格式的文件头和逐行记录的气象数据块:

1. 文件头(固定8行)

每行包含16个用空格分隔的数值,核心信息集中在前3行:

第一行:起始时间(年、月、日、时、分、秒,后10位为预留0)
第三行:第一个数为包含的气象变量总数,第二个数为数据类型(1代表地面数据)
其余行:预留填充0即可

示例标准头:

1990  1  1  0  0  0  0  0  0  0  0  0  0  0  0  0
 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
 4  1  0  0  0  0  0  0  0  0  0  0  0  0  0  0
 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0

注:第三行的4代表包含4个气象变量(比如气压、气温、风速、风向)

2. 数据行

每行对应一个时间点的单站点/网格气象数据,格式为空格分隔的固定字段:
YYYYMMDDHH 纬度 经度 气象变量1 气象变量2 ...

示例数据行:

1990010100  -90.00  0.00  1013.25  263.15  2.5  180.0

字段说明:

  • 时间:格式为YYYYMMDDHH(年、月、日、时)
  • 纬度/经度:保留2位小数
  • 气象变量:按文件头定义的顺序排列,比如气压(hPa)、气温(K)、风速(m/s)、风向(°)

二、R环境下自行生成.gbl 文件步骤

1. 准备气象数据

确保你的数据集包含:

  • 逐小时时间序列(与.gbl的时间粒度匹配)
  • 站点/网格的经纬度坐标
  • 所需气象变量(需与文件头定义的变量数对应)

2. 构建文件头

用R的字符向量生成符合格式的8行头信息:

# 示例:起始时间1990年1月1日,包含4个地面气象变量
header <- c(
  "1990  1  1  0  0  0  0  0  0  0  0  0  0  0  0  0",
  " 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0",
  " 4  1  0  0  0  0  0  0  0  0  0  0  0  0  0  0",
  rep(" 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0", 5)
)

3. 格式化数据行

将原始数据转换为.gbl要求的格式,注意数值的小数位数和字段顺序:

library(dplyr)

# 假设原始数据框为met_data,包含datetime, latitude, longitude, pressure, temp_k, wind_speed, wind_dir
formatted_data <- met_data %>%
  mutate(
    time_str = format(datetime, "%Y%m%d%H"),
    lat = sprintf("%6.2f", latitude),
    lon = sprintf("%6.2f", longitude),
    pres = sprintf("%7.2f", pressure),
    temp = sprintf("%6.2f", temp_k),
    wind_spd = sprintf("%5.1f", wind_speed),
    wind_dir = sprintf("%5.1f", wind_dir)
  ) %>%
  select(time_str, lat, lon, pres, temp, wind_spd, wind_dir) %>%
  apply(1, paste, collapse = " ")

4. 写入.gbl 文件

将文件头和格式化数据合并写入文件:

# 先写入文件头
writeLines(header, "custom_met.gbl")
# 追加数据行
write.table(formatted_data, "custom_met.gbl", append = TRUE,
            row.names = FALSE, col.names = FALSE, quote = FALSE)

5. 用purrr::walk()批量生成

如果需要按时间分段(如按年)批量生成文件,用purrr::walk()实现循环:

library(purrr)
library(lubridate)

# 按年份拆分数据,year_list为目标年份向量
year_list <- c(1990, 1991, 1992)

walk(year_list, function(target_year) {
  # 筛选对应年份的数据
  year_subset <- met_data %>% filter(year(datetime) == target_year)
  
  # 生成对应年份的文件头
  year_header <- c(
    sprintf("%d  1  1  0  0  0  0  0  0  0  0  0  0  0  0  0", target_year),
    " 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0",
    " 4  1  0  0  0  0  0  0  0  0  0  0  0  0  0  0",
    rep(" 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0", 5)
  )
  
  # 格式化年份数据
  formatted_year <- year_subset %>%
    mutate(
      time_str = format(datetime, "%Y%m%d%H"),
      lat = sprintf("%6.2f", latitude),
      lon = sprintf("%6.2f", longitude),
      pres = sprintf("%7.2f", pressure),
      temp = sprintf("%6.2f", temp_k),
      wind_spd = sprintf("%5.1f", wind_speed),
      wind_dir = sprintf("%5.1f", wind_dir)
    ) %>%
    select(time_str, lat, lon, pres, temp, wind_spd, wind_dir) %>%
    apply(1, paste, collapse = " ")
  
  # 写入对应年份的.gbl文件
  file_name <- sprintf("custom_met_%d.gbl", target_year)
  writeLines(year_header, file_name)
  write.table(formatted_year, file_name, append = TRUE,
              row.names = FALSE, col.names = FALSE, quote = FALSE)
})

内容的提问来源于stack exchange,提问作者eeeeessss

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 06:16:08