Urban noise
Every request needs an API key; see Authentication.
The Urban Noise add-on serves modelled road, rail, aircraft and commercial noise for six Canadian
cities: Calgary, Edmonton, Vancouver, Toronto, Montréal and Québec City. It has three parts: a
point lookup that returns the noise of the hexagon at a coordinate, an urban-noise overlay that
colours any style by how quiet each place is, and the tiles under it for drawing the layer
yourself. All three come from one immutable release, and every response names it.
These levels come from a noise model, not from microphones. Nothing has calibrated them against measurements yet, and against Toronto's published measurements they read 3 to 6 dB low by road type. Use them to screen and compare places, not to assess compliance with a bylaw, support a legal claim or replace an acoustic study.
Access and pricing
Urban Noise is sold as a preview while it covers six cities: the /noise/point endpoint, the
urban-noise overlay and its tiles sit behind the Urban Noise add-on, SKU addon-urban-noise,
at US$39 a month or US$390 a year, the same on every paid plan. Add it from the dashboard
billing page, on top of any paid plan.
- A paid key without the add-on gets
403addon_required, namingaddon-urban-noise. - A dev-plan key is free from a dev origin (
localhost,127.0.0.1,*.localhost), so you can build the whole integration now. From a production origin it gets403dev_only, and past the month's premium calls (5,000, summed across every gated add-on) it getsusage_limit_reached.
A noise tile or a point lookup is one call from your plan's shared pool: the add-on buys access,
never volume. A refusal is never billed, and neither is a 422 or a 503. The raw grid as a
file is not sold; if you need it, talk to us. See
Add-ons and metering for how SKUs and capabilities
relate, and Errors for the error bodies.
Point lookup
GET /noise/point?lat=51.054&lng=-114.0884Returns the H3 hexagon at resolution 11 (about 25 m across) that holds the point. lat and lng
are WGS84 degrees and both are required; a missing or out-of-range value is 400 bad_request.
curl "https://api.unmap.dev/noise/point?lat=51.054&lng=-114.0884&key=um_sk_live_..."import { Unmap } from "@unmap/sdk";
const unmap = new Unmap({ key: "um_sk_live_..." });
const { data, meta } = await unmap.noise.point({ lat: 51.054, lng: -114.0884 });{
"data": {
"h3": "8b12ccd2929afff",
"resolution": 11,
"city": "calgary",
"lden": 49.3,
"lnight": 40.2,
"score": 91,
"risk": 9,
"label": "Quiet",
"exceeds_who": { "day": false, "night": false },
"dominant_source": "road",
"sources_db": { "road": 45.7, "rail": 44.3, "aircraft": null, "commercial": 28 }
},
"meta": {
"data_version": "2026-11-10.28f32d82e125",
"attribution": "© OpenStreetMap contributors; noise model: PickYourPlace",
"licence": "ODbL-1.0"
}
}That is the hexagon at 236 11 Street NW in Hillhurst, Calgary, with meta abridged.
A point outside the six cities, or inside a city's box but outside its modelled grid, is 422
outside_coverage. The body lists the covered cities, each with its slug, name in English
and French, and bbox, so you can tell your user where the data does reach. It never answers
with the nearest hexagon.
The noise record
| Field | What it is |
|---|---|
h3 | The H3 index of the hexagon. |
resolution | 11, about 25 m across. |
city | calgary, edmonton, vancouver, toronto, montreal or quebec-city. |
lden | Day-evening-night level in dB (EU Lden): the 24-hour level with evening sound weighted 5 dB and night sound 10 dB heavier. |
lnight | Night level in dB, 23:00 to 07:00. |
score | 0 to 100, anchored to the WHO 2018 Environmental Noise Guidelines. 100 is quiet. |
risk | 100 minus the score. |
label | The score in words: see below. |
exceeds_who | { day, night }: whether lden is above 53 dB and lnight above 45 dB, the WHO 2018 levels for road traffic. |
dominant_source | The loudest source: road, rail, aircraft or commercial. |
sources_db | { road, rail, aircraft, commercial }: each source's level in dB, or null where that source is not modelled in range. |
note | Present only when lden is null. |
The score's labels are the same everywhere, in the API, the overlay's colours and the block:
score | label |
|---|---|
| 80 and up | Quiet |
| 60 to 79 | Moderate |
| 40 to 59 | Noisy |
| 20 to 39 | Very noisy |
| Below 20 | Severe |
A null level means no modelled source, never silence. Where no road, railway, flight path or
commercial source is within the model's range, the hexagon has lden: null, and score, risk,
label and the WHO flags are null too, with note: "no modelled source within range". That is
12 to 25% of the resolution 11 hexagons, depending on the city. Never show it as 0 dB or as quiet:
it means the model has nothing to say there.
The noise overlay
Add overlays=urban-noise to a style URL. It draws on any style, as a fill above the roads and
below the labels, coloured by score:
curl "https://api.unmap.dev/styles/muted.json?overlays=urban-noise&key=um_sk_live_..."import { Unmap } from "@unmap/sdk";
const unmap = new Unmap({
key: "um_pk_live_...",
container: "map",
style: "muted",
overlays: ["urban-noise"],
center: [-114.07, 51.05],
zoom: 13,
});score | Colour |
|---|---|
| Below 20 | #ef4444 red |
| 20 to 39 | #f97316 orange |
| 40 to 59 | #f59e0b amber |
| 60 to 79 | #84cc16 lime |
| 80 and up | #22c55e green |
The fill is at 45% opacity so the streets stay readable under it, and a hexagon with no modelled
source is left transparent. The colours are data colours, the same PickYourPlace draws its noise
map with, and do not change with the style or a theme. muted suits it best, because its
greyscale leaves the colour to the data. An explicit overlays=urban-noise from a key without the
add-on is a 403; a profile that would include it leaves it out instead,
so the basemap still renders.
Drawing the layer yourself
The tiles are at /layers/urban-noise/{z}/{x}/{y}, with one source-layer, noise, at every zoom.
Each zoom band holds one H3 resolution, so the hexagons get finer as you zoom in:
| Zoom | H3 resolution | Hexagon size | Hexagons (six cities) |
|---|---|---|---|
| 0 to 10 | 8 | about 460 m | 9,623 |
| 11 to 12 | 9 | about 174 m | 64,837 |
| 13 to 14 | 10 | about 66 m | 447,261 |
| 15 to 18 | 11 | about 25 m | 3,113,322 |
Each feature is one hexagon with the properties h3_id, lden, lnight, noise_score_who,
noise_risk_who, exceeds_who_day, exceeds_who_night, dominant_source, road_noise_db,
rail_noise_db, aircraft_noise_db and commercial_noise_db. A property with no value is absent
from the tile, so filter on ["has", "lden"] to leave out the hexagons with no modelled source.
At resolutions 8 to 10 each value is the median of the resolution 11 hexagons inside it.
map.addSource("noise", {
type: "vector",
tiles: ["https://api.unmap.dev/layers/urban-noise/{z}/{x}/{y}?key=um_pk_live_..."],
minzoom: 0,
maxzoom: 18,
attribution: "© OpenStreetMap contributors; noise model: PickYourPlace",
});
map.addLayer({
id: "noise-night",
type: "fill",
source: "noise",
"source-layer": "noise",
filter: ["has", "lnight"],
paint: {
"fill-color": ["step", ["get", "lnight"], "#22c55e", 40, "#84cc16", 45, "#f59e0b", 50, "#f97316", 55, "#ef4444"],
"fill-opacity": 0.45,
},
});That colours by the night level instead, with 45 dB, the WHO night level, as the step into amber.
How the levels are modelled
The model is PickYourPlace's, run for each city on 2026-11-09 and 10. In plain terms:
- Roads use the UK method CRTN 1988 (Calculation of Road Traffic Noise): each road is cut into pieces of at most 100 m, each piece's level comes from its traffic, speed, share of heavy vehicles, surface and gradient, and the level falls off with distance over hard or soft ground. Buildings and barriers between the road and the hexagon screen it. Night and Lden levels come from the TRL conversion of the CRTN level.
- Traffic is the City of Calgary's own counts in Calgary, with Alberta's highway volumes and heavy-vehicle shares. In the other five cities every road takes a default volume for its OpenStreetMap road class.
- Buildings in Calgary have the City's lidar heights. Elsewhere they are Natural Resources Canada footprints, with the OpenStreetMap height where one is tagged and 6 m where not, so a tower screens like a house.
- Rail is OpenStreetMap track, with Transport Canada's grade-crossing train counts.
- Aircraft is noise exposure forecast (NEF) contours. Two cities have published contours: the City of Calgary's in Calgary, and in Edmonton the contours of the Edmonton International Airport Vicinity Protection Area Regulation (Alta Reg 55/2006, Schedule 2). In Vancouver, Toronto, Montréal and Québec City the contours are modelled from the runways mapped in OpenStreetMap, with the plume fitted to Calgary's open contours, so they are a model of the runways and not the airport's own forecast. Night aircraft movements are an assumed 10%.
- Commercial noise is points of interest from OpenStreetMap, with the business licences Calgary, Edmonton, Vancouver and Toronto publish.
The sources add up as sound energy into a day, evening and night level, and lden and lnight
come from those. The WHO 2018 guidelines set 53 dB Lden and 45 dB Lnight as the levels above which
road traffic noise is associated with adverse health effects; exceeds_who compares against them,
and score is anchored to them.
Attribution and licence
The noise levels are computed from OpenStreetMap roads, railways, barriers and points of interest,
so the whole noise database, the computed levels included, is a derivative database of
OpenStreetMap under the Open Database License (ODbL). Show "© OpenStreetMap contributors"
wherever you display the data or the overlay. Every /noise/point response carries the credit in
meta.attribution ("© OpenStreetMap contributors; noise model: PickYourPlace") and the licence in
meta.licence (ODbL-1.0), and the overlay puts the same credit on the map. Cache against
meta.data_version: a release never changes once published.
Selling access is allowed under the ODbL, and so is your use of what you get. Anyone who asks can
have the derived noise database itself under the ODbL: email hello@unmap.dev for a copy of the
release you are using, and you get its four PMTiles archives and its manifest.json, which are
kept unedited for every release.
The inputs that are not OpenStreetMap keep their own licences and need only attribution:
- City of Calgary, Open Government Licence – City of Calgary: traffic volumes, 3D buildings with lidar heights, rail tracks, noise exposure forecast contours and business licences.
- Natural Resources Canada, Open Government Licence – Canada: building footprints.
- Transport Canada, Open Government Licence – Canada: railway grade crossings and train counts.
- Government of Alberta, Open Government Licence – Alberta: highway traffic volumes and heavy-vehicle shares.
- City of Edmonton, City of Vancouver and City of Toronto, each under its own Open Government Licence: business licences.
- © Alberta King's Printer: the noise exposure forecast contours for Edmonton, digitised from Schedule 2 of the Edmonton International Airport Vicinity Protection Area Regulation (Alta Reg 55/2006).
- Copernicus DEM GLO-30, for road gradients: © DLR e.V. 2010-2014 and © Airbus Defence and Space GmbH 2014-2018 provided under COPERNICUS by the European Union and ESA; all rights reserved.
The full list is also the attribution of the layer's catalog row.
PickYourPlace's own interpretation of these levels, such as neighbourhood scores and comparisons,
is not part of this layer.
Coverage and limits
- Six cities, each over its own modelled grid: Calgary (631,986 hexagons at resolution 11), Montréal (623,556), Toronto (582,433), Edmonton (535,841), Québec City (465,816) and Vancouver (273,690). Nothing outside them; a new city joins the same add-on.
- Calgary is the best-calibrated city, with its own traffic counts and lidar building heights. The other five use road-class traffic defaults and the 6 m default building height, so screening behind tall buildings is under-stated and levels there read high.
- Nothing has calibrated the model against measurements. Against Toronto Public Health's measurements it reads 3 to 6 dB low by road type.
- There is no background floor: a hexagon far from every source can read below 30 dB.
- The values are per hexagon, not per address, and an hourly profile from Calgary's arterials is used for every road in every city.
- It is screening data. It is not suitable for compliance, legal or regulatory use.
Client code
SDK
@unmap/sdk exposes the lookup as unmap.noise.point({ lat, lng }). It returns { data, meta },
and throws a NoiseError with the gateway's code: addon_required with the SKU in addon on a
403, and outside_coverage with the covered cities on a 422.
import { Unmap, NoiseError } from "@unmap/sdk";
const unmap = new Unmap({ key: "um_sk_live_..." });
try {
const { data } = await unmap.noise.point({ lat: 45.5019, lng: -73.5674 });
if (data.lden === null) console.log("No modelled source here");
else console.log(`${data.label}: ${data.lden} dB Lden, ${data.lnight} dB at night`);
} catch (error) {
if (error instanceof NoiseError && error.code === "outside_coverage") {
console.log("Covered:", error.cities?.map((city) => city.name.en).join(", "));
}
}Urban noise map block
urban-noise-map is a whole page built from the registry: the overlay with a legend, a Day (Lden)
and Night (Lnight) switch for the colouring, and a card for any place you click or search, with
its score, its levels against the WHO thresholds and a bar per source. Install it like any other
block:
npx shadcn@latest registry add @unmap=https://registry.unmap.dev/r/{name}.json
npx shadcn@latest add @unmap/urban-noise-map
npx shadcn-vue@latest add https://registry.unmap.dev/r/vue/urban-noise-map.jsonThe first two lines are the React lane; the third is Vue and Nuxt, where shadcn-vue takes the item URL directly.
Next steps
- Layers for how overlays compose onto a style, and the catalog row.
- Maps API for the
mutedstyle. - Plans and limits for dev origins and metering.