LiveMap Routing

GraphHopper 11.0 service and local tools for LiveMap pedestrian routing. The service imports canonical livemap:* tags into lm_* encoded values and exposes a small application-facing routing facade.

Walking profiles

Six active profiles, plus two deprecated composites that still route for shipped clients. A weight of 0 ignores an attribute; a higher weight pulls the walk toward (green, trees, water, lights, presence) or away from (noise, crashes, crime) matching streets. Fast is shortest time. The one-page explainer is How it works; the lab on /demo uses the live catalog.

Local URLs

/demo Interactive route testing and profile lab: multi-profile comparison, live weight tuning, overlays, and edge inspection. /profiles redirects here.
/routing-guide How weights change a walk, plus the current catalog (active profiles, weights, and legacy composites).
/docs Browsable API reference (Redoc), rendered from the live engine contracts below, not the frontend proxy API. Defaults to v2; supported legacy v1 remains available in the version switcher.
/api/v1/routing/openapi.json Generated OpenAPI 3.1 contract for the deprecated, still-supported v1 facade.
/api/v2/routing/openapi.json Generated OpenAPI 3.1 contract for the v2 navigation API.
http://localhost:8989 GraphHopper application connector.
http://localhost:8990 Dropwizard admin connector.

API

Start new integrations with v2 navigation, planning, and the weights-and-policies catalog. v1 is deprecated but remains supported for existing clients.

POST /api/v1/routing/route Legacy, deprecated multi-profile facade with a LiveMap response envelope.
GET /api/v1/routing/profiles Deprecated weights-only catalog; use v2 for policies.
GET /api/v1/routing/openapi.json Returns the deprecated v1 facade OpenAPI contract.
POST /api/v2/routing/route Turn-by-turn navigation (OSRM-compatible JSON) for a single profile; consumed by Ferrostar.
POST /api/v2/routing/plan Pre-trip plan with a profile-keyed OSRM-compatible wrapper. Omit profiles for the baseline plus successful non-deprecated alternatives strictly less than 50% longer by distance. No overlap filtering or deduplication; an unreachable or zero-distance baseline is returned alone. Provide profiles to retain every requested key, including deprecated profiles and NoRoute documents, without filtering (compatibility mode). Null and empty lists are invalid.
GET /api/v2/routing/profiles Configured profiles with weights, all resolved policy blocks, and deprecation metadata.
GET /api/v2/routing/openapi.json Returns the v2 navigation OpenAPI contract.
POST /route Native GraphHopper route endpoint, proxied for the map UI.

Route Request Shape

v2 navigation — single profile, OSRM-compatible response:

{
  "profile": "foot_lowcrash",
  "points": [[8.5400, 47.3700], [8.5420, 47.3700]],
  "bucket": "auto",
  "locale": "en",
  "voice_units": "metric"
}

v2 automatic plan — omit profiles so the engine selects reasonable alternatives. Returns a {"profiles": {"profile_id": {...}}} wrapper of OSRM-compatible documents:

{
  "points": [[8.5400, 47.3700], [8.5420, 47.3700]],
  "bucket": "auto",
  "locale": "en",
  "voice_units": "metric"
}

For v2 explicit-profile compatibility planning, add "profiles": ["foot_fast", "foot_lowcrash"] to that request. Every requested key is preserved without filtering. Pass one selected Ok document with nonempty routes to the navigation client, not the plan wrapper.

Legacy v1 facade (deprecated) — multi-profile comparison, LiveMap response envelope:

{
  "points": [[8.5400, 47.3700], [8.5420, 47.3700]],
  "profiles": ["foot_fast", "foot_green", "foot_water", "foot_lit", "foot_quiet", "foot_lowcrash"],
  "bucket": "auto",
  "debug": true
}

Facade Examples

These requests run against the local Caddy proxy at /api/v1/routing/* and /api/v2/routing/*.

v2 profile catalog

Fetch configured profiles, weights, resolved policies, and deprecation metadata.

Legacy v1 single route (deprecated)

Route with one product profile, automatic Zurich time bucket, and no debug payload.

Legacy v1 comparison (deprecated)

Route the same points through the six active product profiles with debug enabled.

v2 navigation

Single-profile turn-by-turn route in OSRM-compatible shape, as Ferrostar consumes it.

v2 automatic plan

Omit profiles for the baseline plus successful active alternatives strictly less than 50% longer by distance.

v2 explicit-profile compatibility plan

Request all six active profiles. Preserves every requested key, even identical, long, or unavailable routes, without automatic filtering.

v2 bicycle plan

Requests only bike_fast. Requires a bicycle-enabled service; unavailable endpoints return NoRoute. No walking fallback.

Legacy v1 composite at night (deprecated)

foot_safe still routes. This example keeps it on purpose to show the temporal accident, crime, and presence signals on the legacy composite.

Legacy v1 validation (deprecated)

Request an unknown profile to inspect facade error handling.

Legacy OpenAPI contract (v1, deprecated)

Fetch the v1 facade contract for client generation or inspection.

OpenAPI contract (v2)

Fetch the per-version v2 navigation contract, generated at runtime from the live resource.

No request selected
Click an example above to run it.
Response will appear here.

Routing Dimensions

Active dimensions accident, crime, presence, noise, tree_coverage, lights, water, green, incline
Encoded values Canonical LiveMap values are stored as lm_* GraphHopper encoded values.
Temporal buckets wd_am, wd_pm, wd_nt, we_am, we_pm, we_nt
Score range Ordinal scores use 0 for no modeled signal and 1 to 5 for signal strength. Policies may instead read raw fractions, noise measurements, crash counts, or incline; these are not ordinal scores. UI weights are 0.0 to 1.0.

Run Locally

just up
LIVEMAP_PUBLIC_PORT=8081 just up

The top-level justfile builds the service JAR, copies it into runtime/, builds the app image, and starts the container. The public web port defaults to 8080.

Repository

github.com/livemapai/livemap-routing