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.
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.
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.
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.
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
QGIS 3.42+ speaks STAC natively — Data Source Manager → STAC → New, with the endpoint URL and no authentication:
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.
Lutra Consulting’s STAC in QGIS post walks through it in more detail.
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.
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.
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.
stac_dem_bc
— LidarBC elevation (stac-elevation-bc)stac_airphoto_bc
— historic airphoto thumbnails, 1963–2019
(stac-airphoto-bc)stac_uav_bc
— UAV imagery, organized by watershed
(stac-imagery-uav-bc)