stac-floodplains-bc is a catalogue of how land cover changed on British Columbia’s floodplains between 2017 and 2023 — where trees were lost, where they came back, and over what extent — for 23 watershed groups in 4 regions. It is published as a SpatioTemporal Asset Catalog (STAC) — a standard for describing geospatial data so a client can search it by place, time and attribute without downloading anything first. It is for restoration planners, stewardship offices and researchers who want the underlying rasters rather than a summary of them. The endpoint is https://images.a11s.one, readable from the rstac R package, QGIS 3.42+, or any other STAC client.


Read this before you use the numbers

This is a screening and exploration tool, not a validated change-detection product. The floodplain is DEM-derived, the land cover is a global 10 m product applied to BC valley bottoms, and neither has been field-validated. The figures say where to look, not what happened on the ground. The two that bite hardest:

“Tree loss” means pixels leaving the tree class; acquisition timing within a year is unknown and unrecoverable from the source; and despite the ff names this is not a flood-frequency product. The full list lives with the modelling, in floodplains → Reading the outputs — read it before citing anything here. It is all published openly so it can be interrogated; please do, and file what you find.

What is in the catalogue

One item per watershed group, id <wsg>_all_ff04 — the floodplain of the group’s whole stream network, at order >= 2 with no access filter. (all is the producer’s token for that network, not a species. The id’s middle slot is a scenario’s species, so a group that modelled a single species again would publish <wsg>_<species>_ff0N.) Seven assets each, plus one per classified year — every one downloadable from its group’s popup on the interactive map:

asset what it is
classified_<year> land cover in that year, clipped to the floodplain, as a Cloud-Optimized GeoTIFF. Class colours and labels are inside the file, so it opens ready to read
transition_2017_2023 what each cell changed from and to between 2017 and 2023
floodplain the delineated floodplain at three flood factors — ff02, ff04 (functional floodplain), ff06 (valley bottom)
floodplain_landcover the classified years and the transition patches as polygons
transition_vector the transition patches alone — the change layer without the dissolved classified epochs, which carry most of the bytes
style_classified style_floodplain style_transition QGIS layer styles, also embedded in each GeoPackage so the layers open already coloured

The classified year set is a property of the item, not of the collection. Items modelled on the three-year span carry classified_2017, classified_2020 and classified_2023; items re-run on an annual span carry one asset per year across the same window. Read the item’s own asset list rather than assuming a count — transition_2017_2023 covers the same 2017-to-2023 window either way, so a cross-item comparison of the transition is unaffected.

Every asset publishes file:checksum and file:size, so you can confirm a download arrived intact and pin which build a figure came from. (A checksum answers are my bytes current, not did the values change — a re-encode moves every checksum.) Every GeoPackage data layer carries wsg, species and scenario, so items merged into one file stay separable by attribute. (Each file also holds a layer_styles table, which is QGIS’s own and carries no key — it is what makes the layers open already coloured.)

Each item’s GeoPackages hold only that item’s layers. Merging N items therefore gives you N copies of the same layer families and nothing retired — no second floodplain model from a target the group no longer publishes. floodplain.gpkg is the one place several scenario values appear under one item, because the ff02, ff04 and ff06 delineations each record their own flood factor.

Every item is ff04, the functional floodplain. floodplain.gpkg also carries the ff02 and ff06 (wider valley bottom) delineations, so compare those inside an item rather than across the catalogue. If a group ever publishes a second flood factor, filter on the flood_factor property before comparing or summing groups — an unfiltered aggregate would add different extents together.

Coverage

Generated from the live API on 2026-10-17: 23 items across 23 watershed groups in 4 regions (Columbia, Fraser, Peace, Skeena), catalogue version 2.0.1. NOTE: To view all columns in the table - please click on one of the sort arrows within column headers before scrolling to the right.

Gross loss is area tree-covered in 2017 but not 2023, gross gain the reverse, net is gain minus loss — so a negative number is net tree loss. Floodplain (km²) is each item’s own extent at its own flood factor, which is why the Flood factor column matters. Across the catalogue: 10,611 km² of floodplain, 32,366 ha lost, 21,667 ha gained, -10,699 ha net. That km² total counts each group’s ff04 extent once, so it stays correct if a group ever publishes two items over one physical floodplain, while the tree-change figures sum every item; rows are rounded, so a column need not sum exactly to its unrounded total.

Query it

library(rstac)

items <- rstac::stac("https://images.a11s.one/") |>
  rstac::stac_search(collections = "stac-floodplains-bc", limit = 1000) |>
  # add `rstac::ext_query(flood_factor == 6)` for valley-bottom items only. Filter on
  # flood_factor, not scenario: scenario is species-pinned and would miss a future co_ff06.
  rstac::post_request() |>
  rstac::items_fetch()

A raster asset streams — no download needed. Paste the /vsicurl/ path into QGIS’s Add Raster Layer dialog, or read it from the command line. GDAL_DISABLE_READDIR_ON_OPEN stops GDAL spending a dozen wasted requests probing for sidecar files that are not there:

GDAL_DISABLE_READDIR_ON_OPEN=EMPTY_DIR \
  gdalinfo /vsicurl/https://stac-floodplains-bc.s3.us-west-2.amazonaws.com/kotl_all_ff04/classified_2023.tif

From QGIS, filtered to your area of interest

QGIS 3.42+ speaks STAC natively — Data Source Manager → STAC → New, with the endpoint URL and no authentication:

The QGIS STAC Connection dialog with the URL https://images.a11s.one/ entered and authentication set to none.

Then Filters… restricts the search to your own area of interest — Spatial Extent takes the current map view or any extent you draw, Temporal Extent a date range — so you get back only the items covering the ground you are working on. The dialog below is shown against a sister collection on the same endpoint; it works identically here.

The QGIS STAC filter dialog showing a Spatial Extent bounding box and start and end dates.

Lutra Consulting’s STAC in QGIS post walks through it in more detail.

How it is built, and where

No modelling happens in this repository. Every number in this catalogue is produced by floodplains — the driver repo, and the place to go for how the model works, what it assumes, and what is still unresolved. This repository only stages those outputs, converts the rasters to Cloud-Optimized GeoTIFFs, tags them, uploads them, and registers the STAC collection. If a figure needs recomputing it is fixed there and republished here. The chain, each link its own repository:

fresh (stream network) → link (habitat interpretation) → flooded (floodplain delineation) → drift (land-cover change) → floodplains (driver) → this repository (publish only)

The rebuild and release commands, the guards protecting a bucket with no versioning, and the release recipe are in scripts/README.md.

Credits

Two different debts, and they are not the same thing.

Method and software this work is built on

whose what licence
Devin Cairns — BlueGeo the Valley Confinement Algorithm that flooded adapts MIT
USDA Rocky Mountain Research Station the original valley-confinement method — the VCA Toolbox —
Simon Norris — bcfishpass lateral habitat assembly, and the modelling approach link reproduces Apache 2.0 (software); its database is ODbL and the contents DbCL

Data the published products derive from — Impact Observatory with Esri and Microsoft (io-lulc-annual-v02 land cover, CC BY 4.0, via Microsoft Planetary Computer), Natural Resources Canada (mrdem-30, the terrain the floodplains are delineated off, OGL — Canada) and the Province of British Columbia (Freshwater Atlas stream network, OGL — British Columbia). The land cover was modified: clipped to modelled floodplain extents and cross-tabulated 2017 against 2023 into transitions. Saying so is a condition of CC BY, which is why the collection’s sci:citation says it too.

Licence

The scripts here are MIT. The published catalogue — everything under s3://stac-floodplains-bc and the collection at images.a11s.one — is CC BY 4.0, published as the collection’s license alongside six providers, a rel: license link and a sci:citation. Why that combination is the right one, read from each producer’s own record, is in ATTRIBUTION.md.

Sister collections on the same endpoint