Valhalla

Valhalla

Official

Docker app from grtgbln's Repository

Overview

An open source routing engine and accompanying libraries for use with OpenStreetMap data. Valhalla also includes tools like time+distance matrix computation, isochrones, elevation sampling, map matching and tour optimization (Travelling Salesman).
 ██▒   █▓ ▄▄▄       ██▓     ██░ ██  ▄▄▄       ██▓     ██▓    ▄▄▄
▓██░   █▒▒████▄    ▓██▒    ▓██░ ██▒▒████▄    ▓██▒    ▓██▒   ▒████▄
 ▓██  █▒░▒██  ▀█▄  ▒██░    ▒██▀▀██░▒██  ▀█▄  ▒██░    ▒██░   ▒██  ▀█▄
  ▒██ █░░░██▄▄▄▄██ ▒██░    ░▓█ ░██ ░██▄▄▄▄██ ▒██░    ▒██░   ░██▄▄▄▄██
   ▒▀█░   ▓█   ▓██▒░██████▒░▓█▒░██▓ ▓█   ▓██▒░██████▒░██████▒▓█   ▓██▒
   ░ ▐░   ▒▒   ▓▒█░░ ▒░▓  ░ ▒ ░░▒░▒ ▒▒   ▓▒█░░ ▒░▓  ░░ ▒░▓  ░▒▒   ▓▒█░
   ░ ░░    ▒   ▒▒ ░░ ░ ▒  ░ ▒ ░▒░ ░  ▒   ▒▒ ░░ ░ ▒  ░░ ░ ▒  ░ ▒   ▒▒ ░
     ░░    ░   ▒     ░ ░    ░  ░░ ░  ░   ▒     ░ ░     ░ ░    ░   ▒
      ░        ░  ░    ░  ░ ░  ░  ░      ░  ░    ░  ░    ░  ░     ░  ░
     ░

Valhalla is an open source routing engine and accompanying libraries for use with OpenStreetMap data. Valhalla also includes tools like time+distance matrix computation, isochrones, elevation sampling, map matching and tour optimization (Travelling Salesman).

Build Status

Linux macOS & Windows Code Coverage Timezone DB
Build Linux Windows & macOS CI codecov timezone_db

Generative AI usage

While we absolutely accept AI usage for Valhalla (and its related projects), we require the following guidelines to be followed:

  1. The human developer understood every line of code written and verifies that the proposed implementation is actually working

  2. PR description (re-)written by a human is non-negotiable

  3. contrived AI logic with weird generic variable names should be rewritten to match human perception

  4. non-obvious code changes should be commented on inline (not in the PR description!)

  5. & 3. are pretty subjective, where we have a lot more patience. However, PRs ignoring these guidelines entirely, might be closed without further notice.

License

Valhalla, and all of the projects under the Valhalla organization, use the MIT License. Avatar/logo by Jordan.

OpenStreetMap data in the ./test/data is licensed under ODbL and copyrighted by OSM contributors. Additional information on licenses and other requirements concerning the data sources most frequently used by Valhalla can be found in the docs.

Overview

There are several key features that we hope can differentiate the Valhalla project from other routing and network analysis engines. They are:

  • Open source software, on open source data with a very liberal license. Should allow for transparency in development, encourage contribution and community input, and foster use in other projects.
  • Tiled hierarchical data structure. Should allow users to have a small memory footprint on memory constrained devices, enable offline routing, provide a means for regional extracts and partial updates.
  • Dynamic, runtime costing of edges and vertices within the graph via a plugin architecture. Should allow for customization and alternate route generation.
  • C++ based API. Should allow for cross compilation of the various pieces to enable routing on offline portable devices.
  • A plugin based narrative and manoeuvre generation architecture. Should allow for generation that is customized either to the administrative area or to the target locale.
  • Multi-modal and time-based routes. Should allow for mixing auto, pedestrian, bike and public transportation in the same route or setting a time by which one must arrive at a location.

Demo Server

FOSSGIS e.V. hosts a demo server which is open to the public and includes a full planet graph with an open-source web app on https://valhalla.openstreetmap.de. The HTTP API is accessible on a slightly different subdomain, e.g. https://valhalla1.openstreetmap.de/isochrone. Usage of the demo server follows the usual fair-usage policy as OSRM & Nominatim demo servers (somewhat enforced by rate limits).

[!NOTE] In case you publish apps to end users (be it mobile, web or desktop) which request to the public demo server, we'd ask you to let us know via Github Discussions and to include an identifying X-Client-Id request header, e.g. X-Client-Id: newroutingapp.io.

Platform Compatibility

Valhalla is fully functional on many Linux and Mac OS distributions, and is also used on iOS and Android devices.

For Windows, not all functionality is fully supported yet. Building the Valhalla library works flawlessly, as well as the following application modules:

  • TOOLS: utilities to query and benchmark various components
  • DATA_TOOLS: utilities to build input data and handle transit
  • PYTHON_BINDINGS: use all actions (route, isochrones, matrix etc) via the Valhalla Python library (needs a full (i.e. development) Python distribution in the PATH)

Organization

The Valhalla organization is comprised of several library modules each responsible for a different function. The layout of the various modules is as follows:

  • Midgard - Basic geographic and geometric algorithms for use in the various other projects.
  • Baldr - The base data structures for accessing and caching tiled route data.
  • Sif - Library used in costing of graph nodes and edges. This can be used as input to loki and thor.
  • Skadi - Library and service for accessing elevation data. This can be used as input to mjolnir or as a standalone service.
  • Mjolnir - Tools for turning open data into Valhalla graph tiles.
  • Loki - Library used to search graph tiles and correlate input locations to an entity within a tile. This correlated entity (edge or vertex) can be used as input to thor.
  • Meili - Library used to for map-matching.
  • Thor - Library used to generate a path through the graph tile hierarchy. This path and attribution along the path can be used as input to odin.
  • Odin - Library used to generate manoeuvres and narrative based on a path. This set of directions information can be used as input to tyr.
  • Tyr - Service used to handle http requests for a route communicating with all of the other valhalla APIs. The service will format output from odin and support json (and eventually protocol buffer) output.
  • Tools - A set command line tools that exercise bits of functionality from the library components above and provide the basis for quality testing and performance benchmarking.
  • Demos - A set of demos which allows interacting with the service and APIs.

Documentation

Documentation is stored in the docs/ folder in this GitHub repository. It can be viewed at valhalla.github.io/valhalla.

Installation

For more information on binaries, see Command Line Tools section below and the docs.

From source

If you want to build Valhalla from source, follow the documentation.

With docker

Test & Publish Docker image

To run Valhalla locally or your own server, we recommend using one of our Docker images, see the README.

Via Python bindings

pyvalhalla version

We publish our (very) high-level Python bindings to PyPI with pyvalhalla.

The Python packages don't only contain the Python bindings, they also provide access to the C++ executables, e.g. in the form of python -m valhalla valhalla_build_tiles -h. For more details, see the Python README.

To install the native C++ executables one doesn't even need to have root permissions or even have Python installed. Simply download the desired wheel from PyPI, extract it with e.g. unzip and run the included valhalla/bin/<binary> directly.

Via NodeJS bindings

npm version npm version

We provide high-level NodeJS binding:

npm install @valhallajs/valhallajs

For more details, see the NodeJS README.

Contributing

We :heart: contributions to Valhalla. They could be non-technical, e.g. translations into other languages via Transifex or documentation improvements, or technical ones like bug fixes or feature implementations. It's important to open an issue before setting out to work on a PR.

Ideally, get familiar with our Contribution guidelines first.

Command Line Tools

[!TIP] Easily install various Valhalla command line tools like valhalla_build_tiles or valhalla_service with the Python bindings.

valhalla_service aka one-shot mode

If you can't (e.g. Windows Server) or don't want to have the full-fledged HTTP API running, you can have the (almost) exact same behavior with the 'valhalla_service' executable in so-called "one-shot" mode. It's simple, just pass the config file, the action (route, isochrone, matrix etc) and the stringified JSON request (or alternatively a file containing the request to circumvent shell command length issues):

valhalla_service valhalla.json isochrone '{"locations":[{"lat":42.552448,"lon":1.564865}],"costing":"auto","contours":[{"time":10,"color":"ff0000"}], "show_locations":true}'
# Alternatively you can pass a file with the same contents
valhalla_service valhalla.json isochrone isochrone_request.txt

It's important to note that all Valhalla logs for one-shot mode are piped to stderr while the actual JSON response will be in stdout. To completely silence the logs, pass type: "" to midgard.logging in the config file.

Batch Script Tool

Related projects

The following projects are open-source and built with the intention to make it easier to use Valhalla and its features:

  • OpenStreetMapSpeeds: A project conflating open GPS data to improve Valhalla's speed classification. The current JSON is from early 2022 and can be downloaded here and used by setting the path in the mjolnir.default_speeds_config config option.
  • valhalla-operator: A k8s operator to deploy and manage Valhalla.
  • valhalla-app: A React based web app for Valhalla, powering https://valhalla.openstreetmap.de/.
  • valhalla-qgis-plugin: A QGIS plugin for Valhalla, also available in the official QGIS plugin store, featuring built-in valhalla_service and valhalla_build_tiles.
  • routingpy: A Python client for most open-source routing engines, including Valhalla, with a common interface for all engines. Available on PyPI.
  • routingjs: A TypeScript client for most open-source routing engines, including Valhalla, with a common interface for all engines. Available as engine-specific packages on npm.
  • Valhalla_jll.jl: Valhalla binaries shipped for Julia.

Install Valhalla on Unraid in a few clicks.

Find Valhalla in Community Apps on your Unraid server, review the template, and click Install. Unraid handles the Docker app or plugin setup from the published template.

Open the Apps tab on your Unraid server Search Community Apps for Valhalla Review the template variables and paths Click Install

Download Statistics

287,899
Total Downloads
440
This Month
468
Avg / Month

Total Downloads Over Time

Loading chart...

Related apps

Details

Repository
ghcr.io/valhalla/valhalla:latest
Last Updated2023-03-16
First Seen2025-01-28

Runtime arguments

Network
bridge
Privileged
false

Template configuration

API PortPorttcp

Container Port: 8002

Target
8002
Default
8002
Value
8002
Tile URLsVariable

Space-separated list of URLs. Remove if Use Local Tiles is enabled.

Target
tile_urls
Default
https://download.geofabrik.de/europe/andorra-latest.osm.pbf
Value
https://download.geofabrik.de/europe/andorra-latest.osm.pbf
Use Local TilesVariable

Use a local tile.tar file instead of downloading and building

Target
use_tiles_ignore_pbf
Default
False|True
Build TarVariable

True creates a tarball of the tiles including an index which allows for extremely faster graph loading after reboots. Force will do the same, but first delete the existing tarball.

Target
build_tar
Default
True|Force|False
Force RebuildVariable

Force a rebuild of the routing tiles and sets (overrides Build Tar)

Target
force_rebuild
Default
False|True
Build ElevationVariable

True downloads elevation tiles which are covering the routing graph. Force will do the same, but first delete any existing elevation tiles.

Target
build_elevation
Default
False|True|Force
Build AdminsVariable

True builds the admin database needed for things like border-crossing penalties and detailed routing responses. Force will do the same, but first delete the existing database.

Target
build_admins
Default
False|True|Force
Build Time ZonesVariable

True builds the timezone database which is needed for time-dependent routing. Force will do the same, but first delete the existing database.

Target
build_time_zones
Default
False|True|Force
Build TransitVariable

True will attempt to build transit tiles if none exist yet. Force will remove existing transit and routing tiles.

Target
build_transit
Default
False|True|Force
Custom FilesPath

Path to custom files.

Target
/custom_files
Default
/mnt/user/appdata/valhalla/custom_files
Value
/mnt/user/appdata/valhalla/custom_files
GTFS FeedsPath

Path to GTFS feeds. Remove if Build Transit is disabled.

Target
/gtfs_feeds
Default
/mnt/user/appdata/valhalla/gtfs_feeds
Value
/mnt/user/appdata/valhalla/gtfs_feeds
Tileset NameVariable

The name of the resulting graph on disk. Very useful in case you want to build multiple datasets in the same directory.

Target
tileset_name
Default
valhalla_tiles
Value
valhalla_tiles
Traffic NameVariable

The name of the traffic.tar. Again, useful for serving multiple traffic archives from the same directory. If empty, no traffic archive will be built.

Target
traffic_name
Default
traffic.tar
Value
traffic.tar
Path ExtensionsVariable

This path will be appended to the custom_files path and will be the directory where all files will be created. Can be very useful in certain deployment scenarios. No leading/trailing path separator allowed.

Target
path_extension
Update Existing ConfigVariable

True updates missing keys in existing valhalla.json. Useful for updating stale config files to include newly introduced config parameters.

Target
update_existing_config
Default
True|False
Use Default Speed ConfigVariable

True loads a JSON file used to enhance default speeds (or falls back to an existing custom_files/default_speeds.json) and sets the respective config entry. More details: https://github.com/OpenStreetMapSpeeds/schema

Target
use_default_speeds_config
Default
False|True
Default Speed Config URLVariable

Remote location of the default_speeds_config JSON.

Target
default_speeds_config_url
Default
https://raw.githubusercontent.com/OpenStreetMapSpeeds/schema/master/default_speeds.json
Value
https://raw.githubusercontent.com/OpenStreetMapSpeeds/schema/master/default_speeds.json
Serve TilesVariable

Serve tiles from the container. If false, only build the graph.

Target
serve_tiles
Default
True|False
Server ThreadsVariable

Number of threads to use for the server

Target
server_threads
Default
2
Value
2