Skip to content

Tilesets

We prepare and publish a number of ready-to-use tilesets. There are two ways to use them:

TilesetTypeZoomDownloadMaturityHosted as
OSM Shortbreadvector0–1462 GBstable
OSM + Landcovervector0–1464 GBbetaosm
Hillshadevector0–12105 GBalphahillshade-vectors
Landcovervector0–101.9 GBbeta
Bathymetryvector0–100.7 GBalphabathymetry-vectors
Elevationraster0–12407 GBbetaelevation
Satelliteraster0–12 globally, more regionally1.6 TBalphasatellite

The hosted osm tileset is the merged OSM + Landcover variant. File sizes are approximate and grow over time — download.versatiles.org is the authoritative source.

Getting the containers

Beyond the plain download links below, the download server also offers:

  • Dated snapshots of the OSM tilesets (e.g. osm.20260608.versatiles) next to the always-current osm.versatiles, plus an RSS feed per tileset so you can watch for new builds.
  • Format conversion and bounding-box extracts on the fly: pick .versatiles, .pmtiles, .mbtiles or .tar and an area, and the site generates the matching versatiles convert or curl command for you. A regional extract is usually a few hundred megabytes instead of tens of gigabytes.
  • A URL list (urllist_<tileset>.tsv) per tileset for scripted downloads.

OSM Shortbread Vector Tiles

Example of OSM Shortbread

A set of general purpose vector tiles based on OpenStreetMap data using the Shortbread schema, covering the whole planet from zoom level 0 to 14.

IMPORTANT

The hosted tileset at https://tiles.versatiles.org/tiles/osm/{z}/{x}/{y} is the merged variant: it contains OpenStreetMap and landcover data. If you use it, you must also attribute ESA WorldCover — see Landcover below.

Style

There are several ready-made Public Domain styles available.

Licence & Attribution

Hillshade

Example of Hillshade

A set of general purpose vector tiles for simulating a shaded relief. Based on Mapzen Jörð Terrain Tiles, inspired by Datawrapper.

TIP

Hillshading as vector polygons is cheap to render and works in any MapLibre style, but the container is large and the result is coarse above zoom level 12. If you can afford a raster-dem source and the larger download, Elevation gives you MapLibre's own hillshading and 3D terrain from a single tileset, at any zoom level up to 12.

Style

There is one layer called hillshade-vectors with a property shade:

  • light Light Shades
  • dark Dark Shades

Example

js
{
  // ...
  "sources": {
    "versatiles-hillshade": {
      "tilejson": "3.0.0",
      "name": "VersaTiles Hillshade Vectors",
      "description": "VersaTiles Hillshade Vectors based on Mapzen Jörð Terrain Tiles",
      "attribution": "<a href=\"https://github.com/tilezen/joerd/blob/master/docs/attribution.md\">Mapzen Terrain Tiles, DEM Sources</a>",
      "tiles": ["https://tiles.versatiles.org/tiles/hillshade-vectors/{z}/{x}/{y}"],
      "type": "vector",
      "scheme": "xyz",
      "format": "pbf",
      "bounds": [ -180, -85.0511287798066, 180, 85.0511287798066 ],
      "minzoom": 0,
      "maxzoom": 12,
      "vector_layers":[{ "id": "hillshade-vectors", "fields": { "shade": "String" }, "minzoom": 0 ,"maxzoom": 12 }]
    }
  },
  "layers": [
    {
      "id": "hillshade-light",
      "type": "fill",
      "source-layer": "hillshade-vectors",
      "source": "versatiles-hillshade",
      "filter": [ "all", ["==", "shade", "light"] ],
      "paint": {
        "fill-color": "#ffffff",
        "fill-opacity": { "stops": [[0, 0], [4, 0.2]] },
        "fill-antialias": true,
        "fill-outline-color": "#ffffff00"
      }
    },
    {
      "id": "hillshade-dark",
      "type": "fill",
      "source-layer": "hillshade-vectors",
      "source": "versatiles-hillshade",
      "filter": [ "all", ["==", "shade", "dark"] ],
      "paint": {
        "fill-color": "#000000",
        "fill-opacity": { "stops": [[0, 0], [4, 0.05]] },
        "fill-antialias": true,
        "fill-outline-color": "#00000000"
      }
    }
  ]
}

Licence & Attribution

Landcover

Example of Landcover

A set of vector tiles based on ESA WorldCover satellite data. Shortbread's land and water_polygons layers are derived purely from OpenStreetMap, so they are sparse and only start at higher zoom levels — a world map at zoom 0–6 shows almost no land cover. This tileset fills exactly that gap with a complete, generalized classification from global satellite imagery.

It is not served standalone on tiles.versatiles.org; the hosted osm tileset already includes it.

Style

IMPORTANT

This tileset does not define a layer of its own. It writes into Shortbread's existing land and water_polygons layers, using Shortbread's existing kind values (forest, farmland, residential, bare_rock, heath, scrub, grassland, marsh, swamp, glacier, water) — only below the zoom level where OSM introduces each kind, so the two never overlap.

Because it adds no new layers or attributes, no new style rules are needed for the data to validate and render as ordinary Shortbread. But the stock styles fade these kinds in at the zoom level where OSM introduces them, so the low-zoom cover stays invisible until you ask for it. Since @versatiles/style v5.13.0, one option does that:

js
import { colorful } from '@versatiles/style';

const style = colorful({ experimental: { landcover: true } });

This drops the zoom-based fill-opacity fade-in from every layer that renders a land cover kind, so land and water_polygons are drawn from zoom level 0. It affects colorful and its variants (graybeard, eclipse, shadow) as well as neutrino. Only enable it on a tileset that actually has the land cover merged in — on plain OSM tiles the affected layers would pop in abruptly instead of fading.

The full ESA WorldCover → Shortbread mapping, the per-kind zoom cutoffs and the reasoning behind the lossy generalizations are documented in Shortbread Low-Zoom Land Cover.

Merging it yourself

If you don't want the pre-merged osm-landcover.versatiles, feature-merge the two containers with the VersaTiles CLI:

bash
versatiles convert '[,vpl](from_merged_vector [ from_container filename="https://download.versatiles.org/osm.versatiles", from_container filename="https://download.versatiles.org/landcover-vectors.versatiles" ])' combined.versatiles

NOTE

The merge is processing-heavy and can take hours. That is exactly the work the pre-merged download saves you.

Licence & Attribution

  • ESA WorldCover is licensed CC BY 4.0
  • The VersaTiles Landcover Vectors tileset is derived from ESA WorldCover and therefore also licensed CC BY 4.0
  • Attribution: © ESA WorldCover project 2021 / Contains modified Copernicus Sentinel data (2021) processed by ESA WorldCover consortium

Bathymetry

Example of Bathymetry

A set of vector tiles based on Bathymetry Shapefiles from OpenDEM.

Style

There is one layer called bathymetry with a numeric property mindepth. Its values are negative metres below sea level (0 being the coastline contour), and the steps get finer with each zoom tier:

Zoommindepth values
0–50, -100, -500, -1000, -2000, -4000, -6000, -8000
6–90, -50, -100, -500, -1000, -1500, -2000, -3000, -4000, -5000, -6000, -7000, -8000, -9000
10-25, -50, -100, -200, -250, -500, -750, -1000, -1250, -1500, -1750, -2000, -2500, -3000, -3500, -4000, -4500, -5000, -5500, -6000, -6500, -7000, -7500, -8000, -8500, -9000, -9500

The deepest steps only occur where such depths actually exist, so most tiles carry a subset of these values.

Example

js
{
  // ...
  "sources": {
    "bathymetry-gebco-opendem": {
      "tilejson": "3.0.0",
      "name": "OpenDEM GEBCO Bathymetry",
      "description": "Bathymetry Vectors based on GEBCO 2021 derived contour polys provided by OpenDEM",
      "attribution": "Derived product from the <a href=\"https://www.gebco.net/data_and_products/historical_data_sets/#gebco_2021\">GEBCO 2021 Grid</a>, made with <a href=\"https://www.naturalearthdata.com/\">NaturalEarth</a> by <a href=\"https://opendem.info\">OpenDEM</a>",
      "tiles": ["https://tiles.versatiles.org/tiles/bathymetry-vectors/{z}/{x}/{y}"],
      "type": "vector",
      "scheme": "xyz",
      "format": "pbf",
      "bounds": [ -180, -81.2550323, 180, 85.0511288 ],
      "minzoom": 0,
      "maxzoom": 10,
      "vector_layers":[{ "id": "bathymetry", "fields": { "mindepth": "Number" }, "minzoom": 0 ,"maxzoom": 10 }]
    }
  },
  "layers": [
    {
      "id": "bathymetry-gebco-opendem",
      "type": "fill",
      "source": "bathymetry-gebco-opendem",
      "source-layer": "bathymetry",
      "layout": {
        "visibility": "visible"
      },
      "paint": {
        "fill-opacity": 1,
        "fill-antialias": false,
        "fill-color": ["case",
          ["==", ["get", "mindepth"], -25], "#0084bd",
          ["==", ["get", "mindepth"], -50], "#0181ba",
          ["==", ["get", "mindepth"], -100], "#017fb6",
          ["==", ["get", "mindepth"], -200], "#027cb3",
          ["==", ["get", "mindepth"], -250], "#0279af",
          ["==", ["get", "mindepth"], -500], "#0276ac",
          ["==", ["get", "mindepth"], -750], "#0374a8",
          ["==", ["get", "mindepth"], -1000], "#0371a5",
          ["==", ["get", "mindepth"], -1250], "#036ea1",
          ["==", ["get", "mindepth"], -1500], "#036c9e",
          ["==", ["get", "mindepth"], -1750], "#03699b",
          ["==", ["get", "mindepth"], -2000], "#036797",
          ["==", ["get", "mindepth"], -2500], "#036494",
          ["==", ["get", "mindepth"], -3000], "#036191",
          ["==", ["get", "mindepth"], -3500], "#035f8d",
          ["==", ["get", "mindepth"], -4000], "#035c8a",
          ["==", ["get", "mindepth"], -4500], "#035a87",
          ["==", ["get", "mindepth"], -5000], "#025783",
          ["==", ["get", "mindepth"], -5500], "#025580",
          ["==", ["get", "mindepth"], -6000], "#02527d",
          ["==", ["get", "mindepth"], -6500], "#025079",
          ["==", ["get", "mindepth"], -7000], "#014d76",
          ["==", ["get", "mindepth"], -7500], "#014b73",
          ["==", ["get", "mindepth"], -8000], "#014870",
          ["==", ["get", "mindepth"], -8500], "#01466c",
          ["==", ["get", "mindepth"], -9000], "#004369",
          ["==", ["get", "mindepth"], -9500], "#004166",
          "#0097d6"
        ]
      }
    }
  ]
}

Licence & Attribution

Elevation

Example of Elevation

Global elevation data encoded as raster tiles in Terrarium format. The underlying DEM data is sourced from mapterhorn.com. To reduce file size by roughly 40 %, the elevation values are quantised before encoding — the resulting precision loss is visually unnoticeable for hillshading and 3D terrain.

Format

512 × 512 pixel WebP tiles, zoom levels 0 to 12. Each pixel encodes the elevation in metres as:

elevation (m) = (red × 256 + green + blue / 256) − 32768

Style

Use it as a raster-dem source in MapLibre for hillshading or 3D terrain:

js
{
  // ...
  "sources": {
    "versatiles-elevation": {
      "type": "raster-dem",
      "tiles": ["https://tiles.versatiles.org/tiles/elevation/{z}/{x}/{y}"],
      "tileSize": 512,
      "minzoom": 0,
      "maxzoom": 12,
      "encoding": "terrarium",
      "attribution": "<a href=\"https://mapterhorn.com/attribution\">© Mapterhorn</a>"
    }
  },
  "terrain": { "source": "versatiles-elevation", "exaggeration": 1.5 },
  "layers": [
    {
      "id": "hillshade",
      "type": "hillshade",
      "source": "versatiles-elevation",
      "paint": { "hillshade-exaggeration": 0.5 }
    }
  ]
}

Licence & Attribution

Satellite

Satellite and orthophoto imagery from open data sources, available as 512 × 512 pixel WebP raster tiles.

NOTE

Coverage is not uniform. Satellite imagery covers the whole planet up to about zoom level 12. Beyond that, the tileset is built from high-resolution orthophotos published by European national mapping agencies, so deep zoom levels are only available for a growing set of European countries, and the maximum zoom differs per region. Outside those regions, tiles above zoom 12 do not exist.

Style

js
{
  // ...
  "sources": {
    "versatiles-satellite": {
      "type": "raster",
      "tiles": ["https://tiles.versatiles.org/tiles/satellite/{z}/{x}/{y}"],
      "tileSize": 512,
      "minzoom": 0,
      "maxzoom": 12,
      "attribution": "<a href=\"https://versatiles.org/sources/\">VersaTiles sources</a>"
    }
  },
  "layers": [
    {
      "id": "satellite",
      "type": "raster",
      "source": "versatiles-satellite"
    }
  ]
}

To make MapLibre zoom past the source's maxzoom by upscaling the last available tile, raise the layer's maxzoom above the source's — useful for the regions with deeper orthophoto coverage.

Licence & Attribution

See the repository for the full list of data sources and their attribution requirements.

Released under Unlicense