#openstreetmap #csv #routing #convert #pbf #format #file

bin+lib osm4routing

Convert OpenStreetMap data into routing friendly CSV

17 unstable releases (5 breaking)

0.6.1 Jan 30, 2024
0.5.9 Dec 1, 2023
0.5.8 Jun 28, 2023
0.4.0 Mar 31, 2022
0.2.0 Oct 20, 2016

#34 in Geospatial

Download history 72/week @ 2023-12-22 113/week @ 2023-12-29 139/week @ 2024-01-05 151/week @ 2024-01-12 174/week @ 2024-01-19 226/week @ 2024-01-26 152/week @ 2024-02-02 94/week @ 2024-02-09 321/week @ 2024-02-16 154/week @ 2024-02-23 98/week @ 2024-03-01 76/week @ 2024-03-08 55/week @ 2024-03-15 69/week @ 2024-03-22 314/week @ 2024-03-29 198/week @ 2024-04-05

650 downloads per month
Used in roads-from-nd

MIT license

39KB
912 lines

osm4routing2

This project is a rewrite in rust from https://github.com/Tristramg/osm4routing

It converts an OpenStreetMap file (in the .pbf format) into a CSV file.

Build

Get a rust distribution with cargo: https://www.rust-lang.org/en-US/downloads.html

Run cargo install osm4routing

You can now use osm4routing <some_osmfile.pbf> to generate the nodes.csv and edges.csv that represent the road network.

If you prefer running the application from the sources, and not installing it, you run

cargo run --release -- <path_to_your_osmfile.pbf>

The identifiers for nodes and edges are from OpenStreetMap.

The id property of an edge is unique, while the osm_id can be duplicated.

Importing in a database

If you prefer having the files in database, you can run the very basic import_postgres.sh script.

It supposes that a database osm4routing exists (otherwise modify it to your needs).

Using as a library

In order to use osm4routing as a library, add osm4routing = "*" in your Cargo.toml file in the [dependencies] section.

Use it:

let (nodes, edges) = osm4routing::read("some_data.osm.pbf")?;

If you wand to reject certain edges based on their tag, use the Reader (it also accepts "*" to reject every value):

let (nodes, edges) = osm4routing::Reader::new().reject("area", "yes").read("some_data.osm.pbf")?;

If you want only specific tags, use required; it accepts "*" if any value is accepted; if multiple conditions are given, it will accept any way that matches at least one of the values.

let (nodes, edges) = osm4routing::Reader::new().require("railway", "rail").read("some_data.osm.pbf")?;

If you need to read some tags, pass them to the reader:

let (nodes, edges) = osm4routing::Reader::new().read_tag("highway").read("some_data.osm.pbf")?;

If want to contract edges that come from different OpenStreetMap ways, but where there is no intersection (that can happen when the tags change, e.g. a tunnel):

let (nodes, edges) = osm4routing::Reader::new().merge_ways().read("some_data.osm.pbf")?;

Dependencies

~6.5MB
~111K SLoC