This crate provides tools used to manipulate the Open Street Map data.
The basic OSM data model is broadly defined by OSM XML with Node and Way objects defining geometry and Relation and Tag objects providing unstructured extension mechanisms. Due to different uses of the OSM data, variety of data formats emerged to store and transmit it. Our main focus here are the following formats: * apidb - database schema backing OSM website * *.osm.pbf - a very efficient data format used to transmit OSM data that can be downloaded from http://download.geofabrik.de/ or from https://planet.openstreetmap.org/pbf/.
The goal at this stage is to be able to load large *.osm.pbf files, such as planet.osm.pbf into a Postgresql OSM database (apidb schema) and to dump an entire Postgres OSM database into a planet.osm.pbf file. See osm-admin
Because the data sets are very large, a special attention is given to maintaining control over memory size and utilizing multiple CPU cores whenever is possible.
Issues are welcome and appreciated. Please submit to https://github.com/navigatorsguild/osm-io/issues
Example for filtering out nodes from *.osm.pbf extract ```rust use std::path::PathBuf;
use anyhow; use benchmarkrs::stopwatch::StopWatch; use simplelogger::SimpleLogger;
use osmio::osm::model::element::Element; use osmio::osm::pbf; use osmio::osm::pbf::compressiontype::CompressionType; use osmio::osm::pbf::fileinfo::FileInfo;
pub fn main() -> Result<(), anyhow::Error> { SimpleLogger::new().init()?; log::info!("Started pbf io pipeline"); let mut stopwatch = StopWatch::new(); stopwatch.start(); let inputpath = PathBuf::from("./tests/fixtures/niue-230109.osm.pbf"); let outputpath = PathBuf::from("./target/results/niue-230109.osm.pbf"); let reader = pbf::reader::Reader::new(&inputpath)?; let mut fileinfo = FileInfo::default(); fileinfo.withwritingprogramstr("pbf-io-example"); let mut writer = pbf::writer::Writer::fromfileinfo( outputpath, 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(())
} ```
License: MIT OR Apache-2.0