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",
});
map.addLayer({
id: "contour-regular", type: "line",
source: "contours", "source-layer": "contour",
filter: ["!=", ["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: ["==", ["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:
https://contour-tiles.aus-map-data.workers.dev/contours/{z}/{x}/{y}.pbf
Prefer the pmtiles:// URL where you can — it's served by dumb storage and
will always be the more reliable of the two.
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 — integer metres · is_index — 1 on 50 m multiples (bold "index" lines), else 0 |
| 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).