2017-01-02 09:41:15 -05:00
## Open Source Routing Machine
2013-07-31 07:04:04 -04:00
2022-10-26 05:22:28 -04:00
[](https://github.com/Project-OSRM/osrm-backend/actions/workflows/osrm-backend.yml) [](https://codecov.io/gh/Project-OSRM/osrm-backend) [](https://discord.gg/es9CdcCXcb)
2013-07-31 07:04:04 -04:00
2022-11-06 09:20:47 -05:00
High performance routing engine written in C++ designed to run on OpenStreetMap data.
2015-05-01 19:30:44 -04:00
2017-01-02 09:41:15 -05:00
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
2018-04-20 18:18:55 -04:00
- Table - Computes the duration or distances of the fastest route between all pairs of supplied coordinates
2017-01-02 09:41:15 -05:00
- 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
2015-05-01 19:30:44 -04:00
2017-01-02 09:41:15 -05:00
To quickly try OSRM use our [demo server ](http://map.project-osrm.org ) which comes with both the backend and a frontend on top.
2016-07-28 05:01:51 -04:00
2017-06-30 06:16:49 -04:00
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 ](https://www.mapbox.com/mapping/mapping-for-navigation/ ).
2017-01-02 09:41:15 -05:00
Related [Project-OSRM ](https://github.com/Project-OSRM ) repositories:
- [osrm-frontend ](https://github.com/Project-OSRM/osrm-frontend ) - User-facing frontend with map. The demo server runs this on top of the backend
- [osrm-text-instructions ](https://github.com/Project-OSRM/osrm-text-instructions ) - Text instructions from OSRM route response
2017-03-01 05:32:52 -05:00
- [osrm-backend-docker ](https://hub.docker.com/r/osrm/osrm-backend/ ) - Ready to use Docker images
## Documentation
### Full documentation
- [Hosted documentation ](http://project-osrm.org )
- [osrm-routed HTTP API documentation ](docs/http.md )
- [libosrm API documentation ](docs/libosrm.md )
2013-07-31 07:04:04 -04:00
2017-01-02 09:41:15 -05:00
## Contact
2013-07-31 07:04:04 -04:00
2023-02-10 09:28:34 -05:00
- Discord: [join ](https://discord.gg/es9CdcCXcb )
2017-01-02 09:41:15 -05:00
- IRC: `irc.oftc.net` , channel: `#osrm` ([Webchat](https://webchat.oftc.net))
- Mailinglist: `https://lists.openstreetmap.org/listinfo/osrm-talk`
2013-07-31 07:04:04 -04:00
2017-01-02 09:41:15 -05:00
## Quick Start
2015-05-02 09:18:13 -04:00
2017-04-06 08:35:57 -04:00
The easiest and quickest way to setup your own routing engine is to use Docker images we provide.
2017-03-01 05:32:52 -05:00
2017-10-12 05:16:32 -04:00
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.
2017-10-12 06:00:30 -04:00
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` .
2017-10-12 05:16:32 -04:00
2017-03-01 05:32:52 -05:00
### Using Docker
2022-10-02 14:55:59 -04:00
We base our Docker images ([backend](https://github.com/Project-OSRM/osrm-backend/pkgs/container/osrm-backend), [frontend ](https://hub.docker.com/r/osrm/osrm-frontend/ )) on Debian and make sure they are as lightweight as possible. Older backend versions can be found on [Docker Hub ](https://hub.docker.com/r/osrm/osrm-backend/ ).
2017-03-01 05:32:52 -05:00
2017-04-06 08:35:57 -04:00
Download OpenStreetMap extracts for example from [Geofabrik ](http://download.geofabrik.de/ )
2017-03-01 05:32:52 -05:00
2017-04-06 08:35:57 -04:00
wget http://download.geofabrik.de/europe/germany/berlin-latest.osm.pbf
2017-03-01 05:32:52 -05:00
2017-04-06 08:35:57 -04:00
Pre-process the extract with the car profile and start a routing engine HTTP server on port 5000
2023-01-29 03:56:02 -05:00
docker run -t -v "${PWD}:/data" ghcr.io/project-osrm/osrm-backend osrm-extract -p /opt/car.lua /data/berlin-latest.osm.pbf || "osrm-extract failed"
2018-01-16 11:16:36 -05:00
2019-02-15 18:47:05 -05:00
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 `"${PWD}/berlin-latest.osm.pbf"` on the host.
2018-01-16 11:16:36 -05:00
2023-01-29 03:56:02 -05:00
docker run -t -v "${PWD}:/data" ghcr.io/project-osrm/osrm-backend osrm-partition /data/berlin-latest.osrm || "osrm-partition failed"
docker run -t -v "${PWD}:/data" ghcr.io/project-osrm/osrm-backend osrm-customize /data/berlin-latest.osrm || "osrm-customize failed"
2017-04-06 08:35:57 -04:00
2022-10-02 14:55:59 -04:00
Note there is no `berlin-latest.osrm` file, but multiple `berlin-latest.osrm.*` files, i.e. `berlin-latest.osrm` is not file path, but "base" path referring to set of files and there is an option to omit this `.osrm` suffix completely(e.g. `osrm-partition /data/berlin-latest` ).
2018-01-16 11:16:36 -05:00
2022-10-10 12:54:01 -04:00
docker run -t -i -p 5000:5000 -v "${PWD}:/data" ghcr.io/project-osrm/osrm-backend osrm-routed --algorithm mld /data/berlin-latest.osrm
2017-04-06 08:35:57 -04:00
Make requests against the HTTP server
curl "http://127.0.0.1:5000/route/v1/driving/13.388860,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 'http://127.0.0.1:9966'
2017-03-01 05:32:52 -05:00
2017-03-27 04:02:27 -04:00
In case Docker complains about not being able to connect to the Docker daemon make sure you are in the `docker` group.
2017-04-06 08:35:57 -04:00
sudo usermod -aG docker $USER
2017-03-27 04:02:27 -04:00
After adding yourself to the `docker` group make sure to log out and back in again with your terminal.
2022-10-02 14:55:59 -04:00
We support the following images in the Container Registry:
2017-05-29 06:08:44 -04:00
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
2017-03-27 04:02:27 -04:00
2017-03-01 05:32:52 -05:00
### Building from Source
2022-10-02 14:55:59 -04:00
The following targets Ubuntu 22.04.
2017-01-02 09:41:15 -05:00
For instructions how to build on different distributions, macOS or Windows see our [Wiki ](https://github.com/Project-OSRM/osrm-backend/wiki ).
2016-04-29 07:00:27 -04:00
2017-03-01 05:32:52 -05:00
Install dependencies
2015-05-02 09:18:13 -04:00
2017-01-02 09:41:15 -05:00
```bash
sudo apt install build-essential git cmake pkg-config \
2017-10-12 05:18:17 -04:00
libbz2-dev libxml2-dev libzip-dev libboost-all-dev \
lua5.2 liblua5.2-dev libtbb-dev
2017-01-02 09:41:15 -05:00
```
2016-04-29 07:00:27 -04:00
2017-03-01 05:32:52 -05:00
Compile and install OSRM binaries
2016-04-29 07:00:27 -04:00
2017-01-02 09:41:15 -05:00
```bash
2016-04-29 07:00:27 -04:00
mkdir -p build
cd build
2017-01-02 09:41:15 -05:00
cmake ..
2016-04-29 07:00:27 -04:00
cmake --build .
sudo cmake --build . --target install
```
2017-03-01 05:32:52 -05:00
### Request Against the Demo Server
2017-01-02 09:41:15 -05:00
2018-01-05 09:19:33 -05:00
Read the [API usage policy ](https://github.com/Project-OSRM/osrm-backend/wiki/Demo-server ).
2017-01-02 09:41:15 -05:00
Simple query with instructions and alternatives on Berlin:
2016-04-29 07:00:27 -04:00
```
2017-06-30 09:41:44 -04:00
curl "https://router.project-osrm.org/route/v1/driving/13.388860,52.517037;13.385983,52.496891?steps=true& alternatives=true"
2016-04-29 07:00:27 -04:00
```
2017-06-21 13:22:38 -04:00
### Using the Node.js Bindings
The Node.js bindings provide read-only access to the routing engine.
We provide API documentation and examples [here ](docs/nodejs/api.md ).
2022-10-02 14:55:59 -04:00
You will need a modern `libstdc++` toolchain (`>= GLIBCXX_3.4.26`) for binary compatibility if you want to use the pre-built binaries.
2017-06-21 13:22:38 -04:00
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
2022-10-02 14:55:59 -04:00
sudo apt-get install -y libstdc++-9-dev
2017-06-21 13:22:38 -04:00
```
2022-10-06 16:05:51 -04:00
You can install the Node.js bindings via `npm install @project-osrm/osrm` or from this repository either via
2017-06-21 13:22:38 -04:00
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.
2022-10-06 16:05:51 -04:00
#### Unscoped packages
Prior to v5.27.0, the `osrm` Node package was unscoped. If you are upgrading from an old package, you will need to do the following:
```
npm uninstall osrm --save
npm install @project -osrm/osrm --save
```
#### Package docs
2022-10-02 14:55:59 -04:00
For usage details have a look [these API docs ](docs/nodejs/api.md ).
2017-09-25 08:18:01 -04:00
An exemplary implementation by a 3rd party with Docker and Node.js can be found [here ](https://github.com/door2door-io/osrm-express-server-demo ).
2017-06-21 13:22:38 -04:00
2013-07-31 07:09:25 -04:00
## References in publications
When using the code in a (scientific) publication, please cite
2013-07-31 07:12:25 -04:00
```
2013-07-31 07:09:25 -04:00
@inproceedings {luxen-vetter-2011,
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},
}
2013-07-31 07:12:25 -04:00
```