Free contour-line vector tiles for the whole of Australia — 10 m intervals derived from Geoscience Australia's 1-second DEM, smoothed so they look like a printed topo map rather than a pixel lattice. One PMTiles file, no API key, no server required.
Live demo — contours are range-read straight out of the 11.9 GB archive in your browser; basemap by OpenFreeMap. Zoom in for full 10 m detail.
The archive is served with CORS enabled and HTTP range support, so MapLibre can read tiles directly from it using the pmtiles protocol — no tile server involved:
<!-- maplibre-gl v5 is the last major with a script-tag (UMD) build; v6+ is ESM-only -->
<script src="https://cdn.jsdelivr.net/npm/maplibre-gl@5.24.0/dist/maplibre-gl.js"></script>
<script src="https://cdn.jsdelivr.net/npm/pmtiles@4.5.0/dist/pmtiles.js"></script>
<script>
const protocol = new pmtiles.Protocol();
maplibregl.addProtocol("pmtiles", protocol.tile);
const map = new maplibregl.Map({ container: "map", /* your base style */ });
map.on("load", () => {
map.addSource("contours", {
type: "vector",
url: "pmtiles://ARCHIVE_URL",
attribution: "Contours © Geoscience Australia, CC-BY 4.0",
});
// is_index arrives as the STRING "0"/"1", so wrap it in to-number —
// ["==", ["get","is_index"], 1] silently matches nothing.
map.addLayer({
id: "contour-regular", type: "line",
source: "contours", "source-layer": "contour",
filter: ["!=", ["to-number", ["get", "is_index"]], 1],
paint: { "line-color": "rgb(179,134,89)", "line-width": 0.5, "line-opacity": 0.5 },
});
map.addLayer({
id: "contour-index", type: "line",
source: "contours", "source-layer": "contour",
filter: ["==", ["to-number", ["get", "is_index"]], 1],
paint: { "line-color": "rgb(166,116,66)", "line-width": 1.1, "line-opacity": 0.65 },
});
});
</script>
The same file works anywhere PMTiles is supported: MapLibre (web and native),
QGIS 3.32+, Felt, and the pmtiles CLI.
If your client can't speak PMTiles, a conventional tile endpoint fronts the same archive, edge-cached on Cloudflare's network:
https://tiles.contour-map-tiles.net/contours/{z}/{x}/{y}.pbf
Empty tiles (ocean, or outside Australia) answer 204 rather than
404. Prefer the pmtiles:// URL where you can — it's served straight
from storage with no request limits in front of it.
Grab the whole continent (11.9 GB):
curl -O ARCHIVE_URL
Or pull just your area of interest with the pmtiles CLI — this range-reads only the tiles inside your bounding box, so it's fast and small (Tasmania is ~350 MB, a single national park usually a few MB):
# bbox = minLon,minLat,maxLon,maxLat (this one is Tasmania)
pmtiles extract ARCHIVE_URL \
tasmania-contours.pmtiles \
--bbox=144.5,-43.9,148.5,-39.5
Need MBTiles for an offline mobile app? pmtiles convert does the conversion.
| Layer | One vector layer, contour (MVT/pbf, gzip) |
|---|---|
| Attributes | elevation — metres, a number · is_index — "1" on 50 m multiples (bold "index" lines), else "0".
Note the quotes: is_index is encoded as a string, so compare it with
["==", ["to-number", ["get", "is_index"]], 1] — a plain
["==", ["get", "is_index"], 1] is type-strict in MapLibre and silently matches nothing,
which renders every line at intermediate weight with no labels. |
| Interval | 10 m contours, 50 m index contours |
| Zoom range | z9–z15 (overzooms cleanly beyond 15) |
| Density by zoom | z9: 100 m contours · z10–11: 50 m · z12: 20 m · z13+: full 10 m |
| Coverage | Mainland Australia + Tasmania (112.92°E–154°E, 43.86°S–10°S) |
| Source DEM | Geoscience Australia 1-second SRTM DEM-S (smoothed variant, ~30 m resolution) |
| Size | 11.9 GB, ~8.5 million tiles |
| Built with | GDAL (cubic-spline oversampled warp + gdal_contour) and tippecanoe |
The DEM is warped to 2× its native density with cubic-spline resampling before contouring, which traces smooth curves between the 30 m elevation samples instead of polygonal lines along the pixel lattice. Australia is processed as 2°×2° cells with buffered edges, so contours join seamlessly across cell boundaries.
This tileset is a by-product of building offline topo maps for
a hiking-trail guide app. The full pipeline —
chunked, resumable, one continent on one machine — is open source in that repo:
scripts/build-contours-australia.ts.
A write-up of the build (and the failures along the way) is coming soon.
Elevation data © Commonwealth of Australia (Geoscience Australia), licensed under CC-BY 4.0. The derived contour tiles are likewise CC-BY 4.0 — free for any use, including commercial, with attribution.
Suggested map attribution:
Contours © Geoscience Australia, CC-BY 4.0
The tiles are provided as-is, with no uptime guarantee — for production use, please
pmtiles extract your region and host it yourself (any static bucket works).