Skip to content

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.

Modelled, not measured

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 403 addon_required, naming addon-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 gets 403 dev_only, and past the month's premium calls (5,000, summed across every gated add-on) it gets usage_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.0884

Returns 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

FieldWhat it is
h3The H3 index of the hexagon.
resolution11, about 25 m across.
citycalgary, edmonton, vancouver, toronto, montreal or quebec-city.
ldenDay-evening-night level in dB (EU Lden): the 24-hour level with evening sound weighted 5 dB and night sound 10 dB heavier.
lnightNight level in dB, 23:00 to 07:00.
score0 to 100, anchored to the WHO 2018 Environmental Noise Guidelines. 100 is quiet.
risk100 minus the score.
labelThe 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_sourceThe 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.
notePresent only when lden is null.

The score's labels are the same everywhere, in the API, the overlay's colours and the block:

scorelabel
80 and upQuiet
60 to 79Moderate
40 to 59Noisy
20 to 39Very noisy
Below 20Severe

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,
});
scoreColour
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:

ZoomH3 resolutionHexagon sizeHexagons (six cities)
0 to 108about 460 m9,623
11 to 129about 174 m64,837
13 to 1410about 66 m447,261
15 to 1811about 25 m3,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.json

The first two lines are the React lane; the third is Vue and Nuxt, where shadcn-vue takes the item URL directly.

Next steps