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 在 解析器实现
每月142 次下载
在 3 个 crate 中使用 (通过 grib)
33KB
784 行
grib-rs
Rust 的 GRIB 格式解析器
关于
这是一个用 Rust 编程语言编写的 GRIB 格式解析器库。该项目旨在提供一组易于使用、高效且具有教育意义的库和工具。
GRIB 是一种简洁的数据格式,常用于气象学中存储历史和预报天气数据。它旨在作为一个包含二维数据记录集合的容器。GRIB 文件很大且为二进制格式,应该被有效地处理。此外,由于 GRIB 是设计用来支持各种网格类型和使用外部代码表和模板中定义的参数进行数据压缩,因此一些流行的现有软件无法处理一些 GRIB 数据。
愿景
一个即使需要一些特定知识和经验来解释,每个人也能轻松读取天气数据的世界。
特性
- Rust 库
grib
- 能够读取和检查 GRIB2 的基本结构
- 能够访问 GRIB2 消息内的数据
- 层列表
- 大多数用户重要的每一层的某些参数
- 构成层和整个数据的底层部分
- 支持 WMO 定义的某些代码表
- 支持以下表中列出的模板的解码功能
- 支持以下表中列出的模板的网格点的纬度和经度计算
- 基于 Rust 库构建的 CLI 应用
gribber
- 5 个子命令
- completions:为您的 shell 生成自动完成
- decode:将数据导出为文本和平坦的二进制文件
- info:显示标识信息
- inspect:显示主要用于开发目的的信息,如模板编号
- list:显示每个层内的参数
- 5 个子命令
模板支持
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。
许可
此项目受以下任一许可协议的许可:
- Apache License,版本 2.0(见 LICENSE-APACHE 或 http://www.apache.org/licenses/LICENSE-2.0),以及
- MIT 许可证(见 LICENSE-MIT 或 http://opensource.org/licenses/MIT)
任由您选择。
SPDX-许可-标识符:Apache-2.0 或 MIT
依赖
~1.5–2.3MB
~34K SLoC