10 个版本

0.1.4 2024 年 4 月 14 日
0.1.3 2024 年 3 月 15 日
0.1.1 2024 年 2 月 27 日
0.1.0 2023 年 7 月 21 日
0.0.2-alpha 2023 年 6 月 18 日

#63 in 地理空间

Download history 8/week @ 2024-04-19 6/week @ 2024-04-26 1/week @ 2024-05-03 5/week @ 2024-05-17 2/week @ 2024-05-24 4/week @ 2024-05-31 2/week @ 2024-06-07 3/week @ 2024-06-14 1/week @ 2024-06-21 3/week @ 2024-06-28 22/week @ 2024-07-05 49/week @ 2024-07-26 7/week @ 2024-08-02

56 每月下载量

MIT/Apache

8.5MB
8K SLoC

Rust 6.5K SLoC // 0.0% comments SQL 1K SLoC // 0.5% comments

osm-io

本包提供用于操作 Open Street Map 数据的工具。

基本的 OSM 数据模型由 OSM XML 广泛定义,节点和方式对象定义几何形状,关系和标签对象提供非结构化扩展机制。由于 OSM 数据的用途不同,出现了各种 数据格式 来存储和传输它。我们在这里的主要关注点是以下格式

当前的目标是能够将大型 *.osm.pbf 文件(如 planet.osm.pbf)加载到 Postgresql OSM 数据库(apidb 模式)中,并将整个 Postgres OSM 数据库导出到 planet.osm.pbf 文件中。参见 osm-admin

由于数据集非常大,特别关注控制内存大小和在可能的情况下利用多个 CPU 内核。

路线图

  • 实现 *.osm.pbf 读取器和写入器 - 完成
  • 实现 *.osm.pbf 并行读取器和并行写入器 - 完成
  • 实现 apidb 读取器和写入器 - 完成
  • 提供基本过滤(见以下示例) - 完成
  • 在 *.osm.pbf 和 apidb 之间以及相反转换 - 完成,见示例。
  • S2 索引 - 使用 S2 单元索引整个 OSM 数据集以进行进一步处理
  • 上下文索引 - 通过对象之间的关系索引整个OSM数据集。例如,可以有效地丢弃属于已删除路线的所有节点。

问题

欢迎并感谢提出问题。请提交至 https://github.com/navigatorsguild/osm-io/issues

示例

从 *.osm.pbf 提取中过滤节点的示例

use std::path::PathBuf;

use anyhow;
use benchmark_rs::stopwatch::StopWatch;
use simple_logger::SimpleLogger;

use osm_io::osm::model::element::Element;
use osm_io::osm::pbf;
use osm_io::osm::pbf::compression_type::CompressionType;
use osm_io::osm::pbf::file_info::FileInfo;

pub fn main() -> Result<(), anyhow::Error> {
    SimpleLogger::new().init()?;
    log::info!("Started pbf io pipeline");
    let mut stopwatch = StopWatch::new();
    stopwatch.start();
    let input_path = PathBuf::from("./tests/fixtures/niue-230109.osm.pbf");
    let output_path = PathBuf::from("./target/results/niue-230109.osm.pbf");
    let reader = pbf::reader::Reader::new(&input_path)?;
    let mut file_info = FileInfo::default();
    file_info.with_writingprogram_str("pbf-io-example");
    let mut writer = pbf::writer::Writer::from_file_info(
        output_path,
        file_info,
        CompressionType::Zlib,
    )?;

    writer.write_header()?;

    for element in reader.elements()? {
        let mut filter_out = false;
        match &element {
            Element::Node { node } => {
                for tag in node.tags() {
                    if tag.k() == "natural" && tag.v() == "tree" {
                        filter_out = true;
                        break;
                    }
                }
            }
            Element::Way { way: _ } => {}
            Element::Relation { relation: _ } => {}
            Element::Sentinel => {
                filter_out = true;
            }
        }
        if !filter_out {
            writer.write_element(element)?;
        }
    }

    writer.close()?;

    log::info!("Finished pbf io pipeline, time: {}", stopwatch);
    Ok(())
}

类似软件

  • libosmium - 非常快且非常成熟的Python包装器。
  • osmosis - 大多数功能(如果不是所有功能)的参考实现。
  • osmpbf - 使用Rust编写的非常高效的 *.osm.pbf 读取器。

许可:MIT OR Apache-2.0

依赖项

~14–29MB
~433K SLoC