Giter VIP home page Giter VIP logo

osrm-frontend's Introduction

Open Source Routing Machine

osrm-backend CI Codecov Discord

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:

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},
}

osrm-frontend's People

Contributors

1ec5 avatar alexwyattdev avatar amyleew avatar contargo-development avatar daniel-j-h avatar danpat avatar danyeaw avatar datendelphin avatar deniscarriere avatar desdroid avatar farialima avatar freenerd avatar geohacker avatar hoerup avatar jjshoe avatar julienfr112 avatar lonvia avatar madmath03 avatar marcows avatar mikumi avatar mjjbell avatar mstock avatar pedab avatar perliedman avatar riiga avatar shuuji3 avatar stevage avatar themarex avatar ymoisan avatar yuryleb avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

osrm-frontend's Issues

Add styling for alternative route

Alt route is defined in route instructions but not clear on how to style an alt route line on the map in addition to main line styling.

alt-route

[feature] chosen map style should be persistant

The selected map style is not part of a created link. When using the link one always gets the default map style.

Similarly, when reloading the map due to changing languages the map style is reset to the default style.

Route Isn't Displayed with Local Clone

If I clone the project, opening index.html in Firefox shows the map as expected, but as soon as I select two points the route never shows up. It works properly on the demo server. Steps:
git clone -b gh-pages https://github.com/Project-OSRM/osrm-frontend-v2.git
cd osrm-frontend-v2
firefox index.html
Select two points, the pins display but that is all.

Also "npm install" completes successful on the master branch, but that doesn't seem to fix the routing.

Remember which alternative was selected

Currently the link will include the alternative that was chosen but will not select it automatically.

This is a little bit cumbersome to do. LRM needs to know which alternative should be selected
after the route is received. Since I currently only trigger the routing request indirectly by updating the waypoints in L.Routing.Plan I have no option to pass a parameter to the routing callback.

i18n: maintainability and reloads

The language dependent changes should be kept in separate files. This allows for much better maintainability and separated i18n from the rest of the code.

Also, changing the language requires a reload right now.

[display] Route polyline visibility

The visibility of the route is a little less than what it should be. This needs a little experimentation but a thicker line with a slightly lighter blue could look better.

Printing

Right now, it is not possible to print a route.

Main / alt routing click to select

Per chat w/ @lbud - For routes with alternative routes, let's add functionality to allow the user to select either main or alt route and then jump user to that section of the instructions.

image

Print pages with multiple vias shows only "B" way points

The current code has "A" ... "Via" ... "Via" ... "B". In the print version, one has "A" ... "B" ... "B" ... "B".
Expected: Same output.

Actually, I do not like the "A" ... "Via" ... "B" very much. I'd find "A" ... "B" ... "C" ... "D" ... much more natural. Additionaly the small "ia" in "Via" is very difficult to read - it looks more like "V" + some dirt at the bottom which blurs the V. I am not sure in how far it would break with the layout but using a normal bold sans-serif font and enumerating through (A, B, C, …) seems to me better than having the hard coded pixmaps. Additionally, the "V" = "Via" is also not really i18n-able.

Download GPX

Button should produce a .gpx file and start download, but it doesn't not seem to trigger action.

[map] auto zoom may hide route

depending on the location of origin and destination, parts of the route may be hidden by route guidance:

bildschirmfoto 2014-11-27 um 13 44 32

Ideally, the route is only in the unobstructed portion of the map.

Trigger for language and distance values

Language and distance button on toolbar doesn't seem to be "triggering" action. Button should allow user to change language between:

  • Germany / English
  • metric / imperial

Make A...V...B items draggable to re-order

Currently, going to the the enter location box on the left and hovering over the A, B or Via shows turns the mouse pointer to an pointing finger - but clicking doesn't have an effect.

What would be useful – and in line with other map services: make them draggable such that one can re-order them.

Or at least remove the pointing finger symbol when hovering with the mouse as one then expects that a feature is hidden behind it.

Issue with processing many subsequent JSON requests

There are timing issues when processing many subsequent JSON requests if some of the requests are still pending while others are being resolved.

How to reproduce:

  • generate a route
  • quickly drag one marker around the map
  • stop dragging but keep the mouse button clicked

Observation:

  • multiple routes to previous locations of the marker are drawn and deleted until the final route to the marker's current position is drawn

Expectation:

  • no intermediate routes are drawn

Possible Solution:

  • embed some counter in the json request (see frontend v1) and only process the json response with the current system counter

Related issue:
When releasing the mouse button in step three of the above example, unpredicted results may arise:

  • the marker may jump back to a previous location and this becomes the final route
  • the marker may stay at the current position but the final route is drawn to a previous location, effectively disconnecting marker and route.

Possible Solution:

  • after dragging is done, i.e. the marker released, issue another request to the server (which will be the route that will be drawn when using the possible solution for the above problem)

Same OSRM server, two different routes using v1 or v2

Look at this:

http://cycletour.org/?hl=en&loc=-37.755264,145.347467&loc=-37.753380,145.694833&z=12&center=-37.768544,145.470829

http://cycletour.org/v2/?hl=en&loc=-37.755264,145.347467&loc=-37.753380,145.694833&z=12&center=-37.768544,145.470829

These two front ends both use the same back end (osrm.cycletour.org:5010), yet return very different routes. Any idea why?

I see some slight differences in the generated URLs. v1 has this:

z:12
output:json
jsonp:OSRM.JSONP.callbacks.route
loc:-37.755218,145.347633
loc:-37.753236,145.697698
instructions:true

v2 has this

instructions:true
alt:true
loc:-37.755302,145.347839
loc:-37.75256,145.694351
jsonp:_l_routing_machine_0

Is it the alt which is causing the difference? I don't have an easy way of testing.

Branding

While thinking a little bit about #29 and the ad-hoc discussion (sorry!) in #23 I came to the conclusion that we should not do a complete Mapbox Directions branding.

a) This is not Mapbox Directions.
b) This is a demo server. We do not give guarantees on stability, quality, ...

I think just substituting Mapbox blue with OSRM orange will do the trick. Also solves our map problem. People will still see the similarity to Mapbox Directions but will be aware of subtle differences.

Also since the original Mapbox Directions theme is mostly color neutral, we can do this without too much duct tape.

/cc @DennisOSRM

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.