All thirty days

Day 3: Polygons

How far 30 minutes gets you from a central public library in 24 Canadian cities, on foot or by scheduled transit, drawn at one scale from unmap's own isochrones.

libraries.json
Loading 24 libraries
Area every departure reaches (km²)
  • Reached whichever minute you leave
  • Reached on the right departure
  • 30 minutes on foot
Pick a city. Click a shape for its area.

Each shape is the ground 30 minutes covers from a city's central public library on a Wednesday morning, walking or riding scheduled buses, trains and metros. We asked unmap's isochrone API seven times per library, leaving every ten minutes from 7:30 to 8:30. The solid shape is what all seven departures reach. The pale one is what at least one reaches. The dashed line is the walk alone, and every city is drawn at the same scale.

From the Toronto Reference Library, 74.6 km² is in reach whichever minute you leave, five and a half times the walk. Montréal's Grande Bibliothèque reaches 73.2 km² every time and 123.9 km² if you catch the right train, more than any other library here. The pieces scattered away from each city's main shape are the stations: you get off, walk what is left of the 30 minutes, and the island ends.

In smaller cities the timetable decides. Fredericton's buses run on a half-hour pulse: leave the library at 7:40 or 8:10 and 30 minutes covers 46.5 km², leave at 7:50 or 8:20 and it covers 8.1, barely more than walking. Charlottetown reaches 8.7 km² every time and 37.9 at best, Whitehorse 5.6 and 23.5.

Four libraries show only the walk: Sydney, Summerside, Corner Brook and Iqaluit. unmap's transit data has no trip from their doors in that hour that beats walking. That is a gap in the schedules unmap holds, not a claim about the buses in those towns.

How it's made

One basemap and one layer. This is the whole map, minus the legend.

import { Unmap } from '@unmap/sdk'
import { intersection, union } from 'polyclip-ts'

const unmap = new Unmap({ key: 'um_live_...' })
const library = [-73.5624, 45.5155] // Grande Bibliothèque, Montréal
const area = (iso) => iso.features[0].geometry.coordinates

// The walk, and seven transit departures from 7:30 to 8:30.
const walk = area(await unmap.router.isochrone(library, { minutes: [30], mode: 'pedestrian' }))
const departures = []
for (const time of ['07:30', '07:40', '07:50', '08:00', '08:10', '08:20', '08:30']) {
  const iso = await unmap.router.isochrone(library, {
    minutes: [30],
    mode: 'transit',
    departAt: `2026-11-04T${time}`,
  })
  departures.push(union(walk, area(iso))) // never worse than walking
}

const always = intersection(...departures) // every departure reaches it
const best = union(...departures) // the right departure reaches it

We picked the largest city in each province, a second city in each (the next largest or the capital, and both in New Brunswick), and the one city in each territory, and found each library with unmap's own geocoder. Regina starts on 12th Avenue at the front door, because the address point sat on a path the transit search could not leave. For each library we sent eight requests to unmap's isochrone API: one walk and seven transit departures. The transit search walks at most about 2 km before it must board, so each departure's shape is joined with the walk, since nobody would wait for a bus they could outwalk. The solid shape is where all seven overlap and the pale one is all seven combined. The zoom is corrected for latitude so every city shares one ground scale. Schedules are the ones in unmap's transit graph for 4 November 2026, and a late or cancelled trip is not modelled. The page and the scripts were written with an AI coding assistant (Claude).

Data

  • Travel-time areas: unmap routing on OpenStreetMap data, © OpenStreetMap contributors (ODbL), and each agency's published GTFS schedules, via the Mobility Database.
  • Library locations: unmap geocoding, from OpenStreetMap (© OpenStreetMap contributors, ODbL) and municipal open address data.
  • Basemap: unmap, © OpenStreetMap contributors.

Share this map

Post it, or make your own and tag it #30DayMapChallenge.