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解析器实现

Download history • Rust 包仓库 97/week @ 2024-05-02 • Rust 包仓库 55/week @ 2024-05-09 • Rust 包仓库 95/week @ 2024-05-16 • Rust 包仓库 144/week @ 2024-05-23 • Rust 包仓库 107/week @ 2024-05-30 • Rust 包仓库 80/week @ 2024-06-06 • Rust 包仓库 125/week @ 2024-06-13 • Rust 包仓库 205/week @ 2024-06-20 • Rust 包仓库 114/week @ 2024-06-27 • Rust 包仓库 80/week @ 2024-07-04 • Rust 包仓库 233/week @ 2024-07-11 • Rust 包仓库 156/week @ 2024-07-18 • Rust 包仓库 258/week @ 2024-07-25 • Rust 包仓库 166/week @ 2024-08-01 • Rust 包仓库 144/week @ 2024-08-08 • Rust 包仓库 94/week @ 2024-08-15 • Rust 包仓库

每月680 次下载
8 crates 中使用

MIT/Apache

105KB
2K SLoC

osmpbf

一个用于读取OpenStreetMap PBF文件格式 (*.osm.pbf) 的Rust库。它旨在通过并行化和懒加载解码以及简单的接口提供最佳性能,同时公开PBF文件中每个级别的迭代器。

Build status Build status Crates.io Documentation

使用方法

将其添加到您的 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可以解码为HeaderBlockPrimitiveBlock

遍历blob非常快,但解码可能涉及更昂贵的解压缩步骤。因此,对于较大的文件,建议在blob级别并行化,因为每个blob可以独立解压缩。(请参阅此库中的reader模块以获取并行方法)

通常,文件的第一个Blob解码为HeaderBlock,它包含所有后续PrimitiveBlocks的全局信息,例如所需的解析器功能列表。

一个 PrimitiveBlock 包含一个 PrimitiveGroup 数组。每个 PrimitiveGroup 只包含一种元素类型:NodeWayRelationDenseNodes。一个 DenseNodes 项目是 Node 数组的替代和空间节省表示。因此,在聚合文件中的所有节点时,不要忘记检查 DenseNodes

元素使用整数 ID 互相引用。相应的元素可以存储在任何 blob 中,因此查找它们可能需要遍历整个文件。一些文件在 HeaderBlock 中声明了可选功能 "Sort.Type_then_ID",以指示元素按类型排序,然后按 ID 存储。这可以大大减少搜索空间。

许可证

此项目许可以下之一

由您选择。

依赖关系

~3.5–6MB
~107K SLoC