#grib #data #binary-data #binary-format #weather #meteorology #compression

grib-build

grib crate 的数据定义解析器,作为构建依赖内部使用

7 个不稳定版本

0.4.3 2024年4月3日
0.4.2 2023年2月9日
0.4.1 2023年1月29日
0.4.0 2022年11月13日
0.1.0 2021年1月24日

#989解析器实现

Download history 9/week @ 2024-05-13 24/week @ 2024-05-20 14/week @ 2024-06-03 24/week @ 2024-06-10 21/week @ 2024-06-17 8/week @ 2024-06-24 8/week @ 2024-07-01 39/week @ 2024-07-08 40/week @ 2024-07-15 35/week @ 2024-07-22 25/week @ 2024-07-29 38/week @ 2024-08-05

每月142 次下载
3 个 crate 中使用 (通过 grib)

MIT/Apache

33KB
784

grib-rs

docs Crates.io dependency status License (Apache 2.0) License (MIT) Build

Rust 的 GRIB 格式解析器

关于

这是一个用 Rust 编程语言编写的 GRIB 格式解析器库。该项目旨在提供一组易于使用、高效且具有教育意义的库和工具。

GRIB 是一种简洁的数据格式,常用于气象学中存储历史和预报天气数据。它旨在作为一个包含二维数据记录集合的容器。GRIB 文件很大且为二进制格式,应该被有效地处理。此外,由于 GRIB 是设计用来支持各种网格类型和使用外部代码表和模板中定义的参数进行数据压缩,因此一些流行的现有软件无法处理一些 GRIB 数据。

愿景

一个即使需要一些特定知识和经验来解释,每个人也能轻松读取天气数据的世界。

特性

  • Rust 库 grib
    • 能够读取和检查 GRIB2 的基本结构
    • 能够访问 GRIB2 消息内的数据
      • 层列表
      • 大多数用户重要的每一层的某些参数
      • 构成层和整个数据的底层部分
    • 支持 WMO 定义的某些代码表
    • 支持以下表中列出的模板的解码功能
    • 支持以下表中列出的模板的网格点的纬度和经度计算
  • 基于 Rust 库构建的 CLI 应用 gribber
    • 5 个子命令
      • completions:为您的 shell 生成自动完成
      • decode:将数据导出为文本和平坦的二进制文件
      • info:显示标识信息
      • inspect:显示主要用于开发目的的信息,如模板编号
      • list:显示每个层内的参数

模板支持

GRIB2 可以包含各种网格系统的网格点值。这种多样性通过称为“模板”的机制得到支持。

尽管GRIB2包含大量的网格点值,但单个网格点的坐标和值并不是直接以数值数据编码的。由于网格点是规则排列的,因此可以通过网格系统使用的投影方法类型以及该投影方法的具体参数来定义坐标,因此数据中只编码了网格系统的简单定义。

此外,由于不同数据的最佳编码方法各不相同,因此有多个可以用来编码值的方法,所使用的方法以及编码它所需的具体参数与数据本身一同定义。

这些关于网格系统和数据表示的定义通过称为模板的字节序列表示,以便读者读取GRIB2数据。grib-rs支持以下模板。我们也很乐意支持其他模板,如果您有无法读取的数据,请告知我们。

支持的网格定义模板

对于使用以下网格系统的数据,可以计算网格点的纬度和经度。

模板编号 网格系统 注释
3.0 纬度/经度(或等距圆柱形,或Plate Carree)
3.20 极地立体投影 启用功能 gridpoints-proj 需要
3.30 Lambert正形投影 启用功能 gridpoints-proj 需要

支持的数据表示模板

对于使用以下编码方法的数据,可以提取网格点值。

模板编号 编码方法
5.0 简单打包
5.2 复杂打包
5.3 复杂打包和空间差分
5.40 JPEG 2000代码流格式
5.41 可移植网络图形(PNG)
5.200 运行长度打包与级别值

计划功能

请查看 ROADMAP 了解计划功能。

API

库crate发布的版本API文档可在 Docs.rs 上找到,尽管内容不是很全面。开发版本可在 GitHub Pages 上找到。

如果您觉得缺少某个功能,请通过 GitHub Issues 向我们发送您的建议。我们将把扩展基本功能作为此项目的首要任务,因此我们很高兴收到任何请求。

使用示例

use grib::{self, codetables::grib2::*, ForecastTime, Grib2SubmessageDecoder, Name};

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let fname = "Z__C_RJTD_20160822020000_NOWC_GPV_Ggis10km_Pphw10_FH0000-0100_grib2.bin";
    let f = std::fs::File::open(fname)?;
    let f = std::io::BufReader::new(f);
    let grib2 = grib::from_reader(f)?;

    let (_index, submessage) = grib2
        .iter()
        .find(|(_index, submessage)| {
            matches!(
                submessage.prod_def().forecast_time(),
                Some(ForecastTime {
                    unit: Name(Table4_4::Minute),
                    value: minutes,
                }) if minutes == 30
            )
        })
        .ok_or("message with FT being 30 minutes not found")?;

    let latlons = submessage.latlons()?;
    let decoder = Grib2SubmessageDecoder::from(submessage)?;
    let values = decoder.dispatch()?;

    for ((lat, lon), value) in latlons.zip(values) {
        println!("{lat} {lon} {value}");
    }

    Ok(())
}

示例目录 可能有助于您了解API。

CLI应用程序 gribber

基于 grib 库构建的CLI应用程序 gribber 可用。它位于 grib-cli 包中,可以通过 cargo install grib-cli 安装。

Usage: gribber [COMMAND]

Commands:
  completions  Generate shell completions for your shell to stdout
  decode       Export decoded data
  info         Show identification information
  inspect      Inspect and describes the data structure
  list         List layers contained in the data
  help         Print this message or the help of the given subcommand(s)

Options:
  -h, --help     Print help
  -V, --version  Print version

请注意,从 gribber decode --big-endian 导出的二进制文件使用 0x7fc00000 作为缺失值,尽管来自 wgrib 的那些使用 0x6258d19a

构建

此存储库使用Git的子模块功能。因此,在运行 cargo build 之前,请以以下方式之一添加子模块

  • 带有子模块的克隆:将 --recursive 添加到 git clone 将会自动克隆子模块,同时包括此存储库
  • 克隆后添加子模块:克隆后运行 git submodule update --init --recursive 将更新仓库以包含子模块

然后在 Rust 世界中按常规方式构建它。

cargo build

论坛

如果您有任何问题或想进行讨论,请随时使用 GitHub Discussions 作为论坛。

贡献

贡献总是受欢迎。如果您感兴趣,请查看 CONTRIBUTING.md

许可

此项目受以下任一许可协议的许可:

任由您选择。

SPDX-许可-标识符:Apache-2.0 MIT

依赖

~1.5–2.3MB
~34K SLoC