10 个不稳定版本 (4 个破坏性更新)
0.10.1 | 2024年8月12日 |
---|---|
0.10.0 | 2024年7月4日 |
0.9.2 | 2024年5月24日 |
0.9.0 | 2024年2月4日 |
0.6.0 | 2022年11月13日 |
在 科学 中排名第 126
每月下载量 141
4.5MB
7.5K SLoC
grib-rs
Rust 的 GRIB 格式解析器
关于
这是一个用 Rust 编程语言编写的 GRIB 格式解析库。该项目旨在提供一组简单易用、高效且具有教育意义的库和工具。
GRIB 是一种简洁的数据格式,常用于气象学中存储历史和预测天气数据。它旨在成为一组二维数据记录的容器。GRIB 文件很大且为二进制格式,应该高效处理。此外,由于 GRIB 是为支持各种网格类型和使用外部代码表和模板中定义的参数进行数据压缩而设计的,因此一些流行的现有软件无法处理某些 GRIB 数据。
Demo 网络应用程序
GRIB2 查看器网络应用程序的示例可在此处查看 这里。
加载后,应用程序完全在您的网络浏览器中运行,不会将您上传的数据发送到任何地方。
愿景
一个即使需要一些特定知识和经验来解释,每个人都能轻松读取天气数据的世界。
功能
- Rust 库
grib
- 读取并检查 GRIB2 基本结构的能力
- 访问 GRIB2 消息内部数据的能力
- 图层列表
- 对大多数用户重要的每个图层的参数
- 构成图层和整个数据的底层部分
- 支持 WMO 定义的一些代码表
- 支持以下表格中列出的模板的解码功能
- 支持以下表格中列出的模板的网格点经纬度计算
- 基于 Rust 库构建的 CLI 应用程序
gribber
- 5 个子命令
- completions:为您的 shell 生成自动完成
- decode:将数据导出为文本和平坦的二进制文件
- info:显示标识信息
- inspect:显示信息,主要用于开发目的,如模板编号
- 列表:显示每个层内部的参数
- 5 个子命令
模板支持
GRIB2可以包含各种网格系统的网格点值。这种多样性是通过称为“模板”的机制来支持的。
尽管GRIB2包含大量的网格点值,但单个网格点的坐标和值并不是直接以数值数据编码的。由于网格点是规则排列的,因此坐标可以通过用于网格系统的投影方法类型和该投影方法的具体参数来定义,因此仅在数据中编码了网格系统的简单定义。
此外,由于值的最优编码方法因数据而异,存在多种可以用来编码值的方法,用于编码的方法和编码它所需的具体参数与数据本身一起定义。
这些网格系统和数据表示的定义由称为模板的字节序列表示,以便读者可以读取GRIB2数据。grib-rs支持以下模板。我们也很乐意支持其他模板,所以如果您有任何无法读取的数据,请让我们知道。
支持的网格定义模板
对于使用以下网格系统的数据,可以计算网格点的纬度和经度。
模板编号 | 网格系统 | 注释 |
---|---|---|
3.0 | 纬度/经度(或等距圆柱,或Plate Carree) | 仅支持规则网格 |
3.20 | 极地投影 | 需要启用功能 gridpoints-proj |
3.30 | 拉梅特投影 | 需要启用功能 gridpoints-proj |
3.40 | 高斯纬度/经度 | 仅支持规则网格 |
支持的数据表示模板
对于使用以下编码方法的数据,可以提取网格点值。
模板编号 | 编码方法 |
---|---|
5.0 | 简单打包 |
5.2 | 复杂打包 |
5.3 | 复杂打包和空间差分 |
5.40 | JPEG 2000代码流格式 |
5.41 | 便携式网络图形(PNG) |
5.200 | 带有级别值的行程长度打包 |
计划中的功能
请查看路线图了解计划中的功能。
API
库crate发布的版本API文档可在Docs.rs上找到,尽管内容不是很丰富。开发版本可在GitHub Pages上找到。
如果您觉得缺少某些功能,请通过GitHub Issues向我们发送您的建议。我们正在努力将基本功能作为此项目的首要任务进行扩展,因此我们很乐意接受任何请求。
使用示例
use grib::{codetables::grib2::*, ForecastTime, Grib2SubmessageDecoder, Name};
fn main() -> Result<(), Box<dyn std::error::Error>> {
let fname = "testdata/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 with latitudes and longitudes
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
之前,请以以下方式之一添加子模块
- 带有子模块的克隆:在
git clone
中添加--recursive
将自动克隆子模块以及此存储库 - 在克隆后添加子模块:在克隆后运行
git submodule update --init --recursive
将更新仓库以包含子模块
然后在Rust世界中按常规方式构建它。
cargo build
论坛
如果您有任何问题或想进行讨论,请随时使用 GitHub Discussions 作为论坛。
贡献
贡献总是受欢迎。如果您感兴趣,请查看 CONTRIBUTING.md。
许可
本项目许可方式为以下之一
- Apache License,版本 2.0(见 LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0),以及
- MIT 许可(见 LICENSE-MIT 或 http://opensource.org/licenses/MIT)
任选其一。
SPDX-许可-标识符:Apache-2.0 或 MIT
依赖项
~14–27MB
~313K SLoC