Meet us September 15–17 at two trade shows: IFTM 2026 and NRF 2026.

Developers  › Wayfinding

Routing & Wayfinding — step-by-step navigation, indoors and out.

Multimodal routing engine, multi-floor guidance, dynamic recalculation and accessibility support. Native on iOS, Android, Flutter and JavaScript.

MODES 6 modes
FLOORS Multi-floor
CALC < 1 sec
ACCESSIBILITY PMR native
ROUTING ENGINE

From query to guidance — in under a second.

01
User request

Origin, destination, profile (pedestrian, accessibility, bike) and mode preferences.

02
Route calculation

Optimised Dijkstra on the indoor + outdoor topological graph. Result in < 1 second.

03
Step-by-step guidance

Text + directional arrow instructions, floor changes via lift or stairs, door and airlock handling.

04
Dynamic recalculation

Deviation detected? Immediate recalculation. Works offline — graph embedded in the app.

MODES & CAPABILITIES

Six transport modes, one simplified integration.

From pedestrian to public transit, from accessibility guidance to audio — all modes exposed through the same unified API.

OUTDOOR Pedestrian

Pedestrian routing outdoor via OpenStreetMap, indoor via Wemap floor plan. Seamless transitions.

OUTDOOR Cycling

Cycling profile with multiple modes: fastest, safest, scenic.

MULTIMODAL Public transit

GTFS integration — real-time schedules, connections, line-level accessibility data.

INDOOR Multi-floor

Floor-to-floor guidance: lift, escalator, stairs, ramp. Automatic selection per profile.

INDOOR Accessibility

Full wheelchair profile: obstacle exclusion, minimum passage width, lift priority.

INDOOR Audio guidance

Voice instructions synchronised with guidance — native iOS and Android, web JS API.

TECHNICAL SPECS

Performance and platform coverage.

Available as a native SDK (iOS, Android, Flutter, JavaScript) or directly via the Data API — compute and render a route from your own backend, no SDK required.

Performance

Calc time < 1 second
Max indoor graph 500,000 nodes
Offline capable
GTFS support
Supported profiles 6
Position accuracy Depends on Positioning SDK

Platforms & SDKs

Platform Status
iOS (Swift) FULL FULL
Android (Kotlin) FULL FULL
Flutter FULL FULL
JavaScript (Web) FULL FULL
React Native BETA BETA

Features: Turn-by-turn · Multi-floor · Offline graph · AR overlay · Audio guidance

QUICK START

Add navigation in 5 minutes.

// Via WemapMapSDK's navigationManager — computes and starts
// turn-by-turn guidance in one call
let origin = Coordinate(latitude: 43.610628, longitude: 3.876654)
let destination = Coordinate(latitude: 43.609011, longitude: 3.917091)

mapView.navigationManager
    .startNavigation(
        origin: origin, destination: destination,
        travelMode: .walk,
        options: navigationOptions, searchRules: searchRules,
        itineraryOptions: itineraryOptions,
        timeout: .seconds(10)
    )
fun getItinerariesForPreview() {
    val origin = Coordinate(43.610628, 3.876654)
    val destination = Coordinate(43.609011, 3.917091)
    val searchRules = ItinerarySearchRules.WHEELCHAIR

    lifecycleScope.launch {
        runCatching {
            mapView.itineraryManager
                .getItineraries(
                    origin, destination,
                    TravelMode.Walk(),
                    searchRules
                )
        }.onSuccess {
            mapView.itineraryManager.addItinerary(it.first())
        }.onFailure {
            println("Failed to start navigation")
        }
    }
}
WemapMap(
  options: MapOptions(
    mapID: yourMapId,
    token: yourToken,
    environment: Environment.PROD,
  ),
  itineraryWidgetEnabled: true,
  onMapReady: (mapData, mapManager) async {
    await mapManager.addItinerary(
      origin: Coordinate(latitude: 48.877, longitude: 2.324, level: 0),
      destination: Coordinate(latitude: 48.876, longitude: 2.323, level: 1),
      searchRules: ItinerarySearchRules(ruleNames: ["wheelchair"]),
      color: Colors.red,
    );
  },
  onItineraryAdded: (itinerary) {
    print('Added: ${itinerary.duration}s, ${itinerary.distance}m');
  },
)
import { core } from '@wemap/core';
import { Router, Coordinates } from '@wemap/routing';

await core.init({ emmid: 'YOUR_MAP_ID', token: 'YOUR_TOKEN' });

const router = new Router();
const origin = new Coordinates(43.6047, 1.4442);
const destination = new Coordinates(43.6051, 1.4448);

const itineraries = await router.directions(
  origin,
  destination,
  'WALK',
  { isWheelchair: true }
);

const bestRoute = itineraries[0];
console.log('Distance:', bestRoute.distance, 'm');
console.log('Duration:', bestRoute.duration, 's');
IN PRODUCTION

Millions of guided journeys, every month.

300+ venues
6 transport modes
100% offline compatible
PMR natively supported
"Wemap's dynamic recalculation was decisive for us. When equipments change in real time, the routing adapts — without the user noticing anything."
Innovation Team, SNCF Gares & Connexions
COMPLIANCE & STANDARDS

Built for regulated environments.

Transport standards, accessibility and GDPR compliance — all natively integrated in the routing engine.

GTFS & GTFS-Realtime

Native GTFS and GTFS-RT integration for public transit schedules with real-time updates.

EN 17210 — Accessibility

European standard for accessibility in built environments integrated in the routing engine.

WCAG 2.1 AA

Accessible guidance instructions: sufficient contrast, text alternatives, keyboard navigation.

OpenStreetMap

Outdoor routing data built on OSM — contribute, update, stay sovereign.

Offline available

Graph embedded in the app — navigation without connection, even in dead zones (stations, tunnels).

RGPD / GDPR

No position tracking. Route calculation runs locally on device — no data transmitted.

Ready to deploy?

Ready to deploy navigation across your spaces?

Full documentation, sandbox, integration support.

Questions? Our technical team responds within the day.  pro@getwemap.com