C++ Gherkin JavaScript Lua CMake Python Other
Switch branches/tags
Latest commit a9d94d3 Jan 22, 2018 @oxidase oxidase committed with TheMarex [skip ci] Bump OSRM version to 5.16
Failed to load latest commit information.
.github Add checkbox for changelogs to all PRs. Nov 27, 2017
cloudformation Fix publishing node binaries Mar 30, 2017
cmake Add use of LUA_LIBRARY_DIRS, #4646 Nov 1, 2017
data Add Macau and Hong Kong to the left-side driving polygon file. Nov 27, 2017
docker Reduce docker image size to about 20MB by using a multistage build. Nov 1, 2017
docs Move description to first row of table Jan 17, 2018
example Makes MLD default algorithm in example to avoid confusion, see #4702 Nov 27, 2017
features Ignore no_*_on_red turn restrictions (#4804) Jan 19, 2018
fuzz Enable data flow guided fuzzing using traces Aug 19, 2016
include Refactor `isThroughStreet`/Intersection options (#4751) Jan 19, 2018
lib Revert "Skip cucumber tests for publish builds" Apr 11, 2017
profiles add tunnel as a class in lua (#4812) Jan 19, 2018
scripts Don't fail if a registered printer has no name Jan 5, 2018
src Refactor `isThroughStreet`/Intersection options (#4751) Jan 19, 2018
test add tunnel as a class in lua (#4812) Jan 19, 2018
third_party error when mld files or data are missing, compability -> compatibility Oct 9, 2017
unit_tests Refactor `isThroughStreet`/Intersection options (#4751) Jan 19, 2018
.babelrc Adds babel transformation needed for node osrm docs Aug 3, 2017
.clang-format expose lanes as enums, adjusted for comments Jun 27, 2016
.clang-tidy Integration scripts for Clang's Modernize and Tidy tool. Sep 22, 2015
.cncc.style Add simple cncc file Jan 5, 2016
.dockerignore Reduce docker image size to about 20MB by using a multistage build. Nov 1, 2017
.eslintrc Rewrite cucumber test suite in JS Mar 24, 2016
.gitattributes [skip ci] Revert back gitattributes, was unrelated to OSX Jul 4, 2017
.gitignore Ignore build directories starting with _build Aug 8, 2017
.gitmodules Removing Docs submodule Dec 26, 2012
.npmignore Whitelists scripts/node_install.sh for from-source compilation, resolves Aug 28, 2017
.travis.yml Makes MLD default algorithm in example to avoid confusion, see #4702 Nov 27, 2017
CHANGELOG.md [skip ci] Bump OSRM version to 5.16 Jan 22, 2018
CMakeLists.txt [skip ci] Bump OSRM version to 5.16 Jan 22, 2018
CODE-OF-CONDUCT.md add code of conduct Oct 20, 2017
CONTRIBUTING.md Fix typos in profiles documentation Nov 27, 2017
Doxyfile.in Exclude new node_modules folder that might be around if test cases ha… Apr 5, 2016
LICENSE.TXT Update LICENSE to 2017 and fix typo in filename Oct 3, 2017
README.md Provide more detail on docker commands Jan 17, 2018
appveyor-build.bat Bump osrm-deps package version Sep 25, 2017
appveyor.yml fix appveyor fail Mar 21, 2017
build-local.bat Updated cmake version to 3.7.0-rc2 Oct 28, 2016
codecov.yml Enable coverage reports for unit_tests Mar 28, 2017
cucumber.js Allow single edge paths in MLD alternatives, #4691 Nov 21, 2017
package-lock.json Update package-lock and yarn.lock Oct 5, 2017
package.json [skip ci] Bump OSRM version to 5.16 Jan 22, 2018
taginfo.json Use default maxspeed value for ua:urban Jan 2, 2018
yarn.lock Update package-lock and yarn.lock Oct 5, 2017


Open Source Routing Machine

Linux / macOS Windows Code Coverage
Travis AppVeyor Codecov

High performance routing engine written in C++14 designed to run on OpenStreetMap data.

The following services are available via HTTP API, C++ library interface and NodeJs wrapper:

  • Nearest - Snaps coordinates to the street network and returns the nearest matches
  • Route - Finds the fastest route between coordinates
  • Table - Computes the duration of the fastest route between all pairs of supplied coordinates
  • Match - Snaps noisy GPS traces to the road network in the most plausible way
  • Trip - Solves the Traveling Salesman Problem using a greedy heuristic
  • Tile - Generates Mapbox Vector Tiles with internal routing metadata

To quickly try OSRM use our demo server which comes with both the backend and a frontend on top.

For a quick introduction about how the road network is represented in OpenStreetMap and how to map specific road network features have a look at this guide about mapping for navigation.

Related Project-OSRM repositories:


Full documentation


  • IRC: irc.oftc.net, channel: #osrm (Webchat)
  • Mailinglist: https://lists.openstreetmap.org/listinfo/osrm-talk

Quick Start

The easiest and quickest way to setup your own routing engine is to use Docker images we provide.

There are two pre-processing pipelines available:

  • Contraction Hierarchies (CH)
  • Multi-Level Dijkstra (MLD)

we recommend using MLD by default except for special use-cases such as very large distance matrices where CH is still a better fit for the time being. In the following we explain the MLD pipeline. If you want to use the CH pipeline instead replace osrm-partition and osrm-customize with a single osrm-contract and change the algorithm option for osrm-routed to --algorithm ch.

Using Docker

We base our Docker images (backend, frontend) on Alpine Linux and make sure they are as lightweight as possible.

Download OpenStreetMap extracts for example from Geofabrik

wget http://download.geofabrik.de/europe/germany/berlin-latest.osm.pbf

Pre-process the extract with the car profile and start a routing engine HTTP server on port 5000

docker run -t -v $(pwd):/data osrm/osrm-backend osrm-extract -p /opt/car.lua /data/berlin-latest.osm.pbf

The flag -v $(pwd):/data creates the directory /data inside the docker container, and makes the current working directory $(pwd) available there. The file /data/berlin-latest.osm.pbf inside the container is referring to berlin-latest.osm.pbf on the host.

docker run -t -v $(pwd):/data osrm/osrm-backend osrm-partition /data/berlin-latest.osrm
docker run -t -v $(pwd):/data osrm/osrm-backend osrm-customize /data/berlin-latest.osrm

Note that berlin-latest.osrm has a different file extension.

docker run -t -i -p 5000:5000 -v $(pwd):/data osrm/osrm-backend osrm-routed --algorithm mld /data/berlin-latest.osrm

Make requests against the HTTP server

curl ",52.517037;13.385983,52.496891?steps=true"

Optionally start a user-friendly frontend on port 9966, and open it up in your browser

docker run -p 9966:9966 osrm/osrm-frontend
xdg-open ''

In case Docker complains about not being able to connect to the Docker daemon make sure you are in the docker group.

sudo usermod -aG docker $USER

After adding yourself to the docker group make sure to log out and back in again with your terminal.

We support the following images on Docker Cloud:

Name Description
latest master compiled with release flag
latest-assertions master compiled with with release flag, assertions enabled and debug symbols
latest-debug master compiled with debug flag
<tag> specific tag compiled with release flag
<tag>-debug specific tag compiled with debug flag

Building from Source

The following targets Ubuntu 16.04. For instructions how to build on different distributions, macOS or Windows see our Wiki.

Install dependencies

sudo apt install build-essential git cmake pkg-config \
libbz2-dev libxml2-dev libzip-dev libboost-all-dev \
lua5.2 liblua5.2-dev libtbb-dev

Compile and install OSRM binaries

mkdir -p build
cd build
cmake ..
cmake --build .
sudo cmake --build . --target install

Request Against the Demo Server

Read the API usage policy.

Simple query with instructions and alternatives on Berlin:

curl "https://router.project-osrm.org/route/v1/driving/13.388860,52.517037;13.385983,52.496891?steps=true&alternatives=true"

Using the Node.js Bindings

The Node.js bindings provide read-only access to the routing engine. We provide API documentation and examples here.

You will need a modern libstdc++ toolchain (>= GLIBCXX_3.4.20) for binary compatibility if you want to use the pre-built binaries. For older Ubuntu systems you can upgrade your standard library for example with:

sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt-get update -y
sudo apt-get install -y libstdc++-5-dev

You can install the Node.js bindings via npm install osrm or from this repository either via

npm install

which will check and use pre-built binaries if they're available for this release and your Node version, or via

npm install --build-from-source

to always force building the Node.js bindings from source.

For usage details have a look these API docs.

An exemplary implementation by a 3rd party with Docker and Node.js can be found here.

References in publications

When using the code in a (scientific) publication, please cite

 author = {Luxen, Dennis and Vetter, Christian},
 title = {Real-time routing with OpenStreetMap data},
 booktitle = {Proceedings of the 19th ACM SIGSPATIAL International Conference on Advances in Geographic Information Systems},
 series = {GIS '11},
 year = {2011},
 isbn = {978-1-4503-1031-4},
 location = {Chicago, Illinois},
 pages = {513--516},
 numpages = {4},
 url = {http://doi.acm.org/10.1145/2093973.2094062},
 doi = {10.1145/2093973.2094062},
 acmid = {2094062},
 publisher = {ACM},
 address = {New York, NY, USA},