Outdoor basemaps with the terrain already in them
Contour lines, hillshading and water depths are layers in the style, not a second service to wire up. Trail difficulty grades come through in the data. One style URL, no API key, no sign-up.
map.setStyle("https://styles.maptoolkit.org/hiking.json");
The terrain arrives with the style
These are the layers doing the work, and which of the styles carry them. All are served live, at no cost, with no separate elevation service to configure.
Contour lines
Three contour layers in every style, from a dedicated vector source. Winter draws them in a single colour so they stay legible against snow; the others use multicoloured contours that read against forest and rock.
Hillshading, one pass or four
Summer, Cycling, Street, Light and Dark use one gentle pass. Hiking and Winter run four: three ambient-occlusion passes at increasing blur radius plus a dramatic pass, which is why mountains read as mountains on them.
Rock texture
Hiking, Cycling and Winter overlay a rock-texture raster on steep ground, so a cliff face looks like rock rather than a shaded slope. Summer relies on hillshading and land cover instead.
Water depths
A color-relief bathymetry layer in every style, driven by its
own elevation source, so lakes and coastal shelves shade by depth rather
than filling flat blue.
Paths and waymarked routes
Paths, tracks and footways across eight to twelve layers depending on the style, and waymarked route relations with their own shields, so a numbered long-distance route reads as one line rather than a chain of segments.
Aerialways all year
Gondolas, cable cars and chair lifts render with labels in every outdoor style, summer as well as winter, which matters for routes that start or finish at a lift station.
Every map using these tiles keeps the Maptoolkit logo and the copyright line visible. The attribution guide covers the exact requirement and the drop-in plugins for MapLibre and Leaflet.
Difficulty grades a generic basemap does not carry
The road layer carries the OpenStreetMap outdoor tags alongside the
usual classification. This is the part that cannot be copied by pointing a
renderer at a different free tile server, because the fields have to be in the
tiles before any style can use them.
Difficulty
sac_scale for hiking, graded T1 to T6.
mtb_scale for mountain biking, 0 to 6.
via_ferrata_scale for protected climbing routes, A to E.
Networks and surface
walking_network and cycling_network for
membership of a local, regional, national or international route network,
and surface for whether a track is gravel, compacted or paved.
// Pick out anything above SAC T3, so an easy-walking audience
// is not sent up something that needs hands.
map.addLayer({
id: 'hard-paths',
type: 'line',
source: 'mtk',
'source-layer': 'road',
filter: ['in', ['get', 'sac_scale'], ['literal', ['T4', 'T5', 'T6']]],
paint: { 'line-color': '#9E4130', 'line-dasharray': [2, 2], 'line-width': 1.6 }
});
The full field list and the values each tag takes are in the outdoor tags reference.
Three styles built on it
Same tiles and the same outdoor data underneath. What differs is which of it each style pushes forward.
Hiking
132 layers. Six for waymarked routes and their shields, nine path layers, four hillshade passes, roads held back. The one to use when the trail is the subject.
Cycling
134 layers, the largest of the seven. Nineteen for cycling alone, including the numbered node networks used across the Benelux, and one gentle hillshade so route lines keep their contrast.
Ski and winter
118 layers. Piste difficulty colour-coded on the European convention, nordic trails graded separately, eight lift types and run numbers from the piste reference.
Terrain in 3D, or your own cartography
3D terrain and buildings
Add -3d to any style name and the map has terrain, configured
against the same elevation model the hillshading uses. Street draws buildings
in 3D as well.
Design your own style
Restyle any of the seven in the browser and host the result yourself, with the outdoor data still underneath it. The published styles are the starting point.
Frequently asked questions about outdoor maps
Do I need a separate terrain source for the hillshading?
No. The contour lines, hillshading and water depths are layers inside the
style, already pointing at the elevation model. Give MapLibre a style URL
and they render, with nothing to configure and no second service to sign up
for. Only the -3d variants add a terrain mesh on top of that.
How far in can I zoom?
The data stops at zoom 15. Past that the renderer overzooms, so labels and geometry stay sharp but no new detail arrives. For trail, resort and route work 15 is enough.
Can I get elevation numbers out of this?
Not from the tiles. The contours and hillshading are cartographic, drawn to be read rather than measured, so sampling them will not give you usable figures. Elevation per coordinate is the Elevation API on maptoolkit.com, a separate paid service.
How current is the OpenStreetMap data?
Weekly. A trail, a lift or a re-graded route mapped in OpenStreetMap today reaches the tiles within the week, with no pipeline of your own to maintain.
Can I use this in something I sell?
Under the Community License, yes, if the organisation is under EUR 1 million annual consolidated revenue and has fewer than 10 full-time employees. Past either threshold the commercial tiles on maptoolkit.com apply. Non-commercial and community projects have no thresholds at all.
What happens when my traffic spikes?
Unregistered traffic gets 120 tiles per second sustained and 200 in burst per website, with a 40 tiles per second cap per visitor IP. Cached tiles do not count, and the edge cache absorbs most requests. There is no SLA on the community service, so it is not the right choice behind anything life-safety or billing-critical.