This is the documentation of version 0.64.0. Go to the latest version, 1.0.0-rc.5.

Route styling

The Routing module draws its routes in a look of its own: color and width for the whole route, waypoints.size and waypoints.label for the waypoints, or layers per layer, all live on the route style playground. No styling knob reaches route layers except the accent a route given no color defaults to, and the delay colours of its traffic sections.

Colour, width and waypoint size

import { RoutingModule } from '@tomtom-org/maps-sdk/map';

const routingModule = await RoutingModule.create(map, {
    color: '#DF1B12',        // the route line, its outline (a darker shade) and the waypoint pins
    width: 'l',              // 's' | 'm' | 'l'
    widthFactor: 1.2,        // multiplies the preset, 0.5 to 2
    waypoints: {
        size: 's',           // 's' | 'm' | 'l'
        sizeFactor: 1.5,     // multiplies the preset, 0.5 to 2
    },
});

Leave color out and routes take the map's accent when a theme sets one, and the SDK's route blue otherwise:

const brandedRoutes = await RoutingModule.create(map, { color: '#DF1B12' }); // stays red through any theme
const themedRoutes = await RoutingModule.create(map); // follows map.mapColors.accent

Layer overrides

layers is keyed by part (mainLines, waypoints, sections, …) and then by layer; each entry's partial paint and layout merge onto the SDK's own. Section layers are in Route sections.

const routingModule = await RoutingModule.create(map, {
    layers: {
        mainLines: {
            routeLine: { paint: { 'line-color': '#FF0000', 'line-width': 6 } }
        }
    }
});

Every setting as data

routingKnobCatalogue lists every plain-valued display setting of the module with its kind, its range or options and, where one value holds everywhere, its default. Each id is the setting's path in the config, so a UI can build its controls from it with no map loaded:

import { routingKnobCatalogue } from '@tomtom-org/maps-sdk/map';

const tunnelKnobs = routingKnobCatalogue.filter(({ id }) => id.startsWith('sections.tunnel.'));
// [{ id: 'sections.tunnel.visible', kind: 'toggle', description: '…', default: true }, …,
//  { id: 'sections.tunnel.style', kind: 'enum', description: '…', options: ['halo', 'inline'], default: 'inline' }, …]

The route-wide knobs come first, then each section type's, <type> standing for any of drawnSectionTypes:

Id Kind
visible toggle
color color
width, waypoints.size enum: s, m or l
widthFactor, waypoints.sizeFactor factor, 0.5 to 2
highlight.outline.widthFactor factor, 1 to 1.25
waypoints.icon.style.fillColor, waypoints.icon.style.outlineColor color
waypoints.icon.style.outlineOpacity number, 0 to 1
waypoints.icon.start.style.fillColor, waypoints.icon.start.style.outlineColor, waypoints.icon.middle.style.fillColor, waypoints.icon.middle.style.outlineColor, waypoints.icon.finish.style.fillColor, waypoints.icon.finish.style.outlineColor color
waypoints.icon.start.style.outlineOpacity, waypoints.icon.middle.style.outlineOpacity, waypoints.icon.finish.style.outlineOpacity number, 0 to 1
waypoints.stopNumbering enum: numbers, letters or none
waypoints.highlight.sizeFactor factor, 1 to 1.5
waypoints.label.visible toggle
waypoints.label.color, waypoints.label.haloColor color
waypoints.label.size number, 6 to 48 pixels
waypoints.label.haloWidth number, 0 to 10 pixels
waypoints.label.opacity number, 0 to 1
waypoints.label.font enums: mapFonts
waypoints.entryPoints enum: main-when-available or ignore
displayUnits.distance.type enum: metric, imperial_us or imperial_uk
displayUnits.distance.kilometers, displayUnits.distance.meters, displayUnits.distance.miles, displayUnits.distance.feet, displayUnits.distance.yards text
displayUnits.time.hours, displayUnits.time.minutes text
chargingStops.visible, chargingStops.label.visible, summaryBubbles.visible toggle
countryCrossings.visible toggle
countryCrossings.minZoom number, 0 to 22
countryCrossings.color, countryCrossings.label.color color
countryCrossings.alignment enum: viewport or route
sections.<type>.visible toggle
sections.<type>.color color
sections.<type>.opacity number, 0 to 1
sections.<type>.width enum: s, m or l
sections.<type>.widthFactor factor, 0.5 to 2
sections.<type>.style, sections.<type>.pattern enum
sections.<type>.icon.image image
sections.<type>.icon.placement enum
sections.<type>.icon.sizeFactor factor, 0.25 to 2
sections.speedLimit.sign.placement, sections.speedLimit.sign.priority, sections.speedLimit.sign.unit enum
sections.speedLimit.sign.minZoom number, 0 to 22

Layer positioning

By default the route lines sit below the map's labels, and the route icons above them. beforeLayerConfig moves them: one target for the whole route — 'top' or a key of mapStyleLayerIDs — or a record keyed by part, plus all for the parts it leaves out:

// Route lines under the road network; instruction lines and icons stay where they are
routingModule.updateConfig({ beforeLayerConfig: { mainLines: 'lowestRoadLine' } });

Charging stop icons

Long-distance EV routes place a charging stop at the end of each leg. Supply your own sprites with chargingStops.icon.customIcons, then pick one per stop with mapping:

const routingModule = await RoutingModule.create(map, {
  chargingStops: {
    icon: {
      customIcons: [
        { id: 'slow-charger', image: chargerSlowSVG },
        { id: 'fast-charger', image: chargerFastSVG, offsetX: 0, offsetY: -10 }
      ],
      mapping: {
        basedOn: 'chargingSpeed',
        value: { slow: 'slow-charger', regular: 'slow-charger', fast: 'fast-charger', 'ultra-fast': 'fast-charger' }
      }
    }
  }
});

Related guides and examples

Related guides

Related examples