13.3 Service Areas and Isochrones
Areas reachable within a time or distance budget — the staple of access analysis.
Key takeaways
- An isochrone is the set of locations reachable within a time budget (e.g., "within 15 minutes").
- Generated by running routing outward from a source until the budget is exhausted.
- Crucial for accessibility, site selection, and service-area planning.
Introduction
"What's within 10 minutes' walk of this clinic?" "Which restaurants can be delivered in 30 minutes?" These are isochrone questions — defining areas by time rather than geometric distance. This lesson covers how they're generated and how to use them.
What an isochrone is
An isochrone (Greek isos + chronos = "equal time") is a contour of constant travel time from a source. Modern isochrones are typically polygons showing everywhere reachable within a specified time budget.
Also called:
- Service areas — the area served by a facility within a time budget.
- Travel-time polygons — generic term.
How they're generated
Outward routing from a source:
- Start at source with cost 0.
- Explore neighbouring edges Dijkstra-style.
- Stop expanding when cumulative cost exceeds budget.
- Gather the set of reachable nodes and edges.
- Compute a concave hull or alpha shape around them → polygon.
Some engines also return the raw edge geometry, allowing richer visualisation.
Multiple bands
Isochrones usually come in nested bands: 5, 10, 15, 20 minutes, each a separate polygon. Maps symbolise them with a gradient for visual impact.
Mode and time
Parameters:
- Mode: walking, cycling, driving, public transit.
- Departure time: affects traffic-aware isochrones dramatically.
- Speed profile: free-flow vs historical vs real-time.
A 15-minute driving isochrone at 3 AM is much bigger than at 5 PM in most cities.
Tools
- Mapbox Isochrone API — managed, easy.
- Valhalla — open-source, self-hosted.
- OpenRouteService — open, global.
- OSRM + post-processing — build your own.
- pgRouting
pgr_drivingDistance+ concave hull.
Python:
1import requests
2url = 'https://api.openrouteservice.org/v2/isochrones/driving-car'
3r = requests.post(url, json={
4 'locations': [[-73.96, 40.78]],
5 'range': [300, 600, 900], # seconds: 5, 10, 15 min
6 'range_type': 'time'
7}, headers={'Authorization': API_KEY})
8iso = r.json() # GeoJSONUse cases
Accessibility / service planning
"What fraction of the population lives within a 15-minute walk of a park?" Combine isochrones with population rasters (WorldPop) or census blocks for quantitative estimates.
Site selection
"Where to place a new clinic so everyone is within 10 minutes?" Combine isochrones around candidate sites with existing facility gaps.
Logistics / delivery
"Which addresses can we serve in 30 minutes from each depot?" Critical for food delivery, emergency response, urgent courier.
Real estate
"Commute time to major employment centres" — isochrones from employment nodes overlaid on housing data.
Population within an isochrone
Classic follow-up question — how many people live inside? Area-weighted sum against a population raster or polygon layer:
1SELECT SUM(p.population * ST_Area(ST_Intersection(p.geom, i.geom)) / ST_Area(p.geom))
2FROM population_blocks p
3JOIN isochrone i ON ST_Intersects(p.geom, i.geom);Visualisation
Common styling:
- Gradient colour ramp for nested bands.
- 60–80% opacity so base map reads through.
- Explicit time labels on each band.
- Add the source point as a contrasting symbol.
Quality caveats
- Graph quality drives isochrone quality. Bad OSM data → bad isochrones.
- Terrain affects walking / cycling time — flat-land speeds don't apply in hills.
- Intermodal transfers — walking to transit adds complexity.
- Real-time traffic — not all APIs respect it.
Self-check exercises
1. Why is a 15-minute driving isochrone much smaller in New York than in rural Iowa?
NYC roads are slow (traffic, lights, congestion). Rural Iowa has fewer roads but faster speeds. A 15-minute window covers 4–8 km in Manhattan but 25 km or more in rural areas. Isochrones reflect real travel conditions, not just geometric distance — which is why they're more useful than circles.
2. What's the difference between a Euclidean buffer and an isochrone?
A Euclidean buffer is a circle — every point within X metres regardless of obstacles. An isochrone is the set of points reachable within a time budget on an actual network. Isochrones respect roads, one-ways, speed limits, and sometimes traffic. For real-world accessibility, isochrones are far more realistic — a 1 km buffer often spans time budgets from 5 to 15 minutes depending on terrain.
3. Your 20-minute walking isochrone looks disconnected — two islands of reachable area. What's happening?
Usually a graph gap: a bridge, pedestrian crossing, or path is missing from OSM data, splitting the network into disconnected components. Investigate the gap; add the missing edge or mark the data issue for contribution back to OSM. Isochrone engines expose nodes visited — compare to expected count.
Summary
- Isochrones = polygons of time-to-reach.
- Generated by outward graph traversal from a source.
- Mode, time-of-day, and graph quality all shape the result.
- Combine with population or demographic data for accessibility metrics.
Further reading
- Mapbox / OpenRouteService isochrone API documentation.
- Biba, S. et al. — GIS analysis of accessibility to primary care.
- Valhalla open-source routing project.
- Urban Access research at the LSE Cities observatory.