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 |
|
#63 in 地理空间
56 每月下载量
8.5MB
8K SLoC
osm-io
本包提供用于操作 Open Street Map 数据的工具。
基本的 OSM 数据模型由 OSM XML 广泛定义,节点和方式对象定义几何形状,关系和标签对象提供非结构化扩展机制。由于 OSM 数据的用途不同,出现了各种 数据格式 来存储和传输它。我们在这里的主要关注点是以下格式
- apidb - 支持网站的数据库模式
- *.osm.pbf - 一种非常有效的数据格式,用于传输 OSM 数据,可以从 http://download.geofabrik.de/ 或从 https://planet.openstreetmap.org/pbf/ 下载。
当前的目标是能够将大型 *.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