a2a485834 Update CHANGELOG 82f95612e Merge pull request #180 from mapbox/lightmare-move-out c0e7ac6fd Merge pull request #181 from lightmare/revive-result-type d13e61784 Revert "visitor - revive using explicit return type when provided" 0ebf09dea revive using visitor::result_type when available b1076bbee visitor - revive using explicit return type when provided 2e3947578 properly forward through variant::visit b09c7e121 travis: force compiling all tests 0ce49d837 add test case for issue #180 discovered by @artemp 8fc03c4d9 Remove clang 3.7 and gcc47 builds f6e57e9c2 Merge branch 'move-out' of https://github.com/lightmare/variant into lightmare-move-out 94c8ccf54 fix expected compilation error messages 6d21f7704 perfect forwarding in apply_visitor d960916fc implement match on rvalue 8b9eeb238 test matching unwrapped rvalue with lambda expression 77a24b9c0 Merge remote-tracking branch 'upstream/move-out' into move-out 4ce01e1c2 clang - self-assignment is a compile time error c94634bbd Merge pull request #172 from mapbox/self-assignment 3dcac646f updated move assignment as suggested in https://github.com/mapbox/variant/pull/172#discussion_r328043024 b36c78e12 Just use `assert(this!=&other)` in move assignment operator (https://stackoverflow.com/questions/9322174/move-assignment-operator-and-if-this-rhs) 767bc18f3 Improve self-assignment/move checks to have one return path. 94fc9377e Revert "disable -Wself-assign-overloaded (-Werror) in self-assignment test" da2b171b7 Revert "don't fail old compilers" 7918a4847 don't fail old compilers ad85832b8 disable -Wself-assign-overloaded (-Werror) in self-assignment test 4da455725 add self-assignment checks in copy and move assignment operator= (ref #164) cb02ad487 update CHANGELOG for variant v1.1.6 release [skip ci] a4f87dc69 fix version number ff14f222a update CHANGELOG 0305fdb2a Merge pull request #171 from mapbox/jrex-mute-clang-analyzer 2fef61f08 Moved to in-class initialization 52df2765e update CHANGELOG in preparation for v1.1.6 release 63854e5c9 Add explicit initialization of data to mute clang static analyzer warnings in Xcode (10.2). 0f734f01e Merge pull request #167 from mapbox/clang++4 5a5ecca5b Run ASAN builda in isolated VM via `sudo : required` c1a14e7d9 update mason + update clang++ to 4.0.1 fe0a0666f update mason 11a36a9f1 steady .. downgrade clang++ to 4.0.0 f31bcfb4b try fixing travis via upgrading clang++ from 3.9.1 -> 4.0.1 502e32b8b fix Makefile a64062576 use `ls -lah` as `du -h --apparent-size` is not universally supported. ef3856c85 report actual file size not allocated size. 256ddd555 Merge pull request #160 from mlogan/master 9c81bef8c Fix the noexcept specifications for move assignment and conversion. 5eee328d6 Merge pull request #165 from nick70/master 0888a8e92 Fix README.md issues 859a8c933 Merge pull request #163 from MaxRis/master 215d64585 Removes deprecated static_visitor to avoid msvc C4996 compiler warning 237f83cad Merge pull request #162 from mapbox/variant_alternative 835ebc193 add `variant_size` helper 30560e19e fix preprocessor logic 8b1de3147 add compile index in range check for __type_pack_element branch. ae1931413 add optimized 'variant_alternative' implementation usinh built-in `__type_pack_element` when available (clang++) 3ffef950b add `variant_alternative_t` 3449d00cf alternative implementation of `variant_alternative` 4b98c485c add lost test check + remove stderr 43357808c add intial `variant_alternative` implementation (#161 http://en.cppreference.com/w/cpp/utility/variant/variant_alternative) ba3085a5e use full sha1 75bb549d2 update CHANGELOG (git log <tag1>...<tag2> --pretty=format:'* %s [view commit](http://github.com/mapbox/variant/commit/%H)' --reverse) 6497bce68 add <sha1> to CHANGELOG entries. 555436f71 add CHANGELOG.md skeleton b78b51548 Merge pull request #154 from ricardocosme/forwarding_reference_make_visitor f0b50062b Add copy assignment and move assignment operators. 9f991da78 Use forwarding reference in make_visitor and visitor 266f68d9f Merge pull request #153 from ricardocosme/boost-build 04a6797a6 - Add auxiliar rule exe-test. bd0a2d559 - Use of the module 'os' to get BOOST_DIR. - Add macro SINGLE_THREADED to single threading mode. - Define single threading mode as default. - Add lambda_overload_test and hashable_test. 561a09dd0 - Remove the use of boost libraries. - Add default build. b2471ffc7 - Add a project mapbox_variant. - Use of the 'os' module to capture CXX_STD. - Common configs moved to project. - Built targets moved to 'out' directory. 624720759 add test for ref #147 + https://github.com/mapbox/variant/pull/147 e01b7bf33 Merge branch 'BlueSolei-master' 195367cfc Merge branch 'master' of https://github.com/BlueSolei/variant into BlueSolei-master ea106db54 recursive_wrapper test - avoid constructing new functor in recursive calls, call itself via `this` pointer. 7a541ba10 recursive_wrapper fail to compile when used with 2 classes which are base and derived #146 291121f6a Merge pull request #144 from narizhny/Casts 51fccd755 Add static_variant_cast, dynamic_variant_cast 550ac2f15 Merge pull request #143 from tomhughes/catch a064940e2 REQUIRE_THROWS etc take an expression not a block f9c265d7e Update bundled Catch to v1.9.0 5778eede1 Fixes example: rvalue variant matching cdb9faf0f Simplifies result_of_* and let them handle rvalue refs c5dac859a Failing Test Case: std::move-ing out of variant 916139a2e Merge pull request #141 from mapbox/match-otherwise 3d807d316 Merge pull request #138 from mapbox/sizeof 9ac8978f5 Adds a test for polymorphic lambdas in match, resolves #140 c839c666c add missing <limits> 35487cd39 Make `type_index_t` configurable at compile time via `MAPBOX_VARIANT_MINIMIZE_SIZE` and `MAPBOX_VARIANT_OPTIMIZE_FOR_SPEED`. Default is `unsigned int`. (ref #138) 3f6fd131e Add compile time check to disallow array types as alternatives. fa8e124a2 Ensure internal index type is capable of holding all alternatives (ref #138) 05ee9aca1 use `mapbox::util::type_index_t` (#19) 9eec1fd48 make type used for `type_index` configurable via `type_index_t` typdef + use `unsigned int` by default. This addresses `sizeof` discrepancies between boost/std/mapbox variants (ref #19) d2588a8f1 Trivial missing comma in README example code 05b7612aa Merge pull request #135 from mapbox/llvm-3.9.1 61f8acea1 upgrade mason f5fb4661e upgrade to llvm 3.9.1 5baa948fa fix gyp build 4923eb527 osx: test that will support both latest (10.12) and oldest with c++11 support: 10.7 18a8055fe Merge pull request #134 from lightmare/warnings 5141d8d21 remove useless and/or dubious compiler flags a9707c3de Merge pull request #133 from mapbox/Werror a80beaafc disable -Wparentheses for older gcc c8ec829ff drop -Wstack-protector which gives unhelpful warnings 7b409402c upgrade libstdc++ for coverage build b43398619 Add -pthread 904dcaee6 limit some flags to clang++ 1023f2d9a try without pthreads 886377de0 fortification flags + -pthreads for linux where needed cf9a53499 build in both release and debug on travis 539d71274 fix conversion warnings 253047f53 enable -Werror, suppress warnings from non variant headers using isystem 18919174d Merge pull request #132 from lightmare/avoid-tuple-instantiation 4febf973c avoid expensive instantiation of tuple constructor in noexcept 6317a0b74 re-enable older compilers, trim excess 4fe5ced5d more sanitizer options d1bb6e546 -fsanitize=cfi and -fsanitize=safe-stack 20d693ed9 fix LDFLAGS 9b2de4546 test with clang++ sanitizers and flto 702826365 disable clang++ 3.9, will work on getting working in a branch e07a533a8 fix clang++ PATH 84eeb54c9 test clang++ via mason a760cea8d upgrade mason b9c58d631 upgrade boost to 1.62.0 c81b475b4 makefile improvements ce2eea644 travis: fix addons efa75df27 test with clang 3.9 and g++-6 cb5635ba2 add package.json for publishing to npm 02bd1ac4c Merge pull request #129 from daniel-j-h/docs ed84def12 Merge pull request #128 from daniel-j-h/match 3c17c37ae Merge pull request #126 from daniel-j-h/hashable d0266436b Adds Documentation for Readme, resolves #98 720c23736 Implements Pattern Matching for Sum Types via `.match` Member Function. 97d0379f0 Makes variant<Ts...> hashable iff Ts... are hashable, closes #125 9a115c5eb Merge branch 'daniel-j-h-lambda-visitor' 4d462f27b Adds C++14 SFINAE Test 2275a6197 Removes ::type Usage d09188640 Provides Convenient Lambda Overload Visitor Interface, resolves #113. a5a79a594 Fix #122 by adding an extra compile check in universal ctor (via @lightmare) + test case 9b46167f5 nicer stderr 84a426a31 Merge pull request #120 from mapbox/types 173a74579 add `struct adapted_variant_tag;` e5818212a expose `using types = std::tuple<Types...>;` - useful for adapting variant to `boost::spirit` (QI,Karma,X3) aaddee927 Update README 8e2f69641 Merge pull request #116 from lightmare/disjunction 2c7ddecdb use C++17 disjunction for no-references and one-convertible tests 388376ac9 Merge pull request #114 from mapbox/strict-conversions 075d9636f comment out code 8be6a2aa8 update tests 71ac8fdf9 Re-implement type matching logic to reject ambigious conversions c511b2f34 add test for b3a002d185afac295486e2ebd6b84c78a2267ba0 (ref #112) b3a002d18 fix value_traits to be able to match T, T& and T const& to the direct type stored in variant (ref #112) b5728ad76 update .mason pkgs eedafd31f use local HAS_EXCEPTIONS #define (__EXCEPTIONS is g++/clang specific macro) 372d7c88f c++ apply formatting 20e44accb Merge pull request #110 from mapbox/110-get_unchecked 37acc5a7c uncomment tests ref #82 adf0e02bc variant - yield return type of mapbox::util::get<T> automatically and make interface consistent (addresses #82) bb8c2d203 Merge branch '111-which-constexpr' dca3d967c Merge branch 'master' into 111-which-constexpr 74ce146d9 add static which<T>() function to get a contained types' which value 48d60445c remove unused internal metafunctions 434dab048 Add get_unchecked<T>() to enable use with exceptions disabled 2f8a4a381 Merge pull request #109 from mapbox/darwin-build-flags 33e27ec4c Update README.md 55579f03f Fix building with GCC (g++-5.2.0) on OS X (Darwin) (ref #108) 8bdad6b6d Update README.md 7f7470fee Jamroot - add missing include directory ./test/include for auto_cpu_timer.hpp 4368d7529 remove expected error string - current implementation emits compiler specific error message e.g c6ae1ea0a `is<T>()` - add specialisation for recursive_wrapper<T> + update tests (ref #102) 04dc3a46b Install boost with mason; eliminate boost::timer dependency 9b2fc858c Remove Xcode 6 from CI matrix 1bc46e525 Merge pull request #101 from mapbox/include 390229a59 fix compilation bfe0f19dd update remaining `<variant.hpp>` to `<mapbox/variant.hpp>` 343831611 ammend include dir a606e9024 fix typo 9bd902536 Merge branch 'master' into include 7e4a01189 Add include directory 13c631a62 Update README.md f00b24bf6 move headers into include/mapbox folder - closes #99 35ca16c74 issue warning `-Wweak-vtables` so this issue is not forgotten (https://github.com/mapbox/variant/issues/95) 82bb901b6 run coverage with clang 3.5 - fix clang 3.8 build 5f6ed7149 remove invalid option for llvm-cov f034d5571 fix clang 3.8 compile, try 3.9 b0ee4729b fix coverage to avoid warning: unit.gcno:version '402*', prefer '406*' 3f025adbf remove erroneous `;` ref #96 git-subtree-dir: third_party/variant git-subtree-split: a2a4858345423a760eca300ec42acad1ad123aa3
8.4 KiB
Open Source Routing Machine
High performance routing engine written in C++ 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 or distances 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 the OSM wiki on routing or this guide about mapping for navigation.
Related Project-OSRM repositories:
- osrm-frontend - User-facing frontend with map. The demo server runs this on top of the backend
- osrm-text-instructions - Text instructions from OSRM route response
- osrm-backend-docker - Ready to use Docker images
Documentation
Full documentation
Contact
- Discord: join
- 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 Debian and make sure they are as lightweight as possible. Older backend versions can be found on Docker Hub.
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" ghcr.io/project-osrm/osrm-backend osrm-extract -p /opt/car.lua /data/berlin-latest.osm.pbf || echo "osrm-extract failed"
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.
docker run -t -v "${PWD}:/data" ghcr.io/project-osrm/osrm-backend osrm-partition /data/berlin-latest.osrm || echo "osrm-partition failed"
docker run -t -v "${PWD}:/data" ghcr.io/project-osrm/osrm-backend osrm-customize /data/berlin-latest.osrm || echo "osrm-customize failed"
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).
docker run -t -i -p 5000:5000 -v "${PWD}:/data" ghcr.io/project-osrm/osrm-backend osrm-routed --algorithm mld /data/berlin-latest.osrm
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'
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 in the Container Registry:
| 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 22.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.26) 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++-9-dev
You can install the Node.js bindings via npm install @project-osrm/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.
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
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
@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},
}