Map modules
Map Modules are self-contained extensions that add specialized functionality to a TomTomMap instance.
Each module provides focused capabilities for different mapping needs — from displaying traffic information to handling user-generated content — while following a consistent pattern for initialization, configuration, and lifecycle management that makes them easy to integrate and use together.
Key features
- Composition: Modules can be combined to work together seamlessly. Whether a given module type can be instantiated more than once on the same map depends on who owns the layers it controls — see Types of modules below.
- Data management: Modules handle their own data sources and rendering
- Style integration: Modules automatically integrate with map styles and themes
- Statefulness: Modules maintain their own state and configuration independently. Modules restore their state when the map style changes.
- Smart event handling: Modules provide their own event systems for user interactions with seamless mapping to the original typed data.
- Service integration: Seamless integration with TomTom services for added data such as places, routes and geometries
- Lazy loading: Modules are loaded only when needed for optimal performance
Types of modules
There are two types of modules in the TomTom Maps SDK, depending on who owns the sources and layers the module controls. Ownership decides both the factory you call and how many instances make sense on one map.
Style-owned modules — get(map, config?)
These modules do not display data of their own. They control sources and layers that the map style already provides — the base map, POI symbols, the traffic tile layers, hillshade — under source and layer IDs that are fixed and global to the style.
A style-owned module is therefore a shared controller, not a piece of content. get() is a lookup, and quite literally so: the SDK keeps one instance per map, so calling it twice returns the same module. Two components can each ask for hillshade without coordinating, and neither has to hoist a shared reference.
Calling get(map) with no configuration is a plain accessor — it changes nothing. Calling it with a configuration applies that configuration to the instance that already exists.
To handle events for only part of what a style-owned module covers, scope the events rather than creating a second module — see Scoped events.
Data-owned modules — create(map, config?)
These modules bring their own data. They add the GeoJSON sources, layers and sprite images they need and own them for their whole lifetime, with every identifier suffixed per instance.
Instances are therefore fully independent: create() builds a new module every time, and stacking several of them on one map — one set of places per search, one route per plan — is a supported thing to do. Nothing is shared or reused between them.
Per-module reference
| Module | Kind | Factory | Instances per map | Why |
|---|---|---|---|---|
| BaseMapModule | Style-owned | get() | One per map | One global vector-tile source. To act on part of the map, scope its events with events.where({ layerGroups }) rather than creating a second module. |
| POIsModule | Style-owned | get() | One per map | Fixed POI source and layer IDs; visibility and category filters are global to the map. |
| TrafficFlowModule | Style-owned | get() | One per map | Fixed traffic-flow source; visibility and filters are global to the map. |
| TrafficIncidentsModule | Style-owned | get() | One per map | Fixed traffic-incident source; visibility and filters are global to the map. |
| HillshadeModule | Style-owned | get() | One per map | Fixed hillshade source; visibility is global to the map. |
| PlacesModule | Data-owned | create() | Multiple | Owns its own place source, layers and pin images, suffixed per instance. |
| RoutingModule | Data-owned | create() | Multiple | Owns its own route, waypoint and section sources and layers, suffixed per instance. |
| GeometriesModule | Data-owned | create() | Multiple | Owns its own geometry and label sources, suffixed per instance. |
| CustomGeoJSONModule | Data-owned | create() | Multiple | Owns the sources and layers declared in its own sources config, suffixed per instance. |
| TrafficIncidentOverlayModule | Data-owned | create() | Multiple | Owns the GeoJSON source and layers for the incidents you fetched yourself. |
| TrafficAreaAnalyticsModule | Data-owned | create() | Multiple | Owns the grid/heatmap source and layers it renders your analytics into. |
List of modules
Base map module
A BaseMapModule provides visibility and events for layer groups of the base map.
import { BaseMapModule } from '@tomtom-org/maps-sdk/map';
const baseMapModule = await BaseMapModule.get(map);
// Toggle visibility, for the whole base map or for specific layer groupsbaseMapModule.setVisible(true);baseMapModule.setVisible(false, { layerGroups: { mode: 'include', names: ['borders', 'buildings2D'] } });Learn more about Base Map Module →
Places module
A PlacesModule handles search results visualization and place information display.
import { PlacesModule } from '@tomtom-org/maps-sdk/map';import { search } from '@tomtom-org/maps-sdk/services';
// Initialize places moduleconst placesModule = await PlacesModule.create(map);
// Search and display resultsconst results = await search({ query: 'restaurants near me' });await placesModule.show(results);
// Handle place interactions — `events.places` is the pins alone, typed as PlaceplacesModule.events.places.on('click', (place) => { console.log('Selected place:', place.properties.title);});Learn more about Places Module →
POIs module
A POIsModule controls the display and events for Points of Interest with category-based filtering and styling.
import { POIsModule } from '@tomtom-org/maps-sdk/map';
// Display specific POI categoriesconst poisModule = await POIsModule.get(map, { filters: { categories: { show: 'all_except', values: ['ELECTRIC_VEHICLE_STATION'] }, },});Learn more about POIs Module →
Routing module
A RoutingModule controls the display of routes, waypoints, and navigation instructions, and user events on such parts.
import { RoutingModule } from '@tomtom-org/maps-sdk/map';import { calculateRoute } from '@tomtom-org/maps-sdk/services';
// Initialize routing moduleconst routingModule = await RoutingModule.create(map);
// Calculate and display routeconst route = await calculateRoute({ geoInputs,});await routingModule.showRoutes(route);Learn more about Routing Module →
Traffic flow module
The TrafficFlowModule displays real-time traffic flow information with color-coded speed indicators.
import { TrafficFlowModule } from '@tomtom-org/maps-sdk/map';
// Add traffic flow visualizationconst trafficFlowModule = await TrafficFlowModule.get(map);
// Control traffic displaytrafficFlowModule.setVisible(true);
// Configure traffic stylingtrafficFlowModule.filter({ any: [{ showRoadClosures: 'only' }],});Learn more about Traffic Flow Module →
Traffic incidents module
The TrafficIncidentsModule shows traffic incidents like accidents, road closures, and construction.
import { TrafficIncidentsModule } from '@tomtom-org/maps-sdk/map';
// Display traffic incidentsconst trafficIncidentsModule = await TrafficIncidentsModule.get(map, { icons: { visible: false }, filters: { any: [{ magnitudes: { show: 'all_except', values: ['minor'] } }] },});Learn more about Traffic Incidents Module →
Geometries module
The GeometriesModule displays custom geometric data like polygons, lines, and markers.
import { GeometriesModule } from '@tomtom-org/maps-sdk/map';
// Initialize geometries moduleconst geometryModule = await GeometriesModule.create(map);
const geometryToSearch = await geometryData({ geometries: location });await geometryModule.show(geometryToSearch);Learn more about Geometries Module →
Custom GeoJSON module
The CustomGeoJSONModule renders your own GeoJSON data with typed sources, clustering, custom images, and style-change restoration.
import { CustomGeoJSONModule } from '@tomtom-org/maps-sdk/map';
const customModule = await CustomGeoJSONModule.create(map, { sources: { heatmap: { layers: [{ type: 'heatmap' }] } }});
await customModule.show(heatmapData, 'heatmap');Learn more about Custom GeoJSON Module →
Traffic incident overlay module
The TrafficIncidentOverlayModule renders a specific set of incidents you fetched yourself, rather than the live vector-tile layer.
import { TrafficIncidentOverlayModule } from '@tomtom-org/maps-sdk/map';import { trafficIncidentDetails } from '@tomtom-org/maps-sdk/services';
const overlay = await TrafficIncidentOverlayModule.create(map);
const result = await trafficIncidentDetails({ bbox });await overlay.show(result);Learn more about Traffic Incident Overlay Module →
Traffic area analytics module
The TrafficAreaAnalyticsModule visualizes aggregated traffic statistics for an area as a hexgrid, square grid, or heatmap.
import { TrafficAreaAnalyticsModule } from '@tomtom-org/maps-sdk/map';
const analyticsModule = await TrafficAreaAnalyticsModule.create(map, { displayMode: 'hexgrid-3d', activeMetric: 'congestionLevel',});
await analyticsModule.show(analyticsResult);analyticsModule.setMetric('speed');Learn more about Traffic Area Analytics Module →
Hillshade module
The HillshadeModule adds terrain elevation shading for topographic visualization.
import { HillshadeModule } from '@tomtom-org/maps-sdk/map';
const hillshadeModule = await HillshadeModule.get(map, { ensureAddedToStyle: true,});
// Toggle hillshade visibilityhillshadeModule.setVisible(true);