Skip to content
Terrainly Open viewer

Guide · 7 min read · Updated November 2026

Where to download free DEMs

Good elevation data is free almost everywhere now. This guide points you to the best sources for Canada, the United States and the rest of the world, and shows how to grab just the small area you need instead of a multi-gigabyte file.

Choosing a dataset

  • Resolution. 1 m shows individual buildings and road edges; 30 m shows hills and valleys. Finer isn’t always better: it means far bigger files.
  • Surface or terrain. A DSM includes trees and rooftops; a DTM is bare earth. See DEM vs DSM vs DTM.
  • Coverage. The best data (lidar) exists mainly around populated areas. Satellite datasets cover everything but at 30 m.

Canada

HRDEM: High Resolution DEM (Natural Resources Canada)

Part of NRCan’s CanElevation series. Derived from airborne lidar (mainly in the south) and satellite imagery in the north, at 1 m or 2 m resolution. NRCan reports that around 92% of Canadians live inside the covered area. Both a terrain model (DTM) and a surface model (DSM) are published. Files use the Canada Atlas Lambert projection (EPSG:3979), which the viewer reads.

MRDEM-30: complete coverage at 30 m

NRCan’s Medium Resolution DEM covers all of Canada. Where lidar exists it is the HRDEM resampled to 30 m; elsewhere it is derived from the Copernicus DEM with forests and settlements removed. Also in EPSG:3979.

United States

The USGS 3D Elevation Program (3DEP) offers 1 m DEMs where lidar coverage exists, plus seamless national DEMs at roughly 10 m (1/3 arc-second), 30 m (1 arc-second) and 60 m (2 arc-seconds).

Worldwide

Copernicus GLO-30 (30 m)

A global surface model derived from radar data from the TanDEM-X mission, published by the European Space Agency. Good, consistent coverage almost everywhere on Earth.

SRTM

NASA’s 2000 radar mission covers most land between about 60°N and 56°S at roughly 30 m. It’s older than Copernicus but widely used; you can find it on OpenTopography and the USGS EarthExplorer.

Download only the area you need (tested code)

Several of these datasets are stored as Cloud-Optimized GeoTIFFs: a clever layout that lets software download just a small window of a huge file. This Python script (needs pip install rasterio) saves an area of about 8 × 11 km of the 30 m Copernicus DEM around Ottawa. Change lon, lat and the tile name for your area.

import rasterio
from rasterio.windows import from_bounds

# Copernicus GLO-30 tile covering Ottawa (tiles are named by their south-west corner)
url = "https://copernicus-dem-30m.s3.amazonaws.com/Copernicus_DSM_COG_10_N45_00_W076_00_DEM/Copernicus_DSM_COG_10_N45_00_W076_00_DEM.tif"
lon, lat, half = -75.70, 45.42, 0.05   # centre and half-width in degrees

with rasterio.open(url) as src:
    window = from_bounds(lon - half, lat - half, lon + half, lat + half, src.transform)
    data = src.read(1, window=window)               # only this window is downloaded
    profile = src.profile
    profile.update(height=data.shape[0], width=data.shape[1],
                   transform=src.window_transform(window), compress="deflate")
    with rasterio.open("ottawa-copernicus.tif", "w", **profile) as dst:
        dst.write(data, 1)

For Canada’s 1 m lidar the idea is the same, except the file is in metres (EPSG:3979), so the script first converts your longitude and latitude into the file’s own coordinates. This example saves a 2 km × 2 km square around Parliament Hill:

import rasterio
from rasterio.warp import transform
from rasterio.windows import from_bounds

# NRCan HRDEM 1 m mosaic, tile 9_2 (covers downtown Ottawa at the time of writing), terrain model
url = "https://canelevation-dem.s3.ca-central-1.amazonaws.com/hrdem-mosaic-1m/9_2-mosaic-1m-dtm.tif"
lon, lat, half = -75.7009, 45.4236, 1000      # centre in lon/lat, half-width in metres

with rasterio.open(url) as src:
    x, y = transform("EPSG:4326", src.crs, [lon], [lat])
    window = from_bounds(x[0] - half, y[0] - half, x[0] + half, y[0] + half, src.transform)
    data = src.read(1, window=window)
    profile = src.profile
    profile.update(height=data.shape[0], width=data.shape[1],
                   transform=src.window_transform(window), compress="deflate", tiled=False)
    with rasterio.open("ottawa-hrdem-1m.tif", "w", **profile) as dst:
        dst.write(data, 1)

Finding your tile: the HRDEM mosaic is split into large numbered tiles (8_2, 9_2 and so on). Each has a matching …-extent.geojson file in the same folder that you can open in a GIS to see what it covers. Tile boundaries can change as NRCan adds data.

Then open the viewer and drop the saved file in. Keep windows modest: a 2 km square at 1 m is 4 million cells, which opens instantly, while very large windows get shown as a reduced-resolution preview.

Licences

Always check the licence of the dataset you use. Canada’s HRDEM is published under the Open Government Licence – Canada, which allows reuse with attribution. USGS data is generally public domain, and Copernicus data comes with its own terms of use. When in doubt, read the dataset’s page before republishing images made from it.

Got a file? Look at it.

Drop it into the viewer. Free, private, nothing to install.

Open the viewer →