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

Terrain module

The Terrain Module draws the map's relief from the elevation data of the map style, in two ways that combine freely:

This module owns whether the hillshade is shown, how the shading looks (Appearance), and whether and how high the surface is raised. See Who owns what.

Initialization

import { TomTomMap, TerrainModule } from '@tomtom-org/maps-sdk/map';

const map = new TomTomMap({ mapLibre: { container: 'map' } });
const terrain = await TerrainModule.get(map, { hillshade: { visible: true }, elevation: { visible: true } });

Hillshade

One get with hillshade.visible shades the relief, as in the code below. Move the center to see another range:

Show the shading at initialization, or toggle it later:

const terrain = await TerrainModule.get(map, { hillshade: { visible: true } });

terrain.setHillshadeVisible(false);
terrain.isHillshadeVisible(); // false

isHillshadeVisible() reads back the hillshade.visible setting, which is false until something shows it.

Appearance

The shading's look sits beside visible under hillshade: its method (one of hillshadeMethods), its light (direction, altitude, and alignment, one of hillshadeLightAlignments), its intensity and maxZoom, and its colors per class of slope (shaded, lit, steep).

import { setKnob, TerrainModule, terrainKnobCatalogue } from '@tomtom-org/maps-sdk/map';

const terrain = await TerrainModule.get(map, {
    // Keep the shading at every zoom:
    hillshade: { visible: true, method: 'multidirectional', intensity: 0.5, maxZoom: 22 },
});
setKnob(terrain, terrainKnobCatalogue, 'hillshade.colors.shaded', '#3b2f2f');
setKnob(terrain, terrainKnobCatalogue, 'hillshade.light.alignment', 'map'); // the light stays put as the map rotates

The playground below sets every one of them over the Alps, with looks that recolour the relief and a sun that moves through the day:

3D elevation

Raise the surface with elevation.visible, and scale the relief with elevation.exaggeration (1 is true elevation). It scales height only. hillshade.intensity is the shading's strength and raises nothing:

import { setKnob, TerrainModule, terrainKnobCatalogue, TomTomMap } from '@tomtom-org/maps-sdk/map';

const map = new TomTomMap({
    mapLibre: { container: 'map', center: [7.66, 45.98], zoom: 12.5, pitch: 70, maxPitch: 85 },
});
const terrain = await TerrainModule.get(map, {
    elevation: { visible: true, exaggeration: 1.5 },
    hillshade: { visible: true },
});

setKnob(terrain, terrainKnobCatalogue, 'elevation.exaggeration', 2); // keeps the surface raised
terrain.setElevationVisible(false); // flat again, still shaded
terrain.isElevationVisible(); // false

isElevationVisible() reads the elevation.visible setting back. Until something sets it, it reports whether the map's own terrain raises the surface.

The 3D buildings of the base map (BaseMapModule layer group buildings3D) and the Landmarks 3D plugin stand on the raised surface.

Every setting as data

terrainKnobCatalogue lists every setting of the module's configuration as a knob. It reads with no map loaded, so a UI can build its controls from it:

import { knobEntryOf, terrainKnobCatalogue } from '@tomtom-org/maps-sdk/map';

const exaggeration = knobEntryOf(terrainKnobCatalogue, 'elevation.exaggeration');
// { id: 'elevation.exaggeration', kind: 'number', description: '…', range: { min: 0.5, max: 3, step: 0.1, bounds: 'hard-min' }, default: 1 }
Id Kind Default
hillshade.visible toggle false
hillshade.method enum: standard, basic, igor, combined, multidirectional none: the style's own
hillshade.light.direction number, 0–359 none: the style's own
hillshade.light.altitude number, 0–90 none: the style's own
hillshade.light.alignment enum: viewport, map none: the style's own
hillshade.intensity number, 0–1 none: the style's own
hillshade.maxZoom number, 10–22 none: the style's own
hillshade.colors.shaded, hillshade.colors.lit, hillshade.colors.steep colour none: the style's own
elevation.visible toggle none: flat, unless your MapLibre code raised a terrain
elevation.exaggeration number, at least 0.5 (hard-min) 1

Style changes

Both parts are map configuration, not style content. The module re-applies them on top of every style that setStyle loads, and a clean switch (resetState: true) turns them off. The sky above a tilted horizon is a styling knob, view.sky.visible, which a style switch keeps too. The playground below switches styles under a tilted camera, with terrain and sky kept:

Events

The hillshade is a raster layer with no features to click or hover, so the module has lifecycle events only:

terrain.events.on('config-change', (config) => {
    console.log('Terrain config changed:', config);
});

API reference

For complete documentation of all Terrain Module properties, methods, and types, see the TerrainModule API Reference.

Related guides and examples

Related examples

Related map modules