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
},
});
- A factor composes with its preset rather than replacing it, and is clamped to its
rangeinroutingKnobCatalogue, whichknobEntryOf(routingKnobCatalogue, 'widthFactor')reads. - The instruction arrows keep one size across the
widthpresets and follow onlywidthFactor. - The stop marks scale with their pins, preset and factor alike, and stay centred in the pin head at every zoom.
- The waypoint labels follow the map's light/dark theme, like the labels of places and geometries: dark text
on a white halo on a light map, the two swapped on a dark one.
waypoints.labelsets their colour, halo and size, aslabeldoes for places. Pins per role, labels of your own and icons per waypoint are in Waypoints.
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 |
- A section type lists only the knobs it answers to:
speedLimittakes onlyvisibleandsign, andtraffic, which colours its line by delay, has nocolor,patternoriconentry. routingKnobIdslists the ids in catalogue order,RoutingKnobIdis their union, andRoutingKnobValueOf<ID>the plain value one takes.- The unit labels after distances and durations are
textentries with no default. AdisplayUnitsknob left unset takes its value from the global configuration. - Not in it:
layers,beforeLayerConfig, the charging stop icons and title, and the waypoint images,mappingandtitle, which take structured, MapLibre or function values, andevents. - Its entries share their shape,
KnobEntry, with every module's catalogue.
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:
mainLines— the route lines, and every section line drawn with them.instructionLines— the guidance lines and their arrows, above the route lines by default.icons— waypoints, summary bubbles, charging stops, border crossings and section icons, the tunnel sign and the icons generated section types ask for lowest among them. A target puts them all beneath it, in that order.
// Route lines under the road network; instruction lines and icons stay where they are
routingModule.updateConfig({ beforeLayerConfig: { mainLines: 'lowestRoadLine' } });
- Each part keeps its own layers in order wherever it goes, and
applyConfigorupdateConfigrestacks them at runtime. - A target the style lacks — the satellite style has no
lowestRoadLine— puts the part on top. getLayerToRenderLinesUnder()followsmainLines, and returnsundefinedwhen the lines are on top.- The speed limit signs are not a part: their
sign.prioritysettles which symbols they give way to, wherever the parts are.
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' }
}
}
}
});
mappingalso takes{ basedOn: 'custom', fn: (stop) => spriteID }, and works withoutcustomIconsto point at sprites the style already ships.offsetX/offsetY(pixels) shift an icon from its coordinate, for icons whose visual tip is not their bottom: positiveoffsetXmoves right, positiveoffsetYdown. They apply only to acustomIconsentry that also provides animage.
Related guides and examples
Related guides
- Routing module - Showing routes and waypoints, events and shown data
- Route sections - The overlays drawn per stretch of road, on the same set of knobs
- Map modules - The knob kinds every catalogue shares
Related examples
- Route style playground - The route's colour, width, waypoint size, waypoint label colour and clicked outline on knobs, and a toggle that hides it
- Route waypoints playground - Per-role pins, stop numbering, labels, hover growth, a category pin per stop and a finish image of your own
- Map theme - A route following the accent of a theme
- Custom charging stops - Charging stop icons of your own, picked per stop