QGIS plugin to use Valhalla for routing, isochrones, matrices & expansion.
Python
30
174 commits
updated Sep 22, 2026
QGIS Plugin for the Valhalla routing engine.
[!NOTE] This plugin supports both QGIS v3.x (on
qgis-v3branch) & v4.x (onmaster). The plugin's release series 6.x is reserved for QGIS3, series >=7.x for QGIS4.
It features:
pedestrian, bicycle, car, truck & motorcyclepyvalhalla with the full flexibility of local Valhalla processes:
localhost are preconfiguredlocalhost) as a polygon layer[!NOTE] Starting with
v3.0.0this plugin had a complete re-write from scratch. Previously it was loosely based on one of my ex-plugins ORS Tools, but that design has a quite a few shortcomings in terms of UX and aesthetics. The biggest problem is that the dialogs are huge and one can't properly access both the map canvas and the plugin at the same time. Starting withv3.0.0it's a docked plugin, i.e. arranging itself as a proper panel thanks to the awesome Qt/QGIS APIs.
[!NOTE] Waypoints can now be controlled in the map's context menu (right-click in the map).

Select the endpoint/action to "Execute". Note that some endpoints expect multiple waypoints.
Manage the servers which are shown in the "Provider" drop-down
Start or stop a Valhalla service on localhost with the local graph shown in the dropdown menu
Manage settings for the local setup, see "Settings UI"
Watch logs for the local Valhalla service
Add/remove/clear waypoints in the table:
Multiple alternatives to add waypoints to the table:
locations request array (TODO: #27)bearing etc in the "Extra" columnMoves the selected waypoint rows up & down, also updates the "Valhalla waypoints" annotation layer
Set a radius for each waypoint which will snap more roads
Set extra Valhalla waypoint properties in URL query parameter form (i.e.k1=v1&k2=v2), e.g. waiting=1800&date_time=2025-07-25T09:00
Additional costing options to influence the path finding for any endpoint
View the full most recent request, mostly useful when reporting issues, or debugging.
Check the remote graph for admin & timezone DBs (they should exist) and loads the graph extent of the currently set Valhalla server as a polygon layer (if available).
Some information about the plugin and (if available) the currently set Valhalla server.

localhostpyvalhalla is supported. After plugin installation you can install the package from here. On QGIS startup it'll check if there's a new version available and let you update.localhost[!NOTE] Integration of
pyvalhallaworks on Linux x64, OSX arm64 & Windows x64 (Windows sincepyvalhalla3.9.0, which finally ships a workingvalhalla_service.exe, see https://github.com/valhalla/valhalla/issues/5314).
The main distinguishing features of this plugin (compared to other routing plugins) is the ability to:
both without any kind of additional setup, all taken care of straight from the plugin's UI. I added this feature mainly because:
While the fully integrated solution tries to install the Python package pyvalhalla for you, there are probably situations where that will fail in some way (note, this plugin is only CI tested on Linux). In those cases, you can still do the following:
pyvalhalla wheel for your platform<unzipped_pyvalhalla_path>/binSince this plugin is pretty flexible, so the tests need to be too:
tests/test_localhost_docker: needs an external local service running, e.g.
docker start valhalla-router
# or if it doesn't exist yet
# docker run -dt --name valhalla-router -p 8002:8002 -v $PWD/tests/data:/custom_files -e server_threads=2 -e tileset_name=andorra-tiles ghcr.io/valhalla/valhalla-scripted:latest
# "uninstall" python package if it's installed
rm -r /home/nilsnolde/.local/share/QGIS/QGIS4/profiles/default/valhalla/pyvalhalla
QT_QPA_PLATFORM=offscreen python -m coverage run --append -m unittest discover -s tests/test_localhost_docker -t .
tests/test_localhost_plugin: e.g.
# stop docker container if it's running
docker stop valhalla-router
# test will download & install pyvalhalla
QT_QPA_PLATFORM=offscreen python -m coverage run --append -m unittest discover -s tests/test_localhost_plugin -t .
In CI we run the tests with the QGIS docker image, have a look there.
To keep unintended files out of the zip, use the following:
find valhalla \
\( -type d -name '__pycache__' \
-o \( -path 'valhalla/third_party/routingpy/*' \
! -path 'valhalla/third_party/routingpy/routingpy' \
! -path 'valhalla/third_party/routingpy/routingpy/*' \) \
\) -prune -o -type f -print \
| zip -r dist/valhalla_4.0.0.zip -@
Without going into too much detail, this plugin had once a much wider scope. Back when I was still running GIS-OPS, I was a bit obsessed with providing an alternative to ESRI's network analyst, one of the last areas where QGIS is very very far behind ESRI. That's a crazy huge task, especially including all those optimization algorithms. However, together with @chrstnbwnkl we actually did come a pretty long way:
spopt and pyvroom in the plugin UIWe were also planning to open a web shop where you could buy Valhalla & OSRM graphs right from QGIS and load them locally in a heartbeat. The idea was grand and a lot of OSS was being released as the result of it, e.g. the python bindings to Valhalla & OSRM and Windows support for pyvroom. Sadly the work to get there was grand as well and we never ended up releasing the full plugin.
The current Valhalla plugin still has all the source code though, mostly just commented out. In case anyone ever feels the urge to rival ESRI Network Analyst, please contact me on nilsnolde+github@proton.me.
I also should mention that @chrstnbwnkl was quite heavily involved in the initial development as an employee in GIS-OPS times. However, some accidental git failures almost entirely wiped out his initial contributions.
Some costing options make little sense, e.g. transit, some others we didn't get around to yet. Valhalla is also under constant development, we might miss a few recently added ones. ↩
Python
94.2%
QML
5.5%
QGIS plugin to use Valhalla for routing, isochrones, matrices & expansion.
Python
30
174 commits
updated Sep 22, 2026
QGIS Plugin for the Valhalla routing engine.
[!NOTE] This plugin supports both QGIS v3.x (on
qgis-v3branch) & v4.x (onmaster). The plugin's release series 6.x is reserved for QGIS3, series >=7.x for QGIS4.
It features:
pedestrian, bicycle, car, truck & motorcyclepyvalhalla with the full flexibility of local Valhalla processes:
localhost are preconfiguredlocalhost) as a polygon layer[!NOTE] Starting with
v3.0.0this plugin had a complete re-write from scratch. Previously it was loosely based on one of my ex-plugins ORS Tools, but that design has a quite a few shortcomings in terms of UX and aesthetics. The biggest problem is that the dialogs are huge and one can't properly access both the map canvas and the plugin at the same time. Starting withv3.0.0it's a docked plugin, i.e. arranging itself as a proper panel thanks to the awesome Qt/QGIS APIs.
[!NOTE] Waypoints can now be controlled in the map's context menu (right-click in the map).

Select the endpoint/action to "Execute". Note that some endpoints expect multiple waypoints.
Manage the servers which are shown in the "Provider" drop-down
Start or stop a Valhalla service on localhost with the local graph shown in the dropdown menu
Manage settings for the local setup, see "Settings UI"
Watch logs for the local Valhalla service
Add/remove/clear waypoints in the table:
Multiple alternatives to add waypoints to the table:
locations request array (TODO: #27)bearing etc in the "Extra" columnMoves the selected waypoint rows up & down, also updates the "Valhalla waypoints" annotation layer
Set a radius for each waypoint which will snap more roads
Set extra Valhalla waypoint properties in URL query parameter form (i.e.k1=v1&k2=v2), e.g. waiting=1800&date_time=2025-07-25T09:00
Additional costing options to influence the path finding for any endpoint
View the full most recent request, mostly useful when reporting issues, or debugging.
Check the remote graph for admin & timezone DBs (they should exist) and loads the graph extent of the currently set Valhalla server as a polygon layer (if available).
Some information about the plugin and (if available) the currently set Valhalla server.

localhostpyvalhalla is supported. After plugin installation you can install the package from here. On QGIS startup it'll check if there's a new version available and let you update.localhost[!NOTE] Integration of
pyvalhallaworks on Linux x64, OSX arm64 & Windows x64 (Windows sincepyvalhalla3.9.0, which finally ships a workingvalhalla_service.exe, see https://github.com/valhalla/valhalla/issues/5314).
The main distinguishing features of this plugin (compared to other routing plugins) is the ability to:
both without any kind of additional setup, all taken care of straight from the plugin's UI. I added this feature mainly because:
While the fully integrated solution tries to install the Python package pyvalhalla for you, there are probably situations where that will fail in some way (note, this plugin is only CI tested on Linux). In those cases, you can still do the following:
pyvalhalla wheel for your platform<unzipped_pyvalhalla_path>/binSince this plugin is pretty flexible, so the tests need to be too:
tests/test_localhost_docker: needs an external local service running, e.g.
docker start valhalla-router
# or if it doesn't exist yet
# docker run -dt --name valhalla-router -p 8002:8002 -v $PWD/tests/data:/custom_files -e server_threads=2 -e tileset_name=andorra-tiles ghcr.io/valhalla/valhalla-scripted:latest
# "uninstall" python package if it's installed
rm -r /home/nilsnolde/.local/share/QGIS/QGIS4/profiles/default/valhalla/pyvalhalla
QT_QPA_PLATFORM=offscreen python -m coverage run --append -m unittest discover -s tests/test_localhost_docker -t .
tests/test_localhost_plugin: e.g.
# stop docker container if it's running
docker stop valhalla-router
# test will download & install pyvalhalla
QT_QPA_PLATFORM=offscreen python -m coverage run --append -m unittest discover -s tests/test_localhost_plugin -t .
In CI we run the tests with the QGIS docker image, have a look there.
To keep unintended files out of the zip, use the following:
find valhalla \
\( -type d -name '__pycache__' \
-o \( -path 'valhalla/third_party/routingpy/*' \
! -path 'valhalla/third_party/routingpy/routingpy' \
! -path 'valhalla/third_party/routingpy/routingpy/*' \) \
\) -prune -o -type f -print \
| zip -r dist/valhalla_4.0.0.zip -@
Without going into too much detail, this plugin had once a much wider scope. Back when I was still running GIS-OPS, I was a bit obsessed with providing an alternative to ESRI's network analyst, one of the last areas where QGIS is very very far behind ESRI. That's a crazy huge task, especially including all those optimization algorithms. However, together with @chrstnbwnkl we actually did come a pretty long way:
spopt and pyvroom in the plugin UIWe were also planning to open a web shop where you could buy Valhalla & OSRM graphs right from QGIS and load them locally in a heartbeat. The idea was grand and a lot of OSS was being released as the result of it, e.g. the python bindings to Valhalla & OSRM and Windows support for pyvroom. Sadly the work to get there was grand as well and we never ended up releasing the full plugin.
The current Valhalla plugin still has all the source code though, mostly just commented out. In case anyone ever feels the urge to rival ESRI Network Analyst, please contact me on nilsnolde+github@proton.me.
I also should mention that @chrstnbwnkl was quite heavily involved in the initial development as an employee in GIS-OPS times. However, some accidental git failures almost entirely wiped out his initial contributions.
Some costing options make little sense, e.g. transit, some others we didn't get around to yet. Valhalla is also under constant development, we might miss a few recently added ones. ↩
Python
94.2%
QML
5.5%