18个版本 (9个破坏性更新)
新版本 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.1.0 | 2020年6月7日 |
#9 在 科学
每月下载量:207
被 2 crate 使用
4.5MB
7K SLoC
grib-rs
GRIB格式解析器,适用于Rust
关于
这是一个用Rust编程语言编写的GRIB格式解析库。该项目旨在提供一套简单易用、高效且具有教育意义的库和工具。
GRIB是一种简洁的数据格式,常用于气象学中存储历史和预报天气数据。它旨在作为一组二维数据的记录集合的容器。GRIB文件很大且为二进制格式,应该高效地处理。此外,由于GRIB设计为支持使用外部代码表和模板中定义的参数的各种网格类型和数据压缩,因此一些流行的现有软件无法处理一些GRIB数据。
演示Web应用程序
使用crate的GRIB2查看器Web应用程序的演示版本可在此处获取。
加载后,应用程序完全在您的网络浏览器中运行,并且不会将您拖放的数据发送到任何地方。
愿景
一个每个人都可以轻松读取天气数据的世界,尽管其解释需要一些特定的知识和经验。
功能
- Rust库
grib
- 能够读取和检查GRIB2的基本结构
- 能够访问GRIB2消息内的数据
- 图层列表
- 大多数用户认为重要的每个图层的参数
- 构成图层和整个数据的底层部分
- 支持WMO定义的一些代码表
- 支持以下表中列出的模板的解码功能
- 支持以下表中列出的模板的网格点经纬度计算
- 基于Rust库构建的CLI应用程序
gribber
- 5个子命令
- completions:为您的shell生成补全
- decode:将数据导出为文本和平坦的二进制文件
- info:显示标识信息
- 检查:主要显示开发用途的信息,如模板编号
- 列表:显示内部每层的参数
- 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 | 带等级值的运行长度打包 |
计划功能
请查看ROADMAP以查看计划功能。
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, Version 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
依赖
~2.4–6MB
~88K SLoC