32 个版本
0.3.4 | 2024年7月17日 |
---|---|
0.3.3 | 2023年12月16日 |
0.3.2 | 2023年10月10日 |
0.3.1 | 2023年7月21日 |
0.1.4 | 2017年11月28日 |
#166 在 解析器实现 中
每月680 次下载
在 8 crates 中使用
105KB
2K SLoC
osmpbf
一个用于读取OpenStreetMap PBF文件格式 (*.osm.pbf) 的Rust库。它旨在通过并行化和懒加载解码以及简单的接口提供最佳性能,同时公开PBF文件中每个级别的迭代器。
使用方法
将其添加到您的 Cargo.toml
[dependencies]
osmpbf = "0.3"
以下是一个简单示例,用于计算文件中的所有方式
use osmpbf::{ElementReader, Element};
let reader = ElementReader::from_path("tests/test.osm.pbf")?;
let mut ways = 0_u64;
// Increment the counter by one for each way.
reader.for_each(|element| {
if let Element::Way(_) = element {
ways += 1;
}
})?;
println!("Number of ways: {ways}");
在第二个示例中,我们同样计算方式,但通过并行解码文件来利用所有核心
use osmpbf::{ElementReader, Element};
let reader = ElementReader::from_path("tests/test.osm.pbf")?;
// Count the ways
let ways = reader.par_map_reduce(
|element| {
match element {
Element::Way(_) => 1,
_ => 0,
}
},
|| 0_u64, // Zero is the identity value for addition
|a, b| a + b // Sum the partial results
)?;
println!("Number of ways: {ways}");
构建功能
rust-zlib
(默认) -- 使用纯Rust的zlib实现miniz_oxide
zlib
-- 使用广泛可用的zlib
库zlib-ng
-- 使用zlib-ng
库以获得更好的性能。
PBF格式
为了有效地使用此库的更多底层功能,了解PBF文件的结构非常有用。有关更详细的格式描述,请参阅此处或查看此存储库中的.proto
文件。
PBF格式的层次结构(方括号[]
表示数组)
Blob[]
├── HeaderBlock
└── PrimitiveBlock
└── PrimitiveGroup[]
├── Node[]
├── DenseNodes
├── Way[]
└── Relation[]
在最高级别,PBF文件由一系列blob组成。每个Blob
可以解码为HeaderBlock
或PrimitiveBlock
。
遍历blob非常快,但解码可能涉及更昂贵的解压缩步骤。因此,对于较大的文件,建议在blob级别并行化,因为每个blob可以独立解压缩。(请参阅此库中的reader
模块以获取并行方法)
通常,文件的第一个Blob
解码为HeaderBlock
,它包含所有后续PrimitiveBlocks
的全局信息,例如所需的解析器功能列表。
一个 PrimitiveBlock
包含一个 PrimitiveGroup
数组。每个 PrimitiveGroup
只包含一种元素类型:Node
、Way
、Relation
或 DenseNodes
。一个 DenseNodes
项目是 Node
数组的替代和空间节省表示。因此,在聚合文件中的所有节点时,不要忘记检查 DenseNodes
。
元素使用整数 ID 互相引用。相应的元素可以存储在任何 blob 中,因此查找它们可能需要遍历整个文件。一些文件在 HeaderBlock
中声明了可选功能 "Sort.Type_then_ID",以指示元素按类型排序,然后按 ID 存储。这可以大大减少搜索空间。
许可证
此项目许可以下之一
- Apache License, Version 2.0, (LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT 许可证 (LICENSE-MIT 或 https://open-source.org.cn/licenses/MIT)
由您选择。
依赖关系
~3.5–6MB
~107K SLoC