Route on Overture Maps data with the unmodified OSRM
toolchain. One Rust CLI converts an Overture extract into an OSM PBF; osrm-extract
and the stock car.lua take it from there. No Docker and no intermediate database needed.
It uses Overture's road segments and the infrastructure theme and performs pretty well against OSM. Tested for a few spots in Western Europe where Overture is usually just slightly slower than OSM data (<1%).
Some caveats apply: no ferries nor trains yet and be aware of temporary speed limits or access restrictions etc. See the report.md file for the creation process and other nits.
uvx --from overturemaps overturemaps download \
--bbox 8.44,47.32,8.63,47.44 -f geoparquet -t segment -o zurich_segments.parquet
uvx --from overturemaps overturemaps download \
--bbox 8.44,47.32,8.63,47.44 -f geoparquet -t infrastructure -o zurich_infra.parquet
cargo build --release --manifest-path overture2osrm/Cargo.toml
./overture2osrm/target/release/overture2osrm build zurich_segments.parquet \
--infrastructure zurich_infra.parquet -o zurich.osm.pbf
osrm-routed --algorithm mld -p 5001 zurich.osrm
curl 'localhost:5001/route/v1/driving/8.5402,47.3779;8.5622,47.4502?overview=false'
All of Switzerland (2.85 M segments → 30.2 M nodes), against an OpenStreetMap graph built from the same area with the same OSRM version and profile:
| conversion, GeoParquet → PBF | 1.43 s — less than osmium cat needs to copy the file it wrote |
| ready to route (+ OSRM preprocessing) | 43 s |
| distance vs OSM, 400 city pairs | median 1.0000, 80 % within 1 % |
| duration vs OSM | median 1.0124 city, 0.9989 intercity |
| determinism | byte-identical across runs and thread counts |
Overture's rules are translated into the vocabulary the stock profiles already read:
oneways from heading-scoped access denials, turn restrictions from
prohibited_transitions (via-node and via-way), height/weight limits from
dimension-scoped denials, and traffic signals, stop lines and barriers from the
separate infrastructure theme — matched to the graph by coordinate, since Overture
publishes no key between the two.
overture2osrm/ |
the CLI — install, flags, benchmarks, schema mapping, limitations |
report.md |
the full write-up: schema archaeology, design decisions, validation, the bug it caught, and how the obstacle matching was verified |
frontend/ |
local web UI over the same pipeline: draw a bbox, watch each step run, click two points, compare against OSM, switch between fastest and shortest |
bench/ |
the scripts behind every measured claim: routing comparison, obstacle matching, census, and a pyarrow baseline |
- Rust 1.85+ (
cargo build --release) — the floor comes from the dependency tree (arrow/parquet 1.84, clap 1.85) - OSRM:
brew install osrm-backend,apt install osrm-backend, or the official Docker image — any recent build works, nothing is patched uvfor the data download and the frontend (both use inline script metadata, so there is no environment to manage)osmium-tool, optional, for validating output
Overture's transportation and infrastructure themes are derived from OpenStreetMap
and carry ODbL obligations: anything
you publish from a converted graph needs the same attribution and share-alike terms
as OSM-derived data. This repository's code is licensed separately (see LICENSE);
the data it processes is not covered by it.