stac_dem_bc
serves British Columbia’s LidarBC digital
elevation model collection — nearly 100,000 GeoTIFFs on the provincial
objectstore as of July 2026 — as a SpatioTemporal Asset Catalog
(STAC), searchable by location and time from the
rstac R package, QGIS
(v3.42+), or any STAC-compliant client. The API endpoint is
https://images.a11s.one.
The catalog refreshes monthly: a scheduled GitHub Actions
workflow detects new tiles on the
objectstore and appends them incrementally, with each month’s changes
landing as a commit to data/ — a git audit trail of what was
added, removed, and validated. How the automation works, its failure
modes, and where the evidence lives are documented in
scripts/, alongside a plain-language guide to the
concepts behind the pipeline (COG, STAC, pgstac, validation caching).
Use bcdata to define an area of
interest, then query the stac-dem-bc collection for DEM tiles
intersecting it. Below: all DEMs covering the Bulkley River watershed
group between 2018 and 2020.
aoi <- bcdata::bcdc_query_geodata("freshwater-atlas-watershed-groups") |>
bcdata::filter(WATERSHED_GROUP_NAME == "Bulkley River") |>
bcdata::collect() |>
sf::st_transform(crs = 4326)
date_start <- "2018-01-01T00:00:00Z"
date_end <- "2020-12-31T00:00:00Z"
# use rstac to query the collection
q <- rstac::stac("https://images.a11s.one/") |>
rstac::stac_search(
collections = "stac-dem-bc",
intersects = jsonlite::fromJSON(
geojsonsf::sf_geojson(
aoi, atomise = TRUE, simplify = FALSE
),
simplifyVector = FALSE
) |> (\(x) x$geometry)(),
datetime = paste0(date_start, "/", date_end)
) |>
rstac::post_request()
# get details of the items
r <- q |>
rstac::items_fetch()
# burn the results locally so we can serve it instantly on index.html builds
saveRDS(r, "data/stac_result.rds")r <- readRDS("data/stac_result.rds")
# build the table to display the info
tab <- tibble::tibble(
url_download = purrr::map_chr(r$features, ~ purrr::pluck(.x, "assets", "image", "href"))
)Please see http://www.newgraphenvironment.com/stac_dem_bc for the published table of collection links.
QGIS 3.42 added native STAC support — connect directly to the catalog and filter by the current map view. See Lutra Consulting’s STAC-in-QGIS blog post for a walk-through.
The same images.a11s.one STAC API serves several complementary BC
collections:
stac_uav_bc— UAV imagery, organized by watershedstac_airphoto_bc— historic airphoto thumbnails (1963–2019)
The big one landed in 2026: the catalog is now self-updating (#23) — the goal open since the first build — and the July catch-up grew the collection from 58k to ~98k fully-validated items. Still ahead:
- Incremental registration — the post-sync pgstac registration is a full reload today (~80 minutes at current scale); upserting only each month’s new items brings it to seconds. Tracked in the infrastructure repo.
- Upstream-deletion handling (#28) — propagate objectstore removals to the catalog; on hold until the September run shows whether recent removals were renames.
- URL-encoded item hrefs (#25, fix in review as PR #26) — 90 legacy items carry literal spaces in their download links, which strict HTTP clients reject.
- True footprint geometry (#2) — recalculate per-item footprints to exclude no-data pixels rather than using bounding boxes; gives accurate spatial-overlap queries.
- Structured logging + performance benchmarking (#6) — instrument the pipeline so build performance is quantifiable across runs.
- uv-based Python dependency management (#16) — the CI workflow already installs with uv; migrate the local conda environment to match.
Browse open issues for the full backlog.
MIT.

