Methodology
Every number on suburbmap carries its source, date, confidence and a link to the method on this page. The tables below come straight from our metric registry; the sections after them explain each method in full.
38 metrics in 12 dimensions (12 live). Reported crime, Road safety and Congestion are sensitive: they never affect your fit score unless you switch them on. Full source details are on the data sources page, and you can report an error in any number.
Metrics at a glance
For each dimension: what we measure, whether it counts toward your fit score by default, how small numbers are protected, the minimum confidence for a value to be scored, and who publishes the data.
Geography & searchNever scored
No metrics: this dimension carries boundaries, names and search only.
Area profile
Census 2023 and NZDep2023. Only deprivation enters the score; the rest is context.
Area-level index (NZDep2023). It describes the area, not the people who live there.
How we calculate this: Area profile
| Metric | Unit | Direction | In score by default | Suppression | Min. confidence | Sources | Status |
|---|---|---|---|---|---|---|---|
Deprivation index (NZDep2023), population-weighted decile nzdep2023_decileHow we calculate this: Deprivation index (NZDep2023), population-weighted decile | decile | Lower is better | Yes | None | Medium |
| Live |
Median personal income (Census 2023) median_incomeHow we calculate this: Median personal income (Census 2023) | NZD/year | Context only | Never (context only) | None | Medium |
| Live |
Share of adults with a bachelor's degree or higher (Census 2023) pct_bachelor_plusHow we calculate this: Share of adults with a bachelor's degree or higher (Census 2023) | % | Context only | Never (context only) | Small counts suppressed | Medium |
| Live |
Share of households renting (Census 2023) pct_rentingHow we calculate this: Share of households renting (Census 2023) | % | Context only | Never (context only) | Small counts suppressed | Medium |
| Live |
Median age (Census 2023) median_ageHow we calculate this: Median age (Census 2023) | years | Context only | Never (context only) | None | Medium |
| Live |
Share of families with children (Census 2023) pct_families_with_childrenHow we calculate this: Share of families with children (Census 2023) | % | Context only | Never (context only) | Small counts suppressed | Medium |
| Live |
Rents
| Metric | Unit | Direction | In score by default | Suppression | Min. confidence | Sources | Status |
|---|---|---|---|---|---|---|---|
Median weekly rent, 1-bedroom (latest year of new bonds) rent_median_1br_weeklyHow we calculate this: Median weekly rent, 1-bedroom (latest year of new bonds) | NZD/week | Lower is better | Yes | None | Medium |
| Blocked |
Median weekly rent, 2-bedroom (latest year of new bonds) rent_median_2br_weeklyHow we calculate this: Median weekly rent, 2-bedroom (latest year of new bonds) | NZD/week | Lower is better | Yes | None | Medium |
| Live |
Median weekly rent, 3-bedroom (latest year of new bonds) rent_median_3br_weeklyHow we calculate this: Median weekly rent, 3-bedroom (latest year of new bonds) | NZD/week | Lower is better | Yes | None | Medium |
| Live |
Change in median weekly rent over 12 months rent_change_12m_pctHow we calculate this: Change in median weekly rent over 12 months | % | Context only | Never (context only) | None | Medium |
| Blocked |
Annual 2-bedroom rent as a share of median household income rent_per_income_ratioHow we calculate this: Annual 2-bedroom rent as a share of median household income | ratio | Lower is better | Yes | None | Medium |
| Live |
Prices (area level)Never scored
Area-level indices only. No property values in v1.
How we calculate this: Prices (area level)
| Metric | Unit | Direction | In score by default | Suppression | Min. confidence | Sources | Status |
|---|---|---|---|---|---|---|---|
Median sale price (territorial authority, REINZ) price_median_taHow we calculate this: Median sale price (territorial authority, REINZ) | NZD | Context only | Never (context only) | None | Medium |
| Planned (later) |
Schools & zones
Equity Index describes a school's roll, not its quality.
How we calculate this: Schools & zones
| Metric | Unit | Direction | In score by default | Suppression | Min. confidence | Sources | Status |
|---|---|---|---|---|---|---|---|
State schools whose enrolment zone covers most addresses here in_zone_school_countHow we calculate this: State schools whose enrolment zone covers most addresses here | schools | Higher is better | Yes | None | Medium |
| Live |
Primary school whose zone covers the most addresses here nearest_primary_zone_schoolHow we calculate this: Primary school whose zone covers the most addresses here | school | Context only | Never (context only) | None | Medium |
| Live |
Equity Index of the zoned primary school eqi_contextHow we calculate this: Equity Index of the zoned primary school | EQI | Context only | Never (context only) | None | Medium |
| Live |
NCEA Level 2 attainment (link to NZQA) ncea_l2_pctHow we calculate this: NCEA Level 2 attainment (link to NZQA) | % | Context only | Never (context only) | None | Medium |
| Planned (M1) |
Natural hazards
[Source], [date]. Model output. Absence on the map is not absence of risk.
How we calculate this: Natural hazards
| Metric | Unit | Direction | In score by default | Suppression | Min. confidence | Sources | Status |
|---|---|---|---|---|---|---|---|
Share of addresses inside the national 1% AEP rainfall flood extent flood_exposure_pctHow we calculate this: Share of addresses inside the national 1% AEP rainfall flood extent | % of addresses | Lower is better | Yes | None | Medium |
| Blocked |
Share of addresses inside a council flood hazard area council_flood_exposure_pctHow we calculate this: Share of addresses inside a council flood hazard area | % of addresses | Lower is better | Yes | None | Medium |
| Planned (M2) |
Share of addresses within 500 m of a mapped active fault fault_within_500mHow we calculate this: Share of addresses within 500 m of a mapped active fault | % of addresses | Lower is better | Yes | None | Medium |
| Blocked |
Share of addresses inside the 1% AEP extreme coastal flood extent (present day) coastal_flood_exposure_pctHow we calculate this: Share of addresses inside the 1% AEP extreme coastal flood extent (present day) | % of addresses | Lower is better | Yes | None | Medium |
| Blocked |
Share of addresses inside a tsunami evacuation zone tsunami_zone_shareHow we calculate this: Share of addresses inside a tsunami evacuation zone | % of addresses | Lower is better | Yes | None | Medium |
| Blocked |
Reported crimeSensitive: opt-in
Reported victimisations in public places and burglaries, per 1,000 residents. Offences in homes (except burglary) are not published by Police.
Off by default. Turn on to let this dimension affect your fit score.
How we calculate this: Reported crime
| Metric | Unit | Direction | In score by default | Suppression | Min. confidence | Sources | Status |
|---|---|---|---|---|---|---|---|
Reported public-place victimisations and burglaries per 1,000 residents (36 months) victimisations_per_1000_36mSensitiveHow we calculate this: Reported public-place victimisations and burglaries per 1,000 residents (36 months) | per 1,000 residents | Lower is better | Opt-in only | Empirical-Bayes shrinkage | Medium |
| Planned (M2) |
Reported burglaries per 1,000 dwellings (36 months) burglary_per_1000_dwellings_36mSensitiveHow we calculate this: Reported burglaries per 1,000 dwellings (36 months) | per 1,000 dwellings | Lower is better | Opt-in only | Empirical-Bayes shrinkage | Medium |
| Planned (M2) |
Road safetySensitive: opt-in
Road safety around here reflects road design and traffic volume, not residents' driving.
Off by default. Turn on to let this dimension affect your fit score.
How we calculate this: Road safety
| Metric | Unit | Direction | In score by default | Suppression | Min. confidence | Sources | Status |
|---|---|---|---|---|---|---|---|
Injury crashes per km of local road (5 years) injury_crashes_per_roadkm_5ySensitiveHow we calculate this: Injury crashes per km of local road (5 years) | per road-km | Lower is better | Opt-in only | Empirical-Bayes shrinkage | Medium |
| Planned (M2) |
Deaths and serious injuries per km of local road (5 years, shrunk) dsi_per_roadkm_5y_shrunkSensitiveHow we calculate this: Deaths and serious injuries per km of local road (5 years, shrunk) | per road-km | Lower is better | Opt-in only | Empirical-Bayes shrinkage | Medium |
| Planned (M2) |
Pedestrian and cyclist injury crashes within 500 m of a school (5 years) school_active_injury_crashes_5ySensitiveHow we calculate this: Pedestrian and cyclist injury crashes within 500 m of a school (5 years) | crashes | Lower is better | Opt-in only | Small counts suppressed | Medium |
| Planned (M2) |
Commute
How we calculate this: Commute
| Metric | Unit | Direction | In score by default | Suppression | Min. confidence | Sources | Status |
|---|---|---|---|---|---|---|---|
Public transport minutes, arrive by 08:30 weekday pt_minutes_to_dest_0830How we calculate this: Public transport minutes, arrive by 08:30 weekday | minutes | Lower is better | Yes | None | Medium |
| Planned (M3) |
Driving minutes, free-flow car_minutes_free_to_destHow we calculate this: Driving minutes, free-flow | minutes | Lower is better | Yes | None | Medium |
| Planned (M3) |
Driving minutes, AM peak (estimate) car_minutes_peak_to_destHow we calculate this: Driving minutes, AM peak (estimate) | minutes | Lower is better | Yes | None | Low |
| Planned (M3) |
Walking minutes walk_minutes_to_destHow we calculate this: Walking minutes | minutes | Lower is better | Yes | None | Medium |
| Planned (M3) |
Public transport trips per hour within 500 m (weekday AM peak) pt_frequency_am_peakHow we calculate this: Public transport trips per hour within 500 m (weekday AM peak) | trips/hour | Higher is better | Yes | None | Medium |
| Planned (M3) |
CongestionSensitive: opt-in
Congestion is estimated from bus speeds on weekday peaks (Tue–Thu, outside school holidays). It understates car speeds where buses have their own lanes.
Off by default. Turn on to let this dimension affect your fit score.
How we calculate this: Congestion
| Metric | Unit | Direction | In score by default | Suppression | Min. confidence | Sources | Status |
|---|---|---|---|---|---|---|---|
Share of arterial road-km congested in the AM peak (CCR < 0.6) suburb_congestion_index_amSensitiveHow we calculate this: Share of arterial road-km congested in the AM peak (CCR < 0.6) | % of arterial km | Lower is better | Opt-in only | Small counts suppressed | Medium |
| Planned (M3) |
Extra peak-hour driving minutes peak_delay_to_dest_minSensitiveHow we calculate this: Extra peak-hour driving minutes | minutes | Lower is better | Opt-in only | Small counts suppressed | Medium |
| Planned (M3) |
Liveability
How we calculate this: Liveability
| Metric | Unit | Direction | In score by default | Suppression | Min. confidence | Sources | Status |
|---|---|---|---|---|---|---|---|
Everyday amenities within a 15-minute walk amenity_15min_walk_countHow we calculate this: Everyday amenities within a 15-minute walk | amenities | Higher is better | Yes | None | Medium |
| Planned (M3) |
Share of land that is parks or public access areas park_area_shareHow we calculate this: Share of land that is parks or public access areas | % of land | Higher is better | Yes | None | Medium |
| Planned (M3) |
Share of addresses within 50 m of a busy road busy_road_exposure_pctSensitiveHow we calculate this: Share of addresses within 50 m of a busy road | % of addresses | Lower is better | Opt-in only | None | Medium |
| Planned (M3) |
Sun & slope
How we calculate this: Sun & slope
| Metric | Unit | Direction | In score by default | Suppression | Min. confidence | Sources | Status |
|---|---|---|---|---|---|---|---|
Median direct-sun hours on the winter solstice winter_sun_hours_medianHow we calculate this: Median direct-sun hours on the winter solstice | hours | Higher is better | Yes | None | Medium |
| Planned (M5) |
Median ground slope at addresses slope_median_pctHow we calculate this: Median ground slope at addresses | % | Lower is better | Yes | None | Medium |
| Planned (M5) |
How every number on suburbmap is produced. Each metric in the registry (pipeline/registry/metrics.yaml) links
to one section below through its method_ref anchor, and the full list of metrics and sources is in the
data registry. The Sources and Status lines inside each section are generated from the
registry, so they always match what the pipeline uses.
Status legend: implemented means the metric is computed by the pipeline and published; planned with a milestone (M1 to M5, or later) means the method is fixed here but the code lands in that milestone. Nothing is published before its QA gates pass. Where a detail is not fixed yet, the section says so; we do not fill gaps with guesses.
Principles
- Provenance. Every published value carries its
source_id, itsas_ofdate (the snapshot date of the input), aconfidencebadge and a link to the section of this page that produced it. This applies to the map, suburb pages, the API and the embeddable widget. - Vintage-pinned geography. All analytics run on Stats NZ Statistical Area 2 2023 (SA2 2023) boundaries and
every row records its
geo_vintage. Inputs on other units or vintages are mapped through Stats NZ concordances, never joined directly. See Geography. - Suburbs by address share. LINZ suburb and locality polygons are a display layer. Each suburb is linked to the SA2s that contain its addresses, weighted by the share of LINZ address points in each; suburb pages show address-share-weighted values and list the SA2s behind them.
- Percentiles within a scope. Each metric is ranked 0–100 among areas with data, nationally and within the region, and the scope is always labelled. See Percentiles.
- Confidence badges. Every value is
high,mediumorlowconfidence. Low-confidence values are shown with a badge and left out of the fit score unless you opt in. See Confidence. - Suppression in the pipeline. Small counts are suppressed and small-area rates are shrunk before anything reaches the serving database, so the website and API never see an unsuppressed small count. See Suppression.
- Sensitive dimensions are opt-in. Reported crime, road safety, congestion and busy-road exposure never enter the fit score unless you switch them on. Ethnicity, religion, social-housing density, gang presence and political lean are never inputs and never layers.
- Official hazard sources, verbatim. Hazard layers show the publisher’s own extents, labels and dates. We never assign our own risk grades or probabilities.
- No prohibited sources. No Google Maps Platform content is stored, derived or displayed, and no listings portal is scraped. See the prohibited sources.
- Corrections. Every metric links to a correction form; reports are triaged within 48 hours and outcomes are published on a public log. See Corrections.
Geography
Units. country → region → area. Regions are Stats NZ Regional Council 2025 areas; territorial authorities
(TA 2025) provide fallback statistics and the priors used for shrinkage. The canonical area is SA2 2023
(2,395 SA2s; 2,379 digitised and routable). SA2 2026 (2,311 SA2s) is stored but not used for scoring until Census
data is republished on it. SA1 2023 and Meshblock 2023 are inputs only (NZDep is published at SA1, Police
victimisations at meshblock). H3 hexagons (resolution 9 in cities, 7–8 regionally) carry density layers such as
crashes, congestion, sun and slope. An area’s population is Stats NZ’s 2023 Census usually resident population
for the SA2 (statsnz_census2023_individuals_sa2, see Area profile); it is empty where Stats NZ
publishes none.
Suburbs. LINZ NZ Suburbs and Localities has 6,563 polygons of seven types. Suburb pages exist only for the
types Suburb and Locality (3,176 polygons); coastal and inland bays, islands, lakes and conservation land are drawn
on the map for context. A suburb’s region is the regional council that contains a representative point inside its
polygon. Its URL slug is the ASCII name in lower case with hyphens. When two names give the same slug, Suburb and
Locality polygons rank above the other types. Within each group the polygon with the larger LINZ population estimate
ranks first (a missing estimate counts as zero), then the lower LINZ id. The top-ranked polygon keeps the plain
slug, the others get their territorial authority appended, and the LINZ id is added if the slug is still shared. So
Richmond in Tasman is richmond and Richmond in Christchurch is richmond-christchurch-city. Slugs are recomputed on
every run, so a slug changes only when LINZ adds, removes or renames a same-named polygon or updates population
estimates enough to change their order; reclassifying a Locality as a Suburb changes nothing. A region’s suburb list
(search, suburb pages and the crosswalk) holds the suburbs whose own region it is plus any other suburb that one of
its addresses falls in, all taken from the same LINZ snapshot as its addresses.
Addresses. We use LINZ NZ Addresses with lifecycle Current; Proposed addresses are dropped. The land/water
flag is kept but never used as a filter. A region’s addresses are downloaded in rectangles drawn around all of its
SA2 polygons, so every address in one of its SA2s is fetched; before assigning them the pipeline checks that the
rectangles still contain every SA2 of the region, and stops if one reaches beyond them. Each address is assigned to
an SA2 and to a LINZ polygon of any type by point-in-polygon in EPSG:2193. A point on a shared SA2 boundary goes to
the lower SA2 code. Where LINZ polygons overlap, Suburb beats Locality, Locality beats any other type, and otherwise
the smaller polygon wins. A run fails if more than 1% of addresses fall in more than one polygon. A region’s address
list holds the addresses in that region’s SA2s; the other addresses inside the rectangles lie in a neighbouring
region’s SA2s and belong to that region’s list. An address that lies in no SA2 polygon is kept without an SA2, and
is not searchable or counted in any SA2 or suburb.
Suburb crosswalk. For every suburb with at least one address in its own region, and every SA2:
address_share = addresses in (suburb ∩ SA2) / addresses in suburb
Only addresses that have both an SA2 and a suburb are counted, and only in SA2s of the suburb’s own region (the region of its representative point). A suburb that crosses a regional boundary is therefore weighted over its addresses in its own region and left out of the neighbouring region’s crosswalk, so each suburb’s shares come from one region. On 1 October 2026 the Wellington run left out 4 suburbs whose own region is Manawatū-Whanganui (38 addresses: Eketāhuna, Manakau, Pongaroa and Waikawa Beach). In the other direction, a suburb’s addresses in a neighbouring region’s SA2s are not part of its shares, and the run logs them: 4 Wellington suburbs had 14 such addresses (Mount Bruce 9 of 25, Bideford 2 of 83, Tīnui 2 of 122, Whangaehu 1 of 37). A suburb’s shares sum to 1: the pipeline checks this to within 1e-9, and a QA gate allows ±0.01. Suburb-level values are address-share-weighted over these SA2s by the rule in Suburb values, and the page lists the SA2s and their shares. The SA2 polygons are Stats NZ’s generalised layer (ADR 0001), so an address within a few metres of an SA2 boundary can land in the neighbouring SA2.
Projection. Source data is reprojected once, at ingest, from NZTM2000 (EPSG:2193) to WGS84 (EPSG:4326). LINZ suburbs arrive in NZGD2000 geographic coordinates (EPSG:4167), and the conversion to WGS84 leaves them unchanged (a null transformation). Distances, buffers and areas are computed in EPSG:2193, and the source CRS is kept in provenance.
Names. Stats NZ and LINZ names are stored with macrons and as an ASCII variant; search uses the ASCII form.
Concordances. Meshblock and SA1 inputs map to SA2 2023 through Stats NZ concordance files, and every join asserts that the vintages are compatible (a hard QA gate).
Known limitations: water-only SA2s (inlets and oceanic areas) have no addresses and at most a handful of residents (Stats NZ’s rounding can show 3, as for Inlet Wellington Harbour), so address- and population-based metrics have no value there. SA2 boundaries do not always match what people call their suburb, which is why suburb pages list the SA2s they are built from.
Sources (see the data registry):
statsnz_sa2_2023: Stats NZ, Statistical Area 2 2023. Licence CC-BY-4.0. Attribution: “Stats NZ, Statistical Area 2 2023, CC BY 4.0”.statsnz_sa1_2023: Stats NZ, Statistical Area 1 2023. Licence CC-BY-4.0. Attribution: “Stats NZ, Statistical Area 1 2023, CC BY 4.0”.statsnz_mb_2023: Stats NZ, Meshblock 2023. Licence CC-BY-4.0. Attribution: “Stats NZ, Meshblock 2023, CC BY 4.0”.statsnz_ta_2025: Stats NZ, Territorial Authority 2025. Licence CC-BY-4.0. Attribution: “Stats NZ, Territorial Authority 2025, CC BY 4.0”.statsnz_rc_2025: Stats NZ, Regional Council 2025. Licence CC-BY-4.0. Attribution: “Stats NZ, Regional Council 2025, CC BY 4.0”.statsnz_sa2_2026: Stats NZ, Statistical Area 2 2026. Licence CC-BY-4.0. Attribution: “Stats NZ, Statistical Area 2 2026, CC BY 4.0”.linz_suburbs_localities: Toitū Te Whenua Land Information New Zealand (LINZ), NZ Suburbs and Localities. Licence CC-BY-4.0. Attribution: “Toitū Te Whenua LINZ, NZ Suburbs and Localities, CC BY 4.0”.linz_addresses: Toitū Te Whenua Land Information New Zealand (LINZ), NZ Addresses. Licence CC-BY-4.0. Attribution: “Toitū Te Whenua LINZ, NZ Addresses, CC BY 4.0”.statsnz_census2023_individuals_sa2: Stats NZ, 2023 Census totals by topic for individuals by SA2. Licence CC-BY-4.0. Attribution: “Stats NZ, 2023 Census, CC BY 4.0”.
Status: SA2 2023, TA 2025 and RC 2025 boundaries are in use (M0). In M1 the pipeline builds the national suburbs layer and the Wellington addresses, crosswalk and suburb list, and the Wellington serving build loads them; they are not published yet.
Suburb values
A suburb page and GET /v1/suburbs/{suburb_id} show one value per metric, built from the suburb’s SA2s in the
crosswalk and their address_share. The same rule runs in the pipeline (the static pages) and in the
API; a test keeps the two equal.
-
A constituent SA2 counts as live when its row is
okorprovisionalwith a value and a confidence, as suppressed when its row is suppressed, and as no data otherwise (no row,no_data, or a live row without a confidence). -
If any SA2 holding more than 20% of the suburb’s addresses is suppressed, the suburb value is suppressed; if any such SA2 has no data, the suburb has no data. Otherwise, if the live SA2s hold less than half of the suburb’s addresses, the value is suppressed when any SA2 is suppressed and has no data when none is.
-
Otherwise the value is the mean of the live SA2s’ values weighted by their address shares, renormalised over the live SA2s, rounded to 3 decimals:
value = Σ_live address_share × value / Σ_live address_shareIts confidence is the worst of theirs,
nis the sum of theirn(empty if any is empty), it is provisional if any of them is, itsas_ofis the newest of theirs and its provenance cites every snapshot behind them. -
pct_regionranks the suburb value among the live values of the region’s SA2s with the Percentiles formula, counting the SA2s below it and equal to it:(below + (equal − 1) / 2) / (n − 1) × 100, clamped to 0–100 and rounded to 0.1 (50 when the region has one value). A value between two SA2 values ranks between them. The rank uses the unrounded weighted meanv, and an SA2 value within10⁻⁹ × max(1, |v|)of it counts as equal: floating-point arithmetic can put the mean of equal SA2 values a hair off them, and that must not break the tie (distinct Wellington SA2 values of a metric differ by at least10⁻⁵ × max(1, |v|)). A suburb has nopct_nz. The widget’s fit score for a suburb uses this rank. -
A suppressed or no-data suburb value carries no value, percentile, confidence or count. Each metric lists every constituent SA2 with its share and status, so the page can say which SA2 withheld the value.
The thresholds (20% and 50%) are in the payload’s aggregation block. Schools on a suburb page are the schools located
in the region whose enrolment zone in force on the run date covers at least one of the suburb’s addresses (point in
polygon in EPSG:2193, boundary counts as inside; see School zones), ordered by how many of the
suburb’s addresses the zone covers, with that count and share. A school located in another region whose zone
reaches in is counted but not listed yet (one suburb in the Wellington load on 1 October 2026). Each listed school
carries the confidence of the suburb’s in_zone_school_count value, as the area’s zoned primary school carries the
SA2’s; a suburb whose in_zone_school_count is suppressed or has no data lists no schools, since their coverage
cannot be qualified (no Wellington page on 2 October 2026; Brooklyn in the CBD fixture).
A suburb with no loaded SA2 holding its addresses (homed in a region that is not loaded, or without addresses) has no page and no values; the API answers 404 rather than a page with zero addresses.
Status: implemented (M1). The Wellington serving build writes 242 suburb pages; not published yet.
Concordances
An input on another geography vintage reaches SA2 2023 only through a recorded concordance, and every step asserts
the vintage it expects (pipeline/core/vintage.py); a mismatch stops the run.
SA2 2018 and 2019 to SA2 2023. Stats NZ publishes no keyless SA2 2019 to SA2 2023 concordance, so we build one by
overlaying Stats NZ’s SA2 2018 polygons (statsnz_sa2_2018) on the SA2 2023 polygons (statsnz_sa2_2023) in
NZTM2000 (EPSG:2193). For each SA2 2023 t and SA2 2018 f:
share(t, f) = addresses in (t ∩ f) / addresses in t where t's region has LINZ addresses and t has at least 10 [tune]
share(t, f) = area of (t ∩ f) / area of t otherwise
Each row records its method (address or area, the address points coming from linz_addresses). There is one
national table: an SA2 2023 in a region with curated addresses uses address shares in the national run and in its
region’s run alike, so both give it the same value and confidence. An address on a boundary between two polygons
counts for the lower code, as in the address assignment above. Pairs under 0.1% are dropped as generalisation
slivers, and addresses outside every SA2 2018 polygon still count in the total, so shares can add up to slightly
less than 1.
SA2 2019 codes. Of the 2,009 location ids in the bond data’s 2020 file, 2,005 are SA2 2018 codes. The other 4 are SA2 2019 splits: 170801 and 170802 come from 170800 Rangiriri, and 171801 and 171802 from 171800 Te Uku. The parents’ names were checked in the SA2 2018 layer on 30 September and 1 October 2026, and the SA2 2023 areas cut from the parents lie inside them (170802 Te Kauwhata West and 170803 Whangamarino take over 99.9% of their area from 170800, and 171801 Te Uku and 171803 Whale Bay from 171800). Data on a split code is merged into its parent before it is mapped. Every other SA2 2019 code is taken to be the SA2 2018 area with the same code. That is an assumption, not a check: Stats NZ keeps an SA2’s code when its boundary is adjusted (194500 Tauriko keeps its code from 2018 to 2023 while its area grows from 4.8 to 8.4 km²), and SA2 2019 polygons are not published keyless, so a 2018 to 2019 adjustment would not be seen.
Medians. A median cannot be re-aggregated, so an SA2 2023 takes the value of its dominant SA2 2018, the one with the largest share (ties go to the lowest code):
| dominant share | value | confidence |
|---|---|---|
| 0.9 or more [tune] | the dominant area’s value | unchanged |
| 0.5 [tune] to under 0.9 | the dominant area’s value | one level lower |
| under 0.5 | none | — |
If the dominant SA2 2018 has no value, the SA2 2023 has none either; we never fall back to a smaller part. The
tables are stored as concordance_sa2_2018_to_2023 (national, and each regional run’s own rows) and, re-keyed to
SA2 2019 codes, concordance_sa2_2019_to_2023. A split code’s own share is unknown, so in the SA2 2019 table its
rows have no share, carry the parent’s share in via_share and are never dominant: the four SA2 2023s whose
dominant area is a split parent (170802, 170803, 171801 and 171803) have no dominant row there. Values are mapped
with the SA2 2018 table after split codes are merged into their parent.
On 1 October 2026 the national table gave 2,212 of the 2,379 SA2 2023s with geometry a dominant share of at least 0.9, 163 a share between 0.5 and 0.9, and 4 a share below 0.5 (127002, 137202, 360701 and 362402, which get no rents). The Wellington region’s 232 SA2s use addresses for 223; the other 9 (islands, forest park, harbour, lake and ocean areas) have fewer than 10 addresses and use area. There, 225 SA2s keep their confidence, 7 lose one level (Karori Park, Newlands East, Postgate, Endeavour West, Ngaumutawa, Crofton Downs and Waitohu, with shares from 0.65 to 0.89) and none is dropped. By area alone the national counts would be 2,210, 165 and 4, and the Wellington counts 223, 9 and 0. Every SA2 2023’s shares add up to at least 0.997.
Known limitations: both polygon layers are Stats NZ’s generalised copies and are not clipped to the coastline, so the area method counts water; the address method counts every LINZ address, not only rented homes.
Sources (see the data registry):
statsnz_sa2_2018: Stats NZ, Statistical Area 2 2018. Licence CC-BY-4.0. Attribution: “Stats NZ, Statistical Area 2 2018, CC BY 4.0”.statsnz_sa2_2023: Stats NZ, Statistical Area 2 2023. Licence CC-BY-4.0. Attribution: “Stats NZ, Statistical Area 2 2023, CC BY 4.0”.linz_addresses: Toitū Te Whenua Land Information New Zealand (LINZ), NZ Addresses. Licence CC-BY-4.0. Attribution: “Toitū Te Whenua LINZ, NZ Addresses, CC BY 4.0”.
Status: implemented (M1) for rents.
Percentiles
For each metric and each area with a live value (ok or provisional) we compute two percentile ranks:
pct_nz: rank among all New Zealand areas with data.pct_region: rank among areas with data in the same region.
Ties get the average rank, scaled to 0–100:
pct = (rank − 1) / (n − 1) × 100
where n is the number of areas with data in the scope; a scope with a single area gets 50. Suppressed and
no_data rows have no percentile. pct_nz is only computed on a national run; a single-region run leaves it empty
and the API falls back to the region scope, so a regional rank is never presented as a national one.
The directional score used by the fit score is s = pct for higher_better metrics and s = 100 − pct for
lower_better metrics. neutral metrics never enter the fit score.
The scope follows your search extent: region scope when the extent is within one region, otherwise national. The scope label is always shown next to the percentile bar.
Status: implemented in the pipeline (M0); applied to each metric as it goes live.
Fit score
You set a weight w_d ∈ {0, 1, 2, 3, 4, 5} for each dimension. Persona presets (Renter, First-home buyer,
Family, Car-free, Hazard-cautious, and Investor on the Pro tier) are starting points; no preset weights a sensitive
dimension.
fit = Σ_d w_d · mean(s_m for metrics m in d with confidence ≥ min) / Σ_d w_d
The sums run over dimensions with a weight above 0 that have at least one eligible metric. A metric is eligible when:
- its status is
okorprovisionaland it has a percentile in the active scope; - its direction is not
neutral; - its confidence meets both the metric’s own
min_confidence_for_scoreand the global floor, which ismediumunless you choose to include low-confidence values; - if it is sensitive, you have opted in to it. Crime, road safety and congestion are sensitive dimensions and are
opted in to as a whole; one you have not included is left out entirely, even if it has a weight. Busy-road
exposure is a sensitive metric inside the non-sensitive Liveability dimension: it is added only when you opt in
to Liveability’s sensitive metric (
liveabilityininc), and the rest of Liveability is scored either way.
Next to the score we always show coverage = dims_with_data / dims_weighted and a confidence badge equal to the
worst confidence among the metrics that were included. The score card words this over the dimensions published so
far: a weighted dimension with no live value anywhere in the build (commute, hazards, liveability, sun and slope in
M1) is listed as “not published yet” rather than counted as missing here, for example “Based on 1 of 2 weighted
dimensions published so far (4 not published yet)”. The API’s coverage field keeps the formula above.
Ranking. Because the fit is taken over the dimensions an area has data for, an area with data for only a
lightly weighted dimension can score higher than areas with data for most of your weights. /v1/match therefore
ranks by how much of your weight each fit rests on. Missing data is never filled in. For each search, the
available dimensions are the weighted dimensions with at least one eligible metric in at least one candidate area
of the search extent, including areas a rent budget later removes. A dimension with no eligible data anywhere in
the extent, such as one not yet published in the region, counts against no area. For each area:
weighted_coverage = Σ w_d over available dimensions d with data here / Σ w_d over available dimensions
Areas with weighted_coverage ≥ 0.5 [tune] are ranked first. The rest are marked partial and follow. Within each
group, areas are sorted by fit (highest first), then by weighted_coverage (highest first), then by SA2 code, and
areas without a fit come last. For example, with rents weighted 5, area profile 1 and no other weighted dimension
published, an area scored on NZDep alone has weighted_coverage = 1/6 and is ranked after every area with a scored
rent, whatever its fit. The fit, coverage and the confidence badge are unchanged. Every result carries
weighted_coverage and partial, and the response’s ranking block lists the available dimensions and the
threshold.
Weights are stored in the URL, for example ?w=commute:4,hazards:3,rents:5&inc=crime. Dimensions are sorted and
zero weights omitted; inc lists what you opted in to: sensitive dimensions, plus liveability for busy-road
exposure. A shared link reproduces the same score.
Status: implemented (M0); ranking by weighted_coverage in /v1/match implemented (M1).
Suppression
These rules run in the pipeline before anything reaches the serving database. A suppressed value is published as
status = suppressed with a reason and shown as:
Not enough data to publish
It is never a missing row and never a zero. A value the source does not cover is no_data and shown as:
No data for this area
| Metric family | Rule |
|---|---|
| Crime | 36-month rolling window ending at the latest complete month. Do not publish any SA2 cell with count < 3. Rate = Empirical-Bayes shrunk toward the TA rate with prior weight = 20 person-years-equivalent [tune]. Confidence: high ≥ 30 events, medium 10–29, low < 10. Never per-area for SA2s with population < 100 (show count only, or suppress). Denominator: residents for public-place; dwellings for burglary. |
| Crash | 5-year window excluding the latest 3 months. Injury crashes per road-km on local roads (state highways reported separately). EB shrinkage toward TA mean; low confidence if < 5 events. No address-level pins; aggregate to H3 ≥ res 9 or segments. |
| Congestion | Only slots with ≥ 20 map-matched observations across ≥ 10 distinct weekdays. |
| Rents | Use MBIE’s published quarterly medians from the rental bond data; MBIE leaves out cells under 5 bonds, which get no value. A rent is provisional while Tenancy Services’ migration caveat stands or its window includes the file’s latest quarter (see Rents). |
| Hazards | No shrinkage. Show no_data explicitly when a council layer does not cover an area; never treat absence as “no risk”. |
| Any | confidence=low metrics are excluded from the composite by default and shown with a badge. |
Empirical-Bayes shrinkage. For a count-based rate we publish
rate = (count + k · prior_rate) / (exposure + k)
where exposure is the denominator in the metric’s units, prior_rate is the territorial authority’s rate for
the same window, and k is the prior weight in the same units as exposure. Areas with little exposure are pulled
toward their TA’s rate; areas with a lot of exposure keep close to their own rate. The values of k for crime and
crashes are given in Crime and Crash.
Small counts. Metrics marked small_count publish nothing below a minimum count of 3, unless their section
states a different threshold.
Each metric declares its rule family in the registry: none, small_count or shrinkage.
Status: rules implemented in the pipeline (M0); crime and crash use them from M2, congestion from M3.
Confidence
Every value is high, medium or low.
- Event counts (crime, crashes, crashes near schools):
highat 30 or more events,mediumat 10–29,lowbelow 10. This also satisfies the rule that a crash rate built on fewer than 5 events is alwayslow. - Census area profile: from the count a value is computed over,
highat 300 or more,mediumat 100–299,lowbelow 100 (see Area profile). NZDep is alwayshigh(see NZDep). - Rents: from the bonds behind the value,
highat 30 or more,mediumat 10–29,lowbelow 10 [tune], one level lower where an SA2 2023 takes less than 90% of its addresses or area from one SA2 2018 (see Rents). A rent isprovisionalwhile Tenancy Services’ landing page carries its bond-migration caveat or while its window includes the latest quarter in the file, and is labelled “Provisional: the latest months may still be revised.” It keeps its confidence and stays eligible for the fit score. - School zones:
highfrom 50 addresses,lowbelow that or where zones are split, not yet in force or missing (see School zones). - Peak driving estimate:
lowwhen it falls back to a regional peak factor (see Peak estimate). - Other metrics (hazard exposure, network and LiDAR metrics): the confidence rule is set when each metric is implemented and recorded in its section. Until then these metrics are not published.
Each metric declares a min_confidence_for_score. The fit score also applies a global medium floor unless you
opt in to low-confidence values, and the score card’s badge is the worst confidence among the metrics included.
Status: event-count thresholds implemented (M0); Census, NZDep, rents and school-zone rules implemented (M1); the rule for each other metric lands with that metric.
Quality gates
Before anything is published, the data QA gates in pipeline/qa/ check the region’s curated data
(suburbmap qa --region <id>, part of make qa). A failed hard gate fails make qa, and suburbmap publish --target prod refuses a region whose newest ETL run has no passing full QA run on record (a local publish only
warns; a pinned rollback build is exempt, since it passed when it was first published). A soft gate only warns. A
gate whose input layer does not exist yet is skipped and says why; it never passes silently.
The qa record. The outcome is written as a qa block into the region’s newest ETL run manifest (by
finished_at, the last job to change its curated layers), and into latest.json while that is a copy of the same
run: passed, hard_failures, warnings, skipped (with the reason), counts, pytest_args, and partial for
a narrowed run. Tiles, serving and publish jobs later rewrite latest.json without a qa block, so a publish check
reads the newest ETL run (pipeline.qa.runner.qa_blockers), which must carry a full QA run that passed; a newer ETL
run carries no qa block until QA runs again. A run narrowed by pytest arguments (gates deselected by -k, -m,
--deselect or --lf, files left out by --ignore, or gates that never ran after -x or --collect-only) is
recorded with passed: false and its partial reasons, even when every gate it ran passed.
| Gate | What must hold |
|---|---|
| 1 Schema | Every metric_values row validates against shared/schemas/metric_value.schema.json: all suppressed and no_data rows of each metric plus at most 2,000 others. Metric ids exist in the registry; status is ok, provisional, suppressed or no_data; no key (country, vintage, area, metric) repeats; every row has a source_snapshot_id and the region’s country. No NaN or infinite number anywhere (a missing value is null). ok and provisional rows have a value, a high, medium or low confidence and a pct_region; no row has n < 0; the metric’s registry storage is metric_values. |
| 1 Percentiles | pct_region, and on the national run pct_nz, equal a recomputed rank (see Percentiles) within 0.000001, and lie in [0, 100]. A regional run carries no pct_nz. |
| 1 Formats | By the metric’s format: percent within [0, 100]; a percent metric whose id contains _change_ is a signed change and only has to be above −100; decile within [1, 10]; count a whole number ≥ 0; integer a whole number; boolean 0 or 1; currency, minutes and ratio ≥ 0. Percent metrics are stored 0–100, so one with at least 10 non-zero live values, all within ±1, fails as a 0–1 fraction. |
| 2 Coverage | For each active metric with geo_level: sa2 and storage: metric_values: at least its coverage_min (0.8 when the registry gives none) of the region’s land SA2s (land area > 0 or residents > 0) have an ok or provisional value, and that share fell by at most 10 percentage points against the region’s previous metric_values file. |
| 3 Suppression | Published (ok or provisional) rows, by the metric’s suppression rule and family. Crime: n ≥ 3, and no rate for an SA2 with fewer than 100 residents (where the population is known). Crash: n < 5 only at low confidence. Congestion: n ≥ 20 observations (the 10 distinct weekdays are checked where the slots are built; metric_values does not show them). Other small_count metrics: n ≥ 3. small_count and shrinkage metrics and the three families always publish n. Metrics with rule none: no published row with n = 0, since a value computed over nothing is no_data. In the registry, sensitive metrics have use_in_score_default: false, metrics in a sensitive dimension are sensitive, and crime, crash and congestion metrics declare a suppression rule. |
| 5 Geography | Areas: unique SA2 codes, valid polygons, region and TA set. Suburb crosswalk: each suburb’s address shares sum to 1 ± 0.01, shares lie in (0, 1], counts are whole numbers ≥ 1, no suburb–SA2 pair repeats, and every area_id and suburb_id exists in the region’s areas and suburbs (the national suburbs when the region has none of its own). Addresses: fewer than 0.5% of Current addresses (every address when the layer has no lifecycle column) lack an area_id, and fewer than 0.5% lack a suburb_id; the counts are reported as warnings; address ids are unique and their area_id and suburb_id exist. In every curated layer, each area_id on a row that is not on another census year’s vintage exists in the region’s areas; rows on another year (SA2 2019 bond data, say) are gate 7’s, so a layer that mixes vintages still has its SA2 2023 rows checked. Every GeoParquet layer is EPSG:4326 with valid geometries (all of them, or 20,000 sampled from a larger layer) inside longitude/latitude bounds; a missing geometry is not counted as invalid. |
| 7 Vintage | metric_values rows are on the metric’s geo_vintage (SA2 2023). Every curated layer a metric uses carries geo_vintage on every row. A metric that uses a layer on another meshblock, SA1 or SA2 vintage went through a concordance to SA2 2023: its rows cite every snapshot of a concordance_<from>_to_<year> file that the run manifests list and that exists, so neither a concordance from elsewhere nor an older version the metric did not use counts. Every concordance records its method on every row. Units of one census year nest (meshblock → SA1 → SA2 2023) and need no concordance. A metric uses a layer when its rows cite one of the layer’s snapshots from a source outside the geography dimension, or every snapshot the layer cites. Geography sources (boundaries, addresses, suburbs) place rows and sit behind most layers, so sharing one is no evidence of use; the combined census layer, whose rows cite all four topic snapshots, is used by each area-profile metric through its own topic’s snapshot. |
| 8 Provenance | Every snapshot id that a metric_values row or a curated layer cites is in a run manifest (lookup order below). Each manifest entry passes the serving build’s checks: every field present, sha256 64 lowercase hex characters, as_of YYYY-MM-DD, and the id matching its source, date and hash. Rows cite only sources in their metric’s source_ids, and never one that is prohibited, blocked, link_only or missing from the source registry. Every curated output listed by the region’s latest manifest and newest ETL manifest exists. |
| Never-use attributes | No curated layer of the region has a layer or column name on a never-use topic (non-negotiable 3): ethnicity or a census ethnic group, religion, Māori descent, iwi, social or Kāinga Ora housing, gangs, politics or voting. Names are matched as words, with underscores read as spaces; the topics are those the census extractor never requests and the registry refuses in metrics. |
Manifest lookup order. The region’s latest.json; then its other run manifests, ETL runs newest first, then
tiles, serving and publish runs newest first; then the same for the national region nz, which holds national
layers. Snapshot ids are content-addressed (<source_id>@<as_of>#<sha12>), so any listing describes the same
snapshot content and the first one found is used. A snapshot recorded only in another region’s manifests does not
count. The serving build searches the same manifests (latest.json only copies one of them) in another order, so
the same ids resolve.
Which layers are checked. The latest file of every curated/<layer>/<region>/ layer; for a region other than
the fixture, also every national (nz) layer, since regional runs read national inputs, except the national
metric_values, which suburbmap qa --region nz checks; and any layer the region’s run manifests list as an
output.
Soft gates (warnings only):
- distribution drift against the region’s previous
metric_valuesfile: two-sample Kolmogorov–Smirnov test, p < 0.01, with at least 5 values on each side; - values more than 5 standard deviations from the mean of the metric’s other live values in the region (a leave-one-out z-score over at least 10 values: an in-sample z can never exceed (n − 1)/√n, which is below 5 for 26 values or fewer, so it could never warn on a small region);
- percentile ties: more than 20% of a scope’s live rows sharing one value, and so one percentile (region scope, plus the national scope on the national run; scopes with fewer than 10 live rows are not checked). Only the largest such group counts, so many small ties from the source’s own rounding (median age to 0.1 year, income to $100) do not add up to a warning;
- publish-readiness notes: a cited source that is not
activeyet (a production publish needs it active), a metric with rows whose registry status is notactive, a raw snapshot that is not on this machine, a curated layer without asource_snapshot_idcolumn (gates 7 and 8 cannot trace it), and a crosswalk or address layer whose region has no suburbs layer of its own (the serving build loads suburbs per region).
Gate 4 (hazard label order) and gate 6 (crime and crash totals against the publishers’ own) arrive with hazards, crime and crashes in M2.
Status: implemented (M1).
Corrections
Every metric tile has a “Report an error” link to the corrections page (/corrections). Reports are triaged within
48 hours. Once triaged, a report appears on the public corrections log with the metric, the area, its status and
a public note on the outcome. A correction that changes a published value is re-run through the QA gates and is
listed in the changelog of the next data release. We store only what you send on the form, and a contact detail
only if you give one.
Status: implemented (M0): the form, the public log, and the API endpoints that store reports and serve the log.
Area profile
Context metrics from the 2023 Census, published by Stats NZ as totals by topic on SA2 2023. They are all
neutral, so they describe an area but never enter the fit score; only NZDep does.
| Metric | What is measured | Formula |
|---|---|---|
median_income |
Median total personal income of usual residents aged 15 and over, as published for the SA2. | Stats NZ’s median, to the $100 |
pct_bachelor_plus |
Share of usual residents aged 15 and over whose highest qualification is a bachelor’s degree or higher, out of those who stated a qualification. | 100 × (bachelor and level 7 + post-graduate and honours + masters + doctorate) / total stated |
pct_renting |
Share of households whose dwelling is not owned and not held in a family trust, out of households that stated tenure. | 100 × not owned and not held in a family trust / total stated |
median_age |
Median age of usual residents. | Stats NZ’s median, to 0.1 year |
pct_families_with_children |
Share of families that include a child, out of all families in the SA2. | 100 × (couple with child(ren) + one parent with child(ren)) / all families |
Shares are percentages from 0 to 100, stored at full precision and shown to one decimal. “Bachelor’s degree or higher” needs all four categories: the 2023 classification splits the degrees above a bachelor’s into three.
Census fields. Stats NZ codes the published fields as VAR_<part>_<n>; what each one holds is only in its
description (“Subject pop, Year, Measure, Var1”). The pipeline picks every field by reading that description,
requires exactly one match, and checks it again on every stored page, so a renumbered field stops the run instead
of publishing the wrong number. Only those fields are requested: ethnicity, religion, Māori descent and landlord
sector are never downloaded, stored or used. We read the unclipped layers, which list all 2,395 SA2s; the clipped
copies leave out SA2s without land, and one of them carries no values at all.
Stats NZ rounding and suppression. Stats NZ applies its confidentiality rules before publication and we do not undo them. Counts are randomly rounded to a multiple of 3 (fixed random rounding, FRR3), so parts may not add up to their totals. Small sensitive counts are suppressed, and medians based on fewer than six people, households or families are suppressed. Stats NZ marks those cells −999 (confidential) or −997 (not available). Such a cell is unknown, so the area gets no value for that metric, never a zero, and the map shows “No data for this area”. A share also gets no value when any part is unknown or when its total is zero.
Small totals. After rounding, every count can be off by up to 2, which moves a share on a small total a long way: 9 families out of 9 could really be 7 out of 11, so “100%” could be 64%. A share whose total is below 30, or whose rounded part exceeds its total, is therefore suppressed and shown as “Not enough data to publish” (in Wellington, 3 values; nationally about 60). Medians need no such floor: Stats NZ computes them from unrounded data.
Confidence. Each value’s n is the count it is computed over: the stated total for a share; for median
income, the people aged 15 and over who stated an income; for median age, the SA2’s usually resident population.
Confidence is high when n is 300 or more, medium from 100 to 299 and low below 100. Low-confidence values
are badged and, like every low value, left out of the fit score by default.
Dates. A census value’s as_of is the date Stats NZ last changed that table’s data on its service, not the
day we downloaded it, so the figures do not look newer each time the pipeline runs. If Stats NZ changes the data
again, the pipeline stops until the change has been checked.
Population. The population shown for an area is Stats NZ’s 2023 Census usually resident population count for the SA2 (FRR3), from the same individuals table.
Known limitations: small SA2s can carry confidentiality noise. “Not owned and not held in a family trust” is not
the same as renting: it also counts households that live rent-free, so pct_renting slightly overstates renting.
Stats NZ counts a child of any age living with their parent(s), so pct_families_with_children is not a measure
of young children. A few SA2s dominated by institutions (such as prisons) have a published median income of $0.
Income is personal, not household; household income is used only in Rent-to-income. Four SA2s
share the highest published median household income, $200,000; this may be a cap on the published range, which
Stats NZ has not confirmed.
Sources (see the data registry):
statsnz_census2023_individuals_sa2: Stats NZ, 2023 Census totals by topic for individuals by SA2. Licence CC-BY-4.0. Attribution: “Stats NZ, 2023 Census, CC BY 4.0”.statsnz_census2023_households_sa2: Stats NZ, 2023 Census totals by topic for households by SA2. Licence CC-BY-4.0. Attribution: “Stats NZ, 2023 Census, CC BY 4.0”.statsnz_census2023_families_sa2: Stats NZ, 2023 Census totals by topic for families and extended families by SA2. Licence CC-BY-4.0. Attribution: “Stats NZ, 2023 Census, CC BY 4.0”.
Status: implemented: median_income, pct_bachelor_plus, pct_renting, median_age, pct_families_with_children.
NZDep
What is measured. nzdep2023_decile: the decile of the New Zealand Index of Socioeconomic Deprivation 2023
(NZDep2023) for the area, from 1 (least deprived tenth) to 10 (most deprived tenth).
Area-level index (NZDep2023). It describes the area, not the people who live there.
Formula. The University of Otago publishes NZDep2023 for SA1s and, in a separate official file
(NZDep2023_WgtAvSA2), for SA2s. We publish Otago’s SA2 decile exactly as released and never compute our own.
Otago averages the scores of the SA1s in each SA2, weighting each by its usually resident population, then ranks
all SA2s into tenths: each decile holds the same number of SA2s (227 of the 2,270 with a value). So the SA2
decile ranks SA2s against each other; it is not an average of SA1 deciles. SA2s Otago leaves blank (51, mostly
water and uninhabited land) have no value. As a check, our own population-weighted average of the published SA1
scores comes within 3 index points of Otago’s SA2 score for every SA2. The value’s n is the usually resident
population of the SA1s behind the average. Those populations are Otago’s weights, and every run checks them against
Stats NZ’s own 2023 Census SA1 counts (statsnz_census2023_individuals_sa1): they match exactly, and a mismatch
stops the run. Confidence is always high, because the index is computed by its publisher from the full Census.
Averages hide variation. The NZDep2023 User’s Manual advises that population-weighted averages for larger areas “should be avoided where possible as they disguise heterogeneity within those areas”: one SA2 can mix more and less deprived SA1s. We keep the SA1 values alongside for a later view of how many residents live in each decile, and show the SA2 decile only as area context.
Only deciles and quintiles are ever shown; the index is never split into 1–5 and 6–10 halves.
Direction. lower_better; in the fit score by default under the Area profile dimension.
Access. Otago’s site is behind a bot challenge, so the files are downloaded once per release in a browser and pinned by their SHA-256 checksums; a changed or unexpected file stops the pipeline instead of guessing. If the files are missing, the pipeline logs what to download and where and publishes no NZDep values at all, never old or guessed ones; the coverage gate then fails, and the quality gates must pass before a publish.
Known limitations: NZDep describes small areas using Census variables; it says nothing about any individual or household.
Sources (see the data registry):
otago_nzdep2023: University of Otago, Health Inequalities Research Programme (HIRP), NZDep2023 Index of Socioeconomic Deprivation. Licence CC-BY-4.0. Attribution: “NZDep2023, University of Otago (Atkinson, Salmond, Crampton, Viggers, Lacey 2024), CC BY 4.0”.
Status: implemented: nzdep2023_decile.
Rents
What is measured. rent_median_2br_weekly and rent_median_3br_weekly: the typical weekly rent of new bonds
for 2- and 3-bedroom dwellings (all dwelling types) over the latest four complete quarters. rent_median_1br_weekly
(the same for 1 bedroom) and rent_change_12m_pct (the percentage change in the all-bedroom figure against the four
quarters before) are computed the same way on every run but are blocked, so not published, while Tenancy
Services’ bond-system migration distorts them (see Bedroom reclassification and Comparability below).
Input. Tenancy Services’ open rental bond data (tenancy_rental_bond_data, CC BY 3.0 NZ): the detailed
quarterly files (January 1993 on), which give bonds lodged, active and closed and rent statistics by SA2, dwelling
type and bedroom count. The files are resolved from the landing page on every run and stored verbatim; a file whose
ETag and Last-Modified have not changed is copied from the previous snapshot. The MBIE Market Rent API
(mbie_market_rent_api) needs a signed MBIE API Access Agreement and MBIE’s manual approval, so it is blocked and is
not a source.
Formula. MBIE’s quarterly medians are used as published; nothing is recomputed from individual bonds. For an
SA2 2018 area f, bedroom count b and dwelling type ALL:
W = the latest 4 quarters that ended before the file's Last-Modified date; W' = the 4 quarters before W
U_b = the quarters of W in which bedroom count b passes the reclassification check (at least 2 [tune], else no value)
rent_median_{b}br_weekly(f) = Σ bonds(f, q, b) × median(f, q, b) / Σ bonds(f, q, b) over q in U_b with a published median
n = Σ bonds(f, q, b) over the same quarters
rent_change_12m_pct(f) = 100 × (R(f, W) / R(f, W') − 1), R = the same figure for all bedroom counts over all of W
bonds is Total Bonds, the bonds lodged in the quarter. The change is computed only when both windows have at least
20 bonds [tune], and its n is the smaller window’s count. A bond-weighted mean of quarterly medians approximates,
but is not, the median of the pooled bonds. The values then move from SA2 2018 to SA2 2023 through the
concordance. For the file published on 20 August 2026, W is July 2025 to June 2026 and W’ is July
2024 to June 2025.
Confidence. From the bonds behind the value: high at 30 or more, medium at 10 to 29, low below 10
[tune], the cut-offs used for event counts. Tenancy Services publishes the standard deviation of log rents in each
cell. In the 2-bedroom cells of the window on the 20 August 2026 file its median is 0.131, so a median from 10 bonds
has a relative standard error of about 5% (√(π/2) × 0.131 / √10) and one from 30 about 3%, while 2-bedroom rents
differ between SA2s by about 16% (the standard deviation of their logs). ADR 0004 has the evidence. The concordance
then lowers the confidence by one level where an SA2 2023 takes less than 90% of its addresses or area from one SA2
2018. The 12-month change is low whatever its count while the landing page says recent data may not be comparable
with earlier periods.
Bedroom reclassification. Tenancy Services warns that “Reported figures may reflect system changes, data reclassification, and methodology updates rather than underlying trends.” So each bedroom count is checked in every quarter against its national level (dwelling type ALL) over the eight quarters from October 2022 to September 2024, before the migration. A quarter fails when:
- the bedroom count’s share of all bonds is more than 1.5 times [tune] its mean share then: it has taken in bonds of other sizes; or
- its median divided by the all-bedroom median is more than 10% [tune] away from its mean ratio then: the mix of homes behind it has changed. The all-bedroom median does not depend on how bedrooms are recorded, so it is a steady yardstick; from 2016 to September 2024 the 1-bedroom ratio stayed within 9% of the reference and the 2- and 3-bedroom ratios within 5%.
A failed quarter is not used for that bedroom count. In the 20 August 2026 file every 1-bedroom quarter of the
window fails. From October 2025 the 1-bedroom share of bonds is 1.7, 2.8 and 2.9 times its reference, while bonds
with no bedroom count fell from 11,388 to 336 and 1-bedroom ‘House’ bonds rose from about 1,500 to about 20,000 a
quarter (our reading: the new system records many homes of unknown size as 1-bedroom; the page does not say so).
Since January 2025 the 1-bedroom median has also been 11% to 42% above its reference level: from late 2024 rooms and
boarding-house lets left the 1-bedroom count, then from October 2025 larger homes joined it. So rent_median_1br_weekly has no values,
and it stays blocked in the registry until a whole window passes; each run logs how many quarters pass. The 2- and
3-bedroom counts lost about 40% of their bonds to the reclassification, but their medians stayed within 2% of their
reference levels, so they are used with their smaller counts.
Comparability. The landing page also says “Recent data may not be directly comparable with earlier periods” and
“Users should exercise caution when comparing recent data releases with earlier periods”. A 12-month change is such a
comparison, and the data shows the problem. The same lettings move between dwelling types and bedroom counts: in
Mairehau North (Christchurch) lets at $235 appear as ‘Boarding House’, then as ‘House’ with no bedroom count, then as
1-bedroom ‘House’. The new system also records lettings the old one did not. All-bond medians then jump: on the 20
August 2026 file Epuni West shows −43% and Karori South −31%, at high confidence by their counts. Mix-adjusted changes
did not solve it: within dwelling types Karori South still showed −34% and Mairehau North −47%; within 2 to 4
bedrooms most jumps went, but four beyond ±25% remained nationally and 35% to 41% of the coverage was lost. So while
the page carries this warning (recorded on every run as comparable in
rental_bonds_quarterly), the change is computed at low confidence and rent_change_12m_pct is blocked in the
registry. It can be switched back on once the warning is gone.
Geography. The files are keyed by SA2 2019 codes: in the 2020 file, 2,005 of the 2,009 location ids are SA2 2018 codes, the other 4 are SA2 2019 splits (170801, 170802, 171801 and 171802), and only 1,464 are also SA2 2023 codes. They reach SA2 2023 only through the concordance, never by matching codes. Split codes are merged into their SA2 2018 parent first, the window figures are computed per SA2 2018, and each SA2 2023 takes the value of its dominant SA2 2018.
Small counts. MBIE applies fixed random rounding to base 3 and publishes nothing for a selection with fewer than
5 bonds: those cells are absent, and a few cells with bonds have no median. A quarter without a published median
contributes nothing, and an area with no published median in the window gets no value. We cannot tell a suppressed
cell from one without bonds, so the area is shown as having no data, never as zero. This limits coverage. On 1
October 2026 (the file of 20 August 2026) the 2-bedroom median covered 125 of the Wellington region’s 230 land SA2s
and 1,009 of the country’s 2,319, and the 3-bedroom median 170 and 1,400. Before the migration a four-quarter window
gave a 2-bedroom value for 62% to 66% of Wellington’s land SA2s and 46% to 51% of the country’s; the migration has
cut 2-bedroom bond counts by about 40%. Most values rest on few bonds (half of the Wellington 2-bedroom values on
fewer than 20): of the 125, 38 are high, 59 medium and 28 low confidence (nationally 238, 424 and 347), and
low-confidence values stay out of the fit score by default.
Each metric’s coverage_min is a floor for a broken run, set about 10 percentage points below the lowest coverage
seen in the national and Wellington runs, including the national run with its latest quarter left out (35.8% for 2
bedrooms, 54.2% for 3): 0.25 for the 2-bedroom median and the rent-to-income ratio, 0.4 for the 3-bedroom median,
and, from pre-migration windows, 0.1 for the 1-bedroom median and 0.5 for the change. SPEC §15 names 90% for rents
only as an example; with cells under 5 bonds suppressed, no window has come close. The coverage gate’s second
rule, at most 10 points lost against the previous file, still catches smaller breaks.
Provisional values. A value is provisional while the landing page carries Tenancy Services’ migration caveat
or while its window includes the latest quarter in the file, whose bonds are still being lodged (landlords have 23
working days). Both hold today, so every rent is labelled:
Provisional: the latest months may still be revised.
The caveat is read from the page on every run: “Rental bond data migration to the new bond management system
continues and therefore data remains in a provisional state at this time. Data is sourced from both legacy and new
systems and may be incomplete or revised.” The as_of date is the New Zealand date of the detailed quarterly file’s
Last-Modified header.
Direction. The medians are lower_better; your persona’s bedroom count selects which one enters the score, so a
1-bedroom persona has no rent in its score while the 1-bedroom median is blocked. rent_change_12m_pct is
neutral.
Known limitations: bond data covers private-sector landlords only and is listed by tenancy start date. The medians are for all dwelling types, so where many bonds are for rooms or boarding houses the 2- and 3-bedroom figures are little affected (rooms are almost all recorded as 1-bedroom), but an area’s figure can still move with the mix of homes let. Where an SA2 2019 area was split into several SA2 2023s, each shows the larger area’s value, not a local one.
Sources (see the data registry):
tenancy_rental_bond_data: Ministry of Business, Innovation and Employment (MBIE) — Tenancy Services, Rental bond data (CSV, since 1993). Licence CC-BY-3.0-NZ. Attribution: “Ministry of Business, Innovation and Employment (MBIE), Tenancy Services rental bond data, CC BY 3.0 NZ”.statsnz_sa2_2018: Stats NZ, Statistical Area 2 2018. Licence CC-BY-4.0. Attribution: “Stats NZ, Statistical Area 2 2018, CC BY 4.0”.statsnz_sa2_2023: Stats NZ, Statistical Area 2 2023. Licence CC-BY-4.0. Attribution: “Stats NZ, Statistical Area 2 2023, CC BY 4.0”.linz_addresses: Toitū Te Whenua Land Information New Zealand (LINZ), NZ Addresses. Licence CC-BY-4.0. Attribution: “Toitū Te Whenua LINZ, NZ Addresses, CC BY 4.0”.
Status: blocked, M1: rent_median_1br_weekly, rent_change_12m_pct; implemented: rent_median_2br_weekly, rent_median_3br_weekly.
Rent-to-income
What is measured. rent_per_income_ratio: a year of 2-bedroom rent as a share of the area’s median household
income.
Formula.
rent_per_income_ratio = (rent_median_2br_weekly × 52) / median_household_income
median_household_income is the 2023 Census median household income of the SA2 2023 (curated census2023_sa2,
from statsnz_census2023_households_sa2). The rent is the SA2 2023 value after the concordance, so the ratio keeps
the rent’s n, confidence, status and as_of. The value is a ratio (0.30 means 30% of income). Where either input
is missing, or the income is confidential or zero, there is no value. Stats NZ publishes $200,000 for any median
above that, so an SA2 at exactly $200,000 (4 nationally, none in the Wellington region) has no value either: its
ratio would only be an upper bound.
Direction. lower_better; in the fit score by default.
Known limitations: it combines 2023 Census income with a rolling rent window, and the income is for all households,
not only renting households. On 1 October 2026 it was published for the same 125 Wellington SA2s as the 2-bedroom
rent (median 0.26, range 0.11 to 0.45) and for 1,007 SA2s nationally (median 0.29, range 0.08 to 0.71), 2 fewer than
the 2-bedroom rent because their income is at the $200,000 top code. Its coverage_min (0.25) follows the
2-bedroom rent’s.
Sources (see the data registry):
tenancy_rental_bond_data: Ministry of Business, Innovation and Employment (MBIE) — Tenancy Services, Rental bond data (CSV, since 1993). Licence CC-BY-3.0-NZ. Attribution: “Ministry of Business, Innovation and Employment (MBIE), Tenancy Services rental bond data, CC BY 3.0 NZ”.statsnz_sa2_2018: Stats NZ, Statistical Area 2 2018. Licence CC-BY-4.0. Attribution: “Stats NZ, Statistical Area 2 2018, CC BY 4.0”.statsnz_sa2_2023: Stats NZ, Statistical Area 2 2023. Licence CC-BY-4.0. Attribution: “Stats NZ, Statistical Area 2 2023, CC BY 4.0”.linz_addresses: Toitū Te Whenua Land Information New Zealand (LINZ), NZ Addresses. Licence CC-BY-4.0. Attribution: “Toitū Te Whenua LINZ, NZ Addresses, CC BY 4.0”.statsnz_census2023_households_sa2: Stats NZ, 2023 Census totals by topic for households by SA2. Licence CC-BY-4.0. Attribution: “Stats NZ, 2023 Census, CC BY 4.0”.
Status: implemented: rent_per_income_ratio.
Prices
What is measured. price_median_ta: the REINZ monthly median sale price for the territorial authority the
area is in. Area level only: suburbmap publishes no property-level values, estimates or listings.
Direction. neutral; informational only.
Known limitations: a district median hides variation within the district, and monthly medians move with the mix of properties sold.
Sources (see the data registry):
reinz_hpi: Real Estate Institute of New Zealand (REINZ), REINZ monthly property report (HPI, medians). Licence not yet confirmed by probe; nothing derived from this source is published until it is.
Status: planned, later: price_median_ta.
Schools
What is measured. Every school the Ministry of Education’s Schools Directory lists as open: name, type (for
example Contributing, Full Primary, Secondary (Year 9-15)), authority (State, State : Integrated, Private, Charter
School), co-educational status, roll, Equity Index and location. These are school facts shown on the map and on
suburb pages, not scores. For secondary schools ncea_l2_pct is a link to the school’s NCEA statistics on the NZQA
site; no NCEA figures are copied, stored or scored.
Method.
- Source file. The directory is published on data.govt.nz (record
directory-of-educational-institutions, CC BY 4.0) and regenerated daily under a dated file name. Each run looks up the current file through the catalogue API, checks the licence on the record is still CC BY 4.0, and keeps the file byte for byte with the catalogue record and a SHA-256 checksum. - Open schools only. Rows with any other status (for example proposed schools that have not opened yet) are left out until the directory lists them as open.
- Location. A school’s SA2 is the SA2 2023 polygon containing the directory’s latitude and longitude, its region the regional council 2025 polygon, and its suburb the LINZ suburb or locality polygon, all measured in NZTM2000 (EPSG:2193) with the same rules as LINZ addresses: a point on a boundary takes the lowest SA2 code, and where suburb polygons overlap a Suburb wins over a Locality, then the smallest polygon. The directory has its own SA2 column; it uses SA2 2023 codes for every open school, but we keep it only as a check, so that a school’s pin and the addresses around it share an SA2. The two agree for all but a handful of schools (4 of 2,563 on 2026-10-01; two of those pins lie several hundred metres outside the coded SA2). A school without coordinates has no SA2, suburb or map point.
- Dates. A school row’s
as_ofis the directory’s extract date (from the file name). The roll count has its own date, the directory’s Roll_Date, kept asroll_date. - Never stored. Only a fixed list of columns is read. The directory’s roll counts by ethnic group (European, Māori, Pacific, Asian, MELAA, Other) and of international students, contact names, e-mail addresses and phone numbers are never read into the pipeline’s curated data, and a test checks that none of them reaches it.
Sources (see the data registry):
moe_schools_directory: Ministry of Education — Education Counts, New Zealand Schools directory. Licence CC-BY-4.0. Attribution: “Ministry of Education, Schools Directory, CC BY 4.0”.moe_enrolment_zones: Ministry of Education — Education Counts, School enrolment zones. Licence CC-BY-4.0. Attribution: “Ministry of Education, Enrolment Scheme Master (school enrolment zones), CC BY 4.0”.moe_equity_index: Ministry of Education — Education Counts, Equity Index (EQI). Licence CC-BY-4.0. Attribution: “Ministry of Education, Equity Index (Schools Directory), CC BY 4.0”.nzqa_secondary_stats: NZQA, NCEA secondary school statistics. Link-out only; no data is copied.
Status: planned, M1: ncea_l2_pct.
School zones
What is measured. in_zone_school_count: the number of State schools whose enrolment zone covers most of
the addresses in the area. nearest_primary_zone_school: the State primary school whose zone covers most of the
area’s addresses, where there is one.
Zone boundaries are drawn from Ministry of Education map files. The written zone description in the enrolment scheme legally prevails.
Zones. The Ministry publishes every enrolment scheme home zone in one national MapInfo file, the Enrolment
Scheme Master, updated through the year in termly batches. A release is dated by the “Version as at” line of its
Readme. The file sits behind a bot challenge, so each release is downloaded once in a browser and pinned by its
SHA-256 checksum. The file is converted with ogr2ogr; its coordinate system is checked to be NZTM2000 before
EPSG:2193 is assigned. Invalid polygons are repaired with make_valid (149 of 1,325 in the 14/07/2026 release,
changing total area by +0.01%). A zone is identified by school number and polygon number together, since polygon
numbers repeat across schools. Display names come from the directory, because the file’s names are ASCII and cut
at 50 characters; year levels (for example “Year 1-6”, “Y9-13”) are read from the zone name when it gives them.
- A zone is current on a date when its EffectiveDate is on or before that date. A zone with no EffectiveDate (6 in the 14/07/2026 release) is taken as current.
- A zone is in force when it is current, the directory lists the school as open, and the directory lists an enrolment scheme for the school. Zones that take effect later are mapped with their date but not counted.
- The Readme lists the release’s edits. Schools under its “Written Description only” heading had their written description amended without a map change, so their mapped zone may lag the legal description; these zones are flagged. Zones listed under “Abandoned schemes to delete / remove zone” that the file still holds are left out, as the Readme instructs.
Formula. For each SA2 and each school with a zone in force on the run date:
address_share = LINZ addresses in the SA2 inside any in-force zone of the school / LINZ addresses in the SA2
in_zone_school_count = number of State schools with address_share > 0.5
Measured in NZTM2000; an address on a zone boundary counts as inside, and a school’s year-level zones count as one
zone. The 0.5 threshold (“most of the addresses”) is provisional [tune]. Only State schools are counted:
state-integrated schools give preference of enrolment to families connected with their special character, so
living in their zone (often a whole district) does not on its own entitle a child to a place. Their zones are still
mapped and their address shares listed. A single-sex State school counts as one school. An SA2 with fewer than 10
addresses gets no value and no address shares. A value of 0 means that no single State school’s zone covers most
of the addresses: most addresses may lie outside every zone, or the area may be split between several schools’
zones (the confidence rules below flag the second case). The value’s n is the number of addresses. Its as_of
is the date the zones were judged in force (the run date); the zone release used is named in its source snapshot.
Confidence is high from 50 addresses and low below that. It is also low where:
- the count is not what a typical address gets: it differs from the median, over the SA2’s addresses, of the number of State schools whose zone in force holds the address. This flags areas split between zones (in central Masterton no school’s zone covers most addresses, yet nearly every address is in one primary zone) and overlapping zones;
- a zone of an open State school that is not in force (it takes effect later, or the directory lists no scheme for the school) reaches the SA2’s addresses;
- the directory lists a scheme for a State school but the release has no polygon for it (3 schools nationally on 2026-10-01, among them Petone Central School), and more than half of the SA2’s addresses lie within that school’s estimated reach: the median, over the 3 nearest State schools of the same year level with a zone, of the distance from the school to the farthest point of its zone [tune].
Low-confidence values are left out of the fit score by default.
nearest_primary_zone_school is read from the same address shares and marked in the pipeline (zoned_primary in
the coverage table): the State Contributing or Full Primary school with the largest address_share above 0.5 in
the SA2 (ties go to the lower school number). Where no State primary school’s zone covers most addresses, there is
none (the area lies outside every primary zone or is split between them) and the shares are shown instead.
State-integrated schools are not chosen, for the reason above, and neither are composite and area schools, because
their year-level zones are merged in the shares. Its confidence is the SA2’s in_zone_school_count confidence.
A regional load lists the address shares of schools located in that region. A school across the boundary whose zone reaches in is still counted; its shares are listed by its own region’s load.
Direction. in_zone_school_count is higher_better and in the fit score by default; the Family preset gives
the Schools dimension its highest weight. nearest_primary_zone_school is neutral.
Status note. Both are published. The zones licence was confirmed on 2026-10-01 on the Ministry’s own site: the Education Counts copyright statement licenses its material under CC BY 4.0 unless an item says otherwise, and the zones page and the release Readme state no exception (the older data.govt.nz record says CC BY 3.0 NZ; both allow re-use with attribution).
Known limitations: the Ministry warns that the zone polygons “do not have a high degree of spatial resolution” and should not be used for spatial queries against other datasets such as property boundaries. Address shares are such a query, so they are indicative. An address counted as in zone, especially near a boundary, must be checked against the school’s written enrolment scheme before relying on it.
Sources (see the data registry):
moe_enrolment_zones: Ministry of Education — Education Counts, School enrolment zones. Licence CC-BY-4.0. Attribution: “Ministry of Education, Enrolment Scheme Master (school enrolment zones), CC BY 4.0”.moe_schools_directory: Ministry of Education — Education Counts, New Zealand Schools directory. Licence CC-BY-4.0. Attribution: “Ministry of Education, Schools Directory, CC BY 4.0”.linz_addresses: Toitū Te Whenua Land Information New Zealand (LINZ), NZ Addresses. Licence CC-BY-4.0. Attribution: “Toitū Te Whenua LINZ, NZ Addresses, CC BY 4.0”.statsnz_sa2_2023: Stats NZ, Statistical Area 2 2023. Licence CC-BY-4.0. Attribution: “Stats NZ, Statistical Area 2 2023, CC BY 4.0”.
Status: implemented: in_zone_school_count, nearest_primary_zone_school.
EQI
What is measured. eqi_context: the Equity Index (EQI) of the area’s zoned primary school (see
nearest_primary_zone_school under School zones), a whole number on the Ministry of Education’s
344–569 scale; there is none where the area has no zoned primary school. A higher EQI means the school’s students
face more socioeconomic barriers.
Equity Index describes a school’s roll, not its quality.
It is shown as context about the school’s roll only, on school points and on suburb pages.
Method. EQI is published as the EQi_Index column of the Schools Directory, so it is taken from the same file
and date as the directory (see Schools); there is no separate download. Values are kept exactly as
published. Schools the directory marks “not applicable” (private schools) or “not calculated” have no EQI, and the
directory’s wording is kept with them. The directory publishes no EQI band, so none is shown and we do not derive
one.
Direction. neutral; never in the fit score.
Known limitations: the Ministry states that EQI is not a measure of school quality. suburbmap does not rank schools.
Sources (see the data registry):
moe_equity_index: Ministry of Education — Education Counts, Equity Index (EQI). Licence CC-BY-4.0. Attribution: “Ministry of Education, Equity Index (Schools Directory), CC BY 4.0”.moe_schools_directory: Ministry of Education — Education Counts, New Zealand Schools directory. Licence CC-BY-4.0. Attribution: “Ministry of Education, Schools Directory, CC BY 4.0”.moe_enrolment_zones: Ministry of Education — Education Counts, School enrolment zones. Licence CC-BY-4.0. Attribution: “Ministry of Education, Enrolment Scheme Master (school enrolment zones), CC BY 4.0”.linz_addresses: Toitū Te Whenua Land Information New Zealand (LINZ), NZ Addresses. Licence CC-BY-4.0. Attribution: “Toitū Te Whenua LINZ, NZ Addresses, CC BY 4.0”.statsnz_sa2_2023: Stats NZ, Statistical Area 2 2023. Licence CC-BY-4.0. Attribution: “Stats NZ, Statistical Area 2 2023, CC BY 4.0”.
Status: implemented: eqi_context.
Hazards
Hazard layers show the publisher’s extents, labels and dates verbatim. suburbmap assigns no risk grades or probabilities of its own and applies no shrinkage. Every hazard panel carries this line, with the publisher and the layer’s publication date filled in:
[Source], [date]. Model output. Absence on the map is not absence of risk.
Where a source does not cover an area the value is no_data, never zero, and for council flood layers the panel
says:
No {council} flood model covers this area
Exposure metrics. Each hazard metric is the share of LINZ address points in the SA2 that fall inside the hazard extent:
exposure_pct = 100 × addresses inside extent / addresses in SA2
computed in EPSG:2193 on validated geometries. An SA2 with no address points is no_data.
Labels. Where a source publishes ordered severity labels, they are mapped to ordered codes exactly as the source defines them, and a regression test for each source checks the order: “Very Low” can never map to a higher code than “Low”.
Direction. All hazard exposure metrics are lower_better and in the fit score by default.
Past natural-hazard insurance claims are not copied: we link to the Natural Hazards Portal instead.
Sources (see the data registry):
esnz_flood_national: Earth Sciences New Zealand (formerly NIWA), Flood hazard for NZ flood plains (1% AEP rainfall; current, +1/+2/+3 °C). Blocked: The free tier is CC BY-NC 4.0 (“NonCommercial — You may not use the material for commercial purposes”), and suburbmap’s embeds, API licensing, reports and any advertising are commercial use. Commercial Restricted (NZD 500 per by-region item) is limited to “a one-off project” and forbids outputs that “reproduce significant tranches or the full set of the Data”. Needs a licence from ESNZ (data-enquiries@earthsciences.nz).esnz_coastal_flood: Earth Sciences New Zealand (formerly NIWA), Extreme coastal flood maps (1% AEP + sea-level rise to 2 m). Blocked: Conflicting licences: the publisher’s FeatureServer item is “Creative Commons Attribution-No derivatives 4.0 International License (CC BY-ND 4.0)” (SA2 exposure percentages, clipping or re-tiling may be Adapted Material), while the DataHub national FGDB of the same data is under ESNZ’s Non-commercial Use licence, which forbids making Data or Outputs available to third parties (except Reports) and counts “displaying either on a website that directly generates revenue from advertising or is pay-to-view” as commercialisation. Needs ESNZ’s written clarification or permission.gwrc_flood_hazard: Greater Wellington Regional Council, GWRC flood hazard layers. Blocked: The item licence is GWRC’s website terms: “you are not permitted to copy or republish any substantial amount of the information from this website without the prior written consent of The Council”, which overrides the CC BY 4.0 default on gw.govt.nz/your-council/legal. Public tiles and SA2 exposure need GWRC’s written consent (gissupport@gw.govt.nz) or relicensing.wcc_flood_hazard: Wellington City Council, WCC District Plan flood hazard overlays. Blocked: Purpose-limited custom licence: “This feature layer has been created for the District Plan of Wellington City Council. If you require something beyond this purpose, please contact the WCC District Planning team”. Commercial re-display and derived statistics need WCC’s confirmation, and the underlying Wellington Water depth bands need WWL’s consent before third-party distribution.hcc_flood_hazard: Hutt City Council, Hutt City flood hazard layers. Blocked: HCC Open Data terms: “you are not permitted to copy or republish any substantial amount of the information from this website without the prior written consent of Hutt City Council”. Consent from HCC is needed before publishing tiles or statistics; Wellington Water’s 2024 depth bands require acknowledgement but grant no explicit licence.uhcc_flood_hazard: Upper Hutt City Council, UHCC District Plan flood hazard overlays. Licence CC-BY-4.0. Attribution: “Upper Hutt City Council (UHCC), District Plan Hazards, CC BY 4.0”.kcdc_flood_hazard: Kāpiti Coast District Council, KCDC latest flood hazard layers (not District Plan). Licence CC-BY-4.0; the attribution wording is not yet confirmed, so nothing derived from this source is published until it is.pcc_flood_hazard: Porirua City Council, PCC flood hazard layers (ponding, overland flow, stream corridor). Blocked: No licence stated: licenseInfo is empty on every PCC flood item, the Hub reports licence type ‘none’ and CKAN says “Other licensing (check with source agency)”. Needs written confirmation from PCC (and possibly Wellington Water, named in the items’ credits) before publishing.wairarapa_flood_hazard: Wairarapa councils (Masterton, Carterton and South Wairarapa District Councils), Wairarapa Combined District Plan Decision Flood Hazard Areas. Blocked: Licensed “CC BY-ND 4.0” (NoDerivatives): verbatim display may be fine, but derived SA2 exposure percentages and reprojected, simplified or tiled derivatives may breach ND. Needs permission from MDC, CDC and SWDC or GWRC, or a licence opinion.gwrc_tsunami_zones: Greater Wellington Regional Council / Wellington Region Emergency Management Office, Tsunami evacuation zones (Wellington region). Blocked: Conflicting licences on four GWRC items for Emergencies_P/MapServer/23. The hub and data.govt.nz item is “Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International” (NonCommercial conflicts with embeds, API licensing and reports; NoDerivatives with tsunami_zone_share); others say CC BY 4.0, GWRC website terms (no substantial copying without written consent) or “can be passed on to a third party but copyright needs to be acknowledged”. Needs written confirmation and commercial permission from GWRC/WREMO.gns_af250: GNS Science / Earth Sciences New Zealand, NZ Active Faults Database (1:250k, AF250). Blocked: Non-commercial only: “The Active Fault Data presented here cannot be used for commercial purposes including, but not limited to, reselling and/or providing technical services based on the Data” (the AF site terms add “The NZAFD must not be used for any form of commercial use”; the DataHub copy is under ESNZ’s Non-commercial Use licence). suburbmap’s embeds, API licensing and reports are commercial; needs ESNZ/GNS permission.linz_addresses: Toitū Te Whenua Land Information New Zealand (LINZ), NZ Addresses. Licence CC-BY-4.0. Attribution: “Toitū Te Whenua LINZ, NZ Addresses, CC BY 4.0”.auckland_flood_hazard: Auckland Council, Flood Plains, Flood Prone Areas, Overland Flow Paths, Coastal Inundation. Blocked: The items grant CC BY 4.0 and then state “You are not permitted to copy or republish any substantial amount of the information from this website without the prior written consent of Auckland Council”; Flood Plains carries no licence grant, and the council site terms say “You are not permitted to copy and sell or exploit for commercial purposes, any material on this website”. Needs Auckland Council’s written consent (Healthy Waters / open data team) before publishing (SPEC §16.10).nz_searise: NZ SeaRise programme, NZ SeaRise sea-level rise + vertical land movement. Licence CC-BY-4.0. Attribution: “NZ SeaRise programme, sea-level rise projections (doi:10.5281/zenodo.14722058), CC BY 4.0”.mbie_epb_register: Ministry of Business, Innovation and Employment (MBIE), Earthquake-prone buildings register. Blocked: Bulk CSV only by request to MBIE; do not scrape (SPEC §5, §16.7).nhc_natural_hazards_portal: Natural Hazards Commission Toka Tū Ake, Natural Hazards Portal (past claims). Link-out only; no data is copied.
Flood
What is measured. flood_exposure_pct: the share of addresses inside the national 1% annual exceedance
probability (AEP) rainfall flood extent from Earth Sciences New Zealand’s flood hazard maps for New Zealand flood
plains. council_flood_exposure_pct: the share of addresses inside a council flood hazard area, where a council
publishes one. In the Wellington region, Upper Hutt City and Kāpiti Coast publish theirs under CC BY 4.0. The
Greater Wellington, Wellington City and Hutt City layers need the council’s written consent, Porirua City states no
licence, and the Wairarapa councils’ layer is CC BY-ND 4.0, so those are blocked until the licence is resolved (see
the data registry).
Method. One adapter per publisher converts its layer to a common shape (hazard type, source, date, geometry, the source’s own severity label, and a link to the source’s method), and the exposure formula in Hazards is applied to each layer separately. The national layer also has +1, +2 and +3 °C scenarios; they are not scored.
Known limitations: the national model is rainfall-only, covers 256 flood plains and is not property-level. Council
layers differ in method and format, and each has its own adapter. Where no council model covers an area the council
metric is no_data, never zero. Auckland Council’s layers (from M5) differ by product: Flood Plains assume maximum
probable development and future climate change, Flood Prone Areas assume the outlet is blocked, and Overland Flow
Paths are not hydraulically modelled.
flood_exposure_pct is blocked: the national model’s free licence is non-commercial (CC BY-NC 4.0), and its paid
licence covers a one-off project only.
Sources (see the data registry):
esnz_flood_national: Earth Sciences New Zealand (formerly NIWA), Flood hazard for NZ flood plains (1% AEP rainfall; current, +1/+2/+3 °C). Blocked: The free tier is CC BY-NC 4.0 (“NonCommercial — You may not use the material for commercial purposes”), and suburbmap’s embeds, API licensing, reports and any advertising are commercial use. Commercial Restricted (NZD 500 per by-region item) is limited to “a one-off project” and forbids outputs that “reproduce significant tranches or the full set of the Data”. Needs a licence from ESNZ (data-enquiries@earthsciences.nz).linz_addresses: Toitū Te Whenua Land Information New Zealand (LINZ), NZ Addresses. Licence CC-BY-4.0. Attribution: “Toitū Te Whenua LINZ, NZ Addresses, CC BY 4.0”.gwrc_flood_hazard: Greater Wellington Regional Council, GWRC flood hazard layers. Blocked: The item licence is GWRC’s website terms: “you are not permitted to copy or republish any substantial amount of the information from this website without the prior written consent of The Council”, which overrides the CC BY 4.0 default on gw.govt.nz/your-council/legal. Public tiles and SA2 exposure need GWRC’s written consent (gissupport@gw.govt.nz) or relicensing.wcc_flood_hazard: Wellington City Council, WCC District Plan flood hazard overlays. Blocked: Purpose-limited custom licence: “This feature layer has been created for the District Plan of Wellington City Council. If you require something beyond this purpose, please contact the WCC District Planning team”. Commercial re-display and derived statistics need WCC’s confirmation, and the underlying Wellington Water depth bands need WWL’s consent before third-party distribution.hcc_flood_hazard: Hutt City Council, Hutt City flood hazard layers. Blocked: HCC Open Data terms: “you are not permitted to copy or republish any substantial amount of the information from this website without the prior written consent of Hutt City Council”. Consent from HCC is needed before publishing tiles or statistics; Wellington Water’s 2024 depth bands require acknowledgement but grant no explicit licence.uhcc_flood_hazard: Upper Hutt City Council, UHCC District Plan flood hazard overlays. Licence CC-BY-4.0. Attribution: “Upper Hutt City Council (UHCC), District Plan Hazards, CC BY 4.0”.kcdc_flood_hazard: Kāpiti Coast District Council, KCDC latest flood hazard layers (not District Plan). Licence CC-BY-4.0; the attribution wording is not yet confirmed, so nothing derived from this source is published until it is.
Status: blocked, M2: flood_exposure_pct; planned, M2: council_flood_exposure_pct.
Faults
What is measured. fault_within_500m: the share of addresses within 500 m of a mapped active fault in the
New Zealand Active Faults Database at 1:250,000 scale (AF250), using higher-resolution traces where they are
published.
Formula. Each fault trace is buffered by 500 m in EPSG:2193, the buffers are merged, and the exposure formula in Hazards is applied. Fault attributes are shown as published.
Known limitations: AF250 is mapped at 1:250,000 scale and is not intended for street- or property-scale use; its terms say it must not be used for interpretation at scales below 1:100,000. The 500 m band is a proximity indicator, not a fault avoidance zone.
fault_within_500m is blocked: the Active Faults Database may not be used for commercial purposes.
Sources (see the data registry):
gns_af250: GNS Science / Earth Sciences New Zealand, NZ Active Faults Database (1:250k, AF250). Blocked: Non-commercial only: “The Active Fault Data presented here cannot be used for commercial purposes including, but not limited to, reselling and/or providing technical services based on the Data” (the AF site terms add “The NZAFD must not be used for any form of commercial use”; the DataHub copy is under ESNZ’s Non-commercial Use licence). suburbmap’s embeds, API licensing and reports are commercial; needs ESNZ/GNS permission.linz_addresses: Toitū Te Whenua Land Information New Zealand (LINZ), NZ Addresses. Licence CC-BY-4.0. Attribution: “Toitū Te Whenua LINZ, NZ Addresses, CC BY 4.0”.
Status: blocked, M2: fault_within_500m.
Coastal flood
What is measured. coastal_flood_exposure_pct: the share of addresses inside Earth Sciences New Zealand’s 1%
AEP extreme coastal flood extent for the present day. The published sea-level-rise scenarios (up to 2 m) are not
scored.
Formula. The exposure formula in Hazards.
Known limitations: this is a national model; council coastal hazard studies, where they exist, can differ from it.
coastal_flood_exposure_pct is blocked until Earth Sciences New Zealand confirms which of its two licences applies:
CC BY-ND 4.0 on its FeatureServer, or a non-commercial licence on its DataHub copy of the same data.
Sources (see the data registry):
esnz_coastal_flood: Earth Sciences New Zealand (formerly NIWA), Extreme coastal flood maps (1% AEP + sea-level rise to 2 m). Blocked: Conflicting licences: the publisher’s FeatureServer item is “Creative Commons Attribution-No derivatives 4.0 International License (CC BY-ND 4.0)” (SA2 exposure percentages, clipping or re-tiling may be Adapted Material), while the DataHub national FGDB of the same data is under ESNZ’s Non-commercial Use licence, which forbids making Data or Outputs available to third parties (except Reports) and counts “displaying either on a website that directly generates revenue from advertising or is pay-to-view” as commercialisation. Needs ESNZ’s written clarification or permission.linz_addresses: Toitū Te Whenua Land Information New Zealand (LINZ), NZ Addresses. Licence CC-BY-4.0. Attribution: “Toitū Te Whenua LINZ, NZ Addresses, CC BY 4.0”.
Status: blocked, M2: coastal_flood_exposure_pct.
Tsunami
What is measured. tsunami_zone_share: the share of addresses inside a tsunami evacuation zone published for
the Wellington region, with each zone’s label as published.
Formula. The exposure formula in Hazards over all evacuation zones combined; the hazard panel shows the breakdown by zone using the source’s labels. An address outside every zone is counted as outside and is never shown with a tsunami warning.
Known limitations: evacuation zones are planning boundaries for evacuation, not probabilities of inundation. Only
regions with a published zone layer have this metric; elsewhere it is no_data.
tsunami_zone_share is blocked: Greater Wellington’s items for the zones carry conflicting licences, and the copy
on its open data hub is CC BY-NC-ND 4.0.
Sources (see the data registry):
gwrc_tsunami_zones: Greater Wellington Regional Council / Wellington Region Emergency Management Office, Tsunami evacuation zones (Wellington region). Blocked: Conflicting licences on four GWRC items for Emergencies_P/MapServer/23. The hub and data.govt.nz item is “Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International” (NonCommercial conflicts with embeds, API licensing and reports; NoDerivatives with tsunami_zone_share); others say CC BY 4.0, GWRC website terms (no substantial copying without written consent) or “can be passed on to a third party but copyright needs to be acknowledged”. Needs written confirmation and commercial permission from GWRC/WREMO.linz_addresses: Toitū Te Whenua Land Information New Zealand (LINZ), NZ Addresses. Licence CC-BY-4.0. Attribution: “Toitū Te Whenua LINZ, NZ Addresses, CC BY 4.0”.
Status: blocked, M2: tsunami_zone_share.
Crime
What is measured. victimisations_per_1000_36m: reported victimisations in public places plus burglaries,
per 1,000 residents, over 36 months. burglary_per_1000_dwellings_36m: reported burglaries per 1,000 dwellings
over 36 months.
Reported victimisations in public places and burglaries, per 1,000 residents. Offences in homes (except burglary) are not published by Police.
Input. NZ Police Victimisations Time and Place (meshblock × month × hour × location type × offence division), exported monthly. The raw export is kept unchanged, parsed, and its national total checked against the previous month’s (±15%). Meshblocks are mapped to SA2 2023 through the Stats NZ concordance once the meshblock vintage Police use has been verified.
Window. 36 months ending at the latest complete month.
Formula. For each SA2:
count: victimisations in the window (public-place location types plus burglary for the first metric; burglary only for the second);P: the denominator, Census 2023 usually resident population for the first metric and dwellings for the second;Y: the window length in years,Y = 3for the 36-month window;ta_rate: the territorial authority’s rate for the same window and denominator, in the published unit (per 1,000 residents or dwellings over the window).
Shrinkage runs in person-years (dwelling-years for burglary), then converts back to the published unit:
exposure = P × Y person-years
prior = ta_rate ÷ (1,000 × Y) TA victimisations per person-year
rate_py = (count + k · prior) ÷ (exposure + k)
rate = rate_py × 1,000 × Y per 1,000 residents (or dwellings) over the window
which is the same as rate = (1,000 · Y · count + k · ta_rate) ÷ (P · Y + k). The prior weight is
k = 20 person-years, the specification’s “20 person-years-equivalent”, and is marked [tune]: it is reviewed,
and any change recorded here, before the crime layer is published. Example: an SA2 with 100 residents and 3
victimisations (raw rate 30 per 1,000) in a TA whose rate is 10 per 1,000 publishes
(3,000 · 3 + 20 · 10) ÷ (300 + 20) = 28.75; with 2,000 residents and 12 victimisations (raw 6.0) it publishes
6.01. Code: crime_cell in pipeline/transforms/suppression.py (window_years, prior_weight_py).
Suppression. SA2s with fewer than 100 residents are suppressed (for the burglary metric too: the rule uses
residents, not dwellings). SA2 cells with a count below 3 are suppressed. Confidence: high at 30 or more events,
medium at 10–29, low below 10.
Direction. lower_better. Sensitive: off by default, and it enters your score only if you include the
Reported crime dimension. There is no “dangerous suburb” language and no ranking by crime, no per-address pins,
and crime is never joined to resident demographics.
Known limitations: Police do not publish offences in homes other than burglary, so they are excluded. Counts are reported victimisations, not all crime. National totals must reconcile within ±15% of Police’s own published totals for the same window before publication.
Sources (see the data registry):
police_victimisations_time_place: New Zealand Police, Victimisations Time and Place. Licence CC-BY-4.0. Attribution: “New Zealand Police, Victimisations Time and Place, CC BY 4.0”.statsnz_census2023_individuals_sa2: Stats NZ, 2023 Census totals by topic for individuals by SA2. Licence CC-BY-4.0. Attribution: “Stats NZ, 2023 Census, CC BY 4.0”.statsnz_mb_2023: Stats NZ, Meshblock 2023. Licence CC-BY-4.0. Attribution: “Stats NZ, Meshblock 2023, CC BY 4.0”.statsnz_census2023_dwellings_sa2: Stats NZ, 2023 Census totals by topic for dwellings by SA2. Licence CC-BY-4.0. Attribution: “Stats NZ, 2023 Census, CC BY 4.0”.
Status: planned, M2: victimisations_per_1000_36m, burglary_per_1000_dwellings_36m.
Crash
What is measured. injury_crashes_per_roadkm_5y: injury crashes per kilometre of local road over 5 years.
dsi_per_roadkm_5y_shrunk: crashes causing death or serious injury (DSI) per kilometre of local road over 5 years,
shrunk toward the territorial authority mean.
Road safety around here reflects road design and traffic volume, not residents’ driving.
Input. NZTA Crash Analysis System (CAS) open data, paged from its ArcGIS FeatureServer without the BETWEEN
filter, which is known to misbehave there. Each crash is snapped to an OpenStreetMap road segment within 30 m and
assigned its H3 resolution-9 cell and its SA2.
Window. 5 years, excluding the latest 3 months, because crashes can take up to 3 months to be reported.
Formula. For each SA2, count is injury crashes (or DSI crashes) on local roads, exposure is kilometres of
local road (state highways are excluded and reported separately), and prior_rate is the territorial authority’s
rate for the same window:
rate = (count + k · prior_rate) / (road_km + k)
count, prior_rate and the result are crashes over the whole 5-year window, so k is in road-km. The pipeline
default k = 10 road-km is provisional and marked [tune]: the specification gives no value, so it is tuned and
recorded here before the crash layer is published. Example: 4 crashes on 10 km of local road in a TA with 0.5
crashes per road-km gives (4 + 10 · 0.5) ÷ (10 + 10) = 0.45. Code: crash_cell (prior_weight_km).
Suppression and confidence. high at 30 or more crashes, medium at 10–29, low below 10 (so always low
below 5). An SA2 with no local road is no_data. Crashes are never shown at addresses: only as H3 resolution-9
hexes or road segments. Intersection hotspots are the top 1% of intersections in each territorial authority by
5-year injury crashes, shown the same way.
Direction. lower_better. Sensitive: off by default.
Known limitations: CAS holds Police-reported crashes only, so minor crashes are under-counted. CAS coding changed in 2019. National totals must reconcile within ±15% of NZTA’s own totals. OpenStreetMap-derived tables are kept separate because of the ODbL share-alike licence.
Sources (see the data registry):
nzta_cas: NZ Transport Agency Waka Kotahi (NZTA), Crash Analysis System (CAS) open data. Licence CC-BY-4.0. Attribution: “Waka Kotahi NZ Transport Agency, Crash Analysis System (CAS), CC BY 4.0”.osm_geofabrik_nz: OpenStreetMap contributors (via Geofabrik), OpenStreetMap New Zealand extract. Licence ODbL-1.0. Attribution: “© OpenStreetMap contributors, ODbL”.
Status: planned, M2: injury_crashes_per_roadkm_5y, dsi_per_roadkm_5y_shrunk.
School safety
What is measured. school_active_injury_crashes_5y: pedestrian and cyclist injury crashes within 500 m network
distance of a school over 5 years, with a sub-count for weekday school travel times (08:00–09:30 and 14:30–16:00).
Formula. From the CAS crashes in the Crash window, keep injury crashes involving a pedestrian or cyclist that lie within 500 m along the road network of a school in the Ministry of Education directory. Each crash counts once, even when it is near two schools, and is assigned to the SA2 it falls in. The sub-count applies the weekday time filter.
Suppression. small_count: fewer than 3 crashes is published as suppressed. Confidence follows the event-count
rule in Confidence.
Direction. lower_better. Sensitive: off by default.
Known limitations: as for Crash. It is a count, not a rate, so SA2s with more schools tend to have more.
Sources (see the data registry):
nzta_cas: NZ Transport Agency Waka Kotahi (NZTA), Crash Analysis System (CAS) open data. Licence CC-BY-4.0. Attribution: “Waka Kotahi NZ Transport Agency, Crash Analysis System (CAS), CC BY 4.0”.osm_geofabrik_nz: OpenStreetMap contributors (via Geofabrik), OpenStreetMap New Zealand extract. Licence ODbL-1.0. Attribution: “© OpenStreetMap contributors, ODbL”.moe_schools_directory: Ministry of Education — Education Counts, New Zealand Schools directory. Licence CC-BY-4.0. Attribution: “Ministry of Education, Schools Directory, CC BY 4.0”.
Status: planned, M2: school_active_injury_crashes_5y.
Commute
What is measured. Precomputed travel times from every SA2 to the region’s destinations:
pt_minutes_to_dest_0830 (public transport, arriving by 08:30 on a weekday), car_minutes_free_to_dest (driving
in free-flow traffic), walk_minutes_to_dest (walking), and the peak driving estimate in
Peak estimate.
Routing. All routing runs in the pipeline, never when you load a page, and never on Google Maps Platform.
Driving uses OSRM and walking and cycling use Valhalla, both on the Geofabrik New Zealand OpenStreetMap extract
rebuilt monthly. Public transport uses OpenTripPlanner 2 (or r5py) with the region’s GTFS timetable.
Origins. SA2 2023 population-weighted centroids, with LINZ address points as the weights.
Destinations. For each region: the CBD, the main hospital, the university and the airport, plus the top five workplace SA2s by 2023 Census travel-to-work flows, with destinations within 2 km of each other merged.
Formulas. car_minutes_free_to_dest is the OSRM free-flow duration. pt_minutes_to_dest_0830 is the median,
over three sample Tuesday–Thursday dates in school term, of the arrive-by-08:30 journey time including walking and
waiting. walk_minutes_to_dest is the Valhalla walking duration.
Isochrones. Each H3 resolution-9 hex takes the minutes of the SA2 it sits in (or its own time in city regions). Bands at 15, 30, 45 and 60 minutes are merged into polygons for each destination, mode and time slot and published as map tiles. The time-of-day slider offers 07:30, 08:30, 12:00, 17:30 and 21:00; a slot is shown only where a travel-time matrix exists for it.
Direction. lower_better; in the fit score when you choose a workplace.
Known limitations: times are from an area’s centre, not from a specific address. Public transport times depend on the timetable in force on the sample dates. OpenStreetMap completeness varies outside cities.
Sources (see the data registry):
metlink_gtfs: Greater Wellington Regional Council — Metlink, Metlink GTFS (static). Licence CC-BY-4.0. Attribution: “Greater Wellington Regional Council, Metlink GTFS, CC BY 4.0”.osm_geofabrik_nz: OpenStreetMap contributors (via Geofabrik), OpenStreetMap New Zealand extract. Licence ODbL-1.0. Attribution: “© OpenStreetMap contributors, ODbL”.statsnz_census2023_travel_to_work_sa2: Stats NZ, 2023 Census main means of travel to work by SA2. Licence CC-BY-4.0. Attribution: “Stats NZ, 2023 Census, CC BY 4.0”.linz_addresses: Toitū Te Whenua Land Information New Zealand (LINZ), NZ Addresses. Licence CC-BY-4.0. Attribution: “Toitū Te Whenua LINZ, NZ Addresses, CC BY 4.0”.
Status: planned, M3: pt_minutes_to_dest_0830, car_minutes_free_to_dest, walk_minutes_to_dest.
Peak estimate
What is measured. car_minutes_peak_to_dest: estimated driving minutes to the destination in the AM peak.
Formula. Where measured corridor speeds exist (see Congestion):
car_minutes_peak_to_dest = car_minutes_free_to_dest × route-weighted mean(1 / CCR)
where the mean of 1 / CCR is taken along the OSRM route, weighted by segment length. Where the route has no
measured segments, a single regional peak factor is used and the value is labelled:
Estimate: based on a regional peak factor, not measured speeds.
The TomTom Traffic Index implies a factor of about 1.6–1.8× in New Zealand metros; the factor used for each region is recorded here when the metric is implemented.
Confidence. low when the regional factor is used. The metric’s min_confidence_for_score is low, but the
global medium floor still applies, so a regional-factor estimate enters your score only if you opt in to
low-confidence values.
Direction. lower_better.
Known limitations: bus speeds understate car speeds where buses have their own lanes, and a regional factor is a blunt instrument. A later phase validates 20–30 corridors against a licensed TomTom trial and publishes the correlation.
Sources (see the data registry):
osm_geofabrik_nz: OpenStreetMap contributors (via Geofabrik), OpenStreetMap New Zealand extract. Licence ODbL-1.0. Attribution: “© OpenStreetMap contributors, ODbL”.metlink_gtfs_rt: Greater Wellington Regional Council — Metlink, Metlink GTFS-Realtime vehicle positions. Licence not yet confirmed by probe; nothing derived from this source is published until it is.
Status: planned, M3: car_minutes_peak_to_dest.
PT frequency
What is measured. pt_frequency_am_peak: scheduled public transport trips per hour at stops within 500 m of
the area’s addresses in the weekday AM peak.
Formula. From the GTFS static timetable, count the trips that serve stops within 500 m during the AM peak and divide by the length of the peak window in hours. The peak window, the sample weekdays, how distance is measured (straight line or along the network) and how per-address values are combined into the SA2 value are fixed when the metric is implemented and recorded here.
Direction. higher_better; in the fit score by default.
Known limitations: this is scheduled service, not what actually ran, and it ignores crowding and reliability.
Sources (see the data registry):
metlink_gtfs: Greater Wellington Regional Council — Metlink, Metlink GTFS (static). Licence CC-BY-4.0. Attribution: “Greater Wellington Regional Council, Metlink GTFS, CC BY 4.0”.linz_addresses: Toitū Te Whenua Land Information New Zealand (LINZ), NZ Addresses. Licence CC-BY-4.0. Attribution: “Toitū Te Whenua LINZ, NZ Addresses, CC BY 4.0”.
Status: planned, M3: pt_frequency_am_peak.
Congestion
What is measured. suburb_congestion_index_am: the share of arterial road length in the SA2 that is congested
in the AM peak. peak_delay_to_dest_min: the extra driving minutes to a destination in the peak compared with
free-flow traffic.
Congestion is estimated from bus speeds on weekday peaks (Tue–Thu, outside school holidays). It understates car speeds where buses have their own lanes.
Collector. A scheduled job reads the Metlink real-time vehicle positions feed every minute and stores compact records (trip, route, time, position, bearing) in daily files. Each night the pipeline matches the positions to OpenStreetMap road segments with Valhalla.
Corridor Congestion Ratio (CCR). For each segment and 15-minute weekday slot we take the median matched speed. The night baseline is the median weekday speed on the same segment between 20:00 and 22:00. Then:
CCR = median_peak_speed / night_baseline_speed
for the AM peak (07:30–09:00) and PM peak (16:30–18:00), Tuesday to Thursday, excluding school holidays. A slot is used only when it has at least 20 map-matched observations across at least 10 distinct weekdays.
Formulas.
suburb_congestion_index_am = 100 × arterial km with CCR_am < 0.6 / arterial km with a published CCR_am
peak_delay_to_dest_min = car_minutes_peak_to_dest − car_minutes_free_to_dest
Segments without a published CCR are unknown rather than uncongested, so they are left out of both parts of the
index. An SA2 with no arterial segment carrying a published CCR is no_data.
Suppression. small_count: slots below the observation thresholds are never published.
Direction. lower_better. Sensitive: off by default.
Known limitations: bus speeds are free to collect and point the right way, but they understate car speeds where buses have their own lanes and exist only on roads with bus routes. A reliability measure (buffer index) comes in a later phase, after at least 8 weeks of data.
Sources (see the data registry):
metlink_gtfs_rt: Greater Wellington Regional Council — Metlink, Metlink GTFS-Realtime vehicle positions. Licence not yet confirmed by probe; nothing derived from this source is published until it is.osm_geofabrik_nz: OpenStreetMap contributors (via Geofabrik), OpenStreetMap New Zealand extract. Licence ODbL-1.0. Attribution: “© OpenStreetMap contributors, ODbL”.
Status: planned, M3: suburb_congestion_index_am, peak_delay_to_dest_min.
Liveability
Walkable amenities, parks and busy-road exposure, derived from OpenStreetMap, public access area data and LINZ addresses. OpenStreetMap-derived tables are kept separate from other data because of the ODbL share-alike licence.
Sources (see the data registry):
osm_geofabrik_nz: OpenStreetMap contributors (via Geofabrik), OpenStreetMap New Zealand extract. Licence ODbL-1.0. Attribution: “© OpenStreetMap contributors, ODbL”.linz_addresses: Toitū Te Whenua Land Information New Zealand (LINZ), NZ Addresses. Licence CC-BY-4.0. Attribution: “Toitū Te Whenua LINZ, NZ Addresses, CC BY 4.0”.doc_public_access_areas: Herenga ā Nuku Aotearoa, the Outdoor Access Commission, Public Access Areas. Licence CC-BY-3.0-NZ. Attribution: “Herenga ā Nuku | Outdoor Access Commission, Department of Conservation, from Toitū Te Whenua | Land Information NZ (LINZ), Public Access Areas, CC BY 3.0 NZ”.
Amenities
What is measured. amenity_15min_walk_count: the number of everyday amenities within a 15-minute walk.
Formula. Amenities are OpenStreetMap features matching a fixed list of tags, published here when the metric is implemented. For each SA2, a 15-minute walking isochrone is computed with Valhalla from its population-weighted centroid, and the value is the number of distinct amenities inside it.
Direction. higher_better; in the fit score by default.
Known limitations: OpenStreetMap completeness varies, and a single isochrone from the centre under-represents large SA2s.
Sources (see the data registry):
osm_geofabrik_nz: OpenStreetMap contributors (via Geofabrik), OpenStreetMap New Zealand extract. Licence ODbL-1.0. Attribution: “© OpenStreetMap contributors, ODbL”.linz_addresses: Toitū Te Whenua Land Information New Zealand (LINZ), NZ Addresses. Licence CC-BY-4.0. Attribution: “Toitū Te Whenua LINZ, NZ Addresses, CC BY 4.0”.
Status: planned, M3: amenity_15min_walk_count.
Parks
What is measured. park_area_share: the share of the SA2’s land that is a park, reserve or public access area.
Formula. OpenStreetMap park and reserve polygons are merged with Herenga ā Nuku public access areas, intersected with the SA2 in EPSG:2193, and divided by the SA2’s land area:
park_area_share = 100 × park_area / sa2_land_area
Water-only SA2s have no land area and are no_data.
Direction. higher_better; in the fit score by default.
Known limitations: large rural reserves count even where they are not everyday green space; private open space is not included.
Sources (see the data registry):
osm_geofabrik_nz: OpenStreetMap contributors (via Geofabrik), OpenStreetMap New Zealand extract. Licence ODbL-1.0. Attribution: “© OpenStreetMap contributors, ODbL”.doc_public_access_areas: Herenga ā Nuku Aotearoa, the Outdoor Access Commission, Public Access Areas. Licence CC-BY-3.0-NZ. Attribution: “Herenga ā Nuku | Outdoor Access Commission, Department of Conservation, from Toitū Te Whenua | Land Information NZ (LINZ), Public Access Areas, CC BY 3.0 NZ”.
Status: planned, M3: park_area_share.
Busy road
What is measured. busy_road_exposure_pct: the share of addresses within 50 m of a busy road.
Formula. Busy roads are selected by OpenStreetMap road class; the classes used are listed here when the metric is implemented. They are buffered by 50 m in EPSG:2193 and the address-share formula from Hazards is applied.
Direction. lower_better. Treated like noise exposure, so it is sensitive: off by default, and it enters your
score only if you opt in to it (liveability in the inc list of the fit score URL). The rest of the
Liveability dimension is scored by default.
Known limitations: road class stands in for traffic volume; no measured traffic counts are used.
Sources (see the data registry):
osm_geofabrik_nz: OpenStreetMap contributors (via Geofabrik), OpenStreetMap New Zealand extract. Licence ODbL-1.0. Attribution: “© OpenStreetMap contributors, ODbL”.linz_addresses: Toitū Te Whenua Land Information New Zealand (LINZ), NZ Addresses. Licence CC-BY-4.0. Attribution: “Toitū Te Whenua LINZ, NZ Addresses, CC BY 4.0”.
Status: planned, M3: busy_road_exposure_pct.
Environment
Sunlight and slope from LINZ 1 m LiDAR elevation data, computed at address points and summarised for each SA2.
LiDAR covers more than 80% of New Zealand; where it does not exist the value is no_data and the gap is marked on
the map.
Sources (see the data registry):
linz_lidar_dsm: Toitū Te Whenua Land Information New Zealand (LINZ), NZ LiDAR 1m DSM. Licence CC-BY-4.0. Attribution: “Sourced from the LINZ Data Service and licensed by Toitū Te Whenua Land Information New Zealand, for re-use under the Creative Commons Attribution 4.0 International licence”.linz_lidar_dem: Toitū Te Whenua Land Information New Zealand (LINZ), NZ LiDAR 1m DEM. Licence CC-BY-4.0. Attribution: “Sourced from the LINZ Data Service and licensed by Toitū Te Whenua Land Information New Zealand, for re-use under CC BY 4.0”.linz_addresses: Toitū Te Whenua Land Information New Zealand (LINZ), NZ Addresses. Licence CC-BY-4.0. Attribution: “Toitū Te Whenua LINZ, NZ Addresses, CC BY 4.0”.
Winter sun
What is measured. winter_sun_hours_median: the median, over the SA2’s address points, of hours of direct sun
on the June (winter) solstice.
Formula. For each address point, the sun’s position is stepped through the solstice day and the point counts as in sun when the sun is above the local horizon formed by the 1 m digital surface model (terrain, buildings and trees). The SA2 value is the median across its address points.
Direction. higher_better; in the fit score when available.
Known limitations: it is measured at the address point, not at a dwelling’s windows, and the surface model reflects the date of the LiDAR survey.
Sources (see the data registry):
linz_lidar_dsm: Toitū Te Whenua Land Information New Zealand (LINZ), NZ LiDAR 1m DSM. Licence CC-BY-4.0. Attribution: “Sourced from the LINZ Data Service and licensed by Toitū Te Whenua Land Information New Zealand, for re-use under the Creative Commons Attribution 4.0 International licence”.linz_lidar_dem: Toitū Te Whenua Land Information New Zealand (LINZ), NZ LiDAR 1m DEM. Licence CC-BY-4.0. Attribution: “Sourced from the LINZ Data Service and licensed by Toitū Te Whenua Land Information New Zealand, for re-use under CC BY 4.0”.linz_addresses: Toitū Te Whenua Land Information New Zealand (LINZ), NZ Addresses. Licence CC-BY-4.0. Attribution: “Toitū Te Whenua LINZ, NZ Addresses, CC BY 4.0”.
Status: planned, M5: winter_sun_hours_median.
Slope
What is measured. slope_median_pct: the median ground slope, in percent, at the SA2’s address points.
Formula. Slope (rise over run, as a percentage) is taken from the 1 m digital elevation model at each address point, and the SA2 value is the median across its address points.
Direction. lower_better; in the fit score when available.
Known limitations: the slope at the address point can differ from the slope of the driveway or section.
Sources (see the data registry):
linz_lidar_dem: Toitū Te Whenua Land Information New Zealand (LINZ), NZ LiDAR 1m DEM. Licence CC-BY-4.0. Attribution: “Sourced from the LINZ Data Service and licensed by Toitū Te Whenua Land Information New Zealand, for re-use under CC BY 4.0”.linz_addresses: Toitū Te Whenua Land Information New Zealand (LINZ), NZ Addresses. Licence CC-BY-4.0. Attribution: “Toitū Te Whenua LINZ, NZ Addresses, CC BY 4.0”.
Status: planned, M5: slope_median_pct.