The commercial extension points catalogue
says a population_surface must declare a data source, a spatial-mapping method,
a temporal methodology, a vintage, and a unit. This page fills that socket in
completely — a worked example of a conformant declaration, so "what a supplier
must publish" is concrete rather than abstract. It documents the surface; it does
not sell it.
The declared registry row
- supplier
- A named population-surface product (the row identifies its owner; this page names the socket, not a price).
- unit
- ambient_population — expected people present per H3 cell per hour-of-week slot (0–167), not residents-at-home.
- grain
- H3 (declared resolution) × hour-of-week slot; roll up with H3_TOPARENT and slot aggregation, never finer than declared.
- vintage
- The edition of each input below; the surface is only as current as its oldest input.
- valid_from / valid_to
- The applicability window — a population surface expires; the row states when.
Lineage — three sources, three jobs
An hour-of-week population is not one dataset; it is three, each doing a job the others cannot:
- ACS (Census)
- Residential population by block group, 5-year estimates. The night/home distribution — where people sleep. Vintage = the ACS 5-year release.
- LODES / LEHD
- Workplace and residence area characteristics (WAC / RAC) by block, annual. The day/work distribution — where people are employed. Vintage = the LODES data year.
- ATUS
- American Time Use Survey. The diurnal + weekly rhythm — what fraction of a population is at home vs work vs elsewhere at each hour of the week. Supplies the 168-slot temporal shape.
The combination is the method that must be declared: ACS anchors the home population, LODES anchors the work population, and ATUS redistributes them across the 168 hour-of-week slots so a cell's population breathes over the week — a downtown cell heavy at Tuesday 14:00, a residential cell heavy at Tuesday 02:00. Area-weighting a static residential count would miss exactly this, which is why a cross-system weighted crosswalk treats a declared mass surface as a distinct weight method, not a synonym for area.
The Alaska caveat
LODES does not cover every state in every year — Alaska in particular has been absent from some LODES vintages, and a surface that silently zero-fills the workplace distribution there would understate daytime population across the state. A conformant declaration states the fallback it used (a prior LODES year, or an ACS-workplace approximation) as part of the row, so a consumer can see where the surface is modeled rather than measured. The gap is disclosed, not patched over.
Sparse rural block groups carry the reciprocal caveat: below the minimum-aggregation floor, a cell's population is suppressed or coarsened, and that treatment is recorded on the row — a population surface is subject to the same level-agnostic suppression provenance as any other reported quantity.
Independent-QA receipts
A declaration is only as trustworthy as its audit. This surface carries independent-QA receipts (tracked in the pr969 review) covering the checks that catch the ways a population surface silently breaks:
- population conservation
- Total population is preserved across the block → H3 crosswalk within rounding — no mass created or lost by the reprojection.
- temporal conservation
- Summing a cell's 168 slot-populations back to a weekly average reproduces the static ACS/LODES anchor — the ATUS redistribution moves people, it does not multiply them.
- boundary-vintage alignment
- The ACS/LODES boundaries and the H3 crosswalk are from aligned vintages, so a boundary change is not misread as a population change.
- coverage disclosure
- Every modeled-not-measured region (the Alaska fallback, suppressed sparse cells) is enumerated, not hidden.
The sockets it connects to
A population surface does not stand alone; the catalogue names the neighbours it
plugs into. Its declared positional error is an
error_assignment audit input; it is the denominator an experiment_design
readout divides lift by; and it is the mass a
weighted crosswalk re-weights with when
weightSurface is declared. Each of those is its own registry row with its own
supplier and vintage — the surface is one conformant declaration in a graph of
them, and this page is what one of them looks like filled in.
