Planetary-scale answers, unlocked.
A Hands-On Guide for Working with Large-Scale Spatial Data. Learn more.
Authors
An isochrone is a line of equal travel time. On a map, it outlines everywhere you can reach from one place in a set time, such as 10 minutes by car.
A circle drawn around the same place ignores roads, so it gets drive-time reach wrong. It is most wrong where water or a sparse road network blocks the way. We compared the two around 129 fire stations in King County, Washington. For the median station, a circle the same size as its 10-minute drive-time area covered 78% of that area. On Vashon Island, it covered 27%.
The OpenStreetMap Wiki entry on isochrones defines an isochrone as an isoline for travel time: a curve of equal travel time. An isoline is a line that joins points with the same value. For example, contour lines join points of equal elevation, and isotherms join points of equal temperature.
The same wiki entry says isochrones follow transport routes, such as roads, transit lines or footpaths. A buffer around a point ignores those routes. A buffer is the "as the crow flies" circle: every point within a set straight-line distance.
Wherobots documents an isochrone as "a polygon that represents the area that can be reached within a given time from the input geometry" in its ST_Isochrone reference. Travel isochrones are usually computed for several time limits at once, such as 5, 10, 15 and 20 minutes. Each longer limit contains the shorter ones. Isochrone maps therefore draw them as nested bands.
People use isochrone maps to answer questions about travel, such as these:
A straight-line radius answers a different question: what lies within a set distance, whatever the route.
The network as a graph. A graph is a set of points joined by links. Intersections become the points, called nodes, and road segments become the links, called edges. Each edge has a travel time: its length divided by the speed allowed or expected on it. A one-way street becomes an edge that points one way only.
A shortest-path search. A shortest-path search finds the fastest route from the origin to each node. Edsger Dijkstra's A note on two problems in connexion with graphs (Numerische Mathematik, 1959) gives the standard method.
Dijkstra's search starts at the origin. It settles nodes in order of travel time from the origin. Settling a node fixes its fastest travel time. The search stops when the next node lies beyond the time limit. The OpenStreetMap Wiki calls the result a shortest path tree: a set of points, each with its travel time from the origin.
A polygon around the result. The same wiki lists ways to turn those points into an area:
The wiki recommends interpolating along edges that the time limit cuts. Interpolating means estimating where along the road the time runs out. The boundary then falls partway along that road.
Speed-up techniques. Running Dijkstra's search over a large network for every origin is slow. Geisberger, Sanders, Schultes and Delling introduced contraction hierarchies (Lecture Notes in Computer Science, 2008).
Contraction hierarchies run a preparation step once. This step ranks nodes by importance and adds shortcut edges. Each later search then settles fewer nodes.
Baum, Buchhold, Dibbelt and Wagner's Fast Computation of Isochrones in Road Networks (arXiv preprint, 2015) states the isochrone problem formally. It starts from a baseline method built on Dijkstra's search. It then adapts multilevel speed-up techniques to the problem. These techniques split the network into nested cells and precompute travel times across each cell.
Gamper, Böhlen and Innerebner describe a method in Scalable Computation of Isochrones with Network Expiration (Lecture Notes in Computer Science, 2012). Their method loads only the part of the network the search needs. It drops nodes from memory once the search has passed them.
Inbound and outbound. An outbound isochrone covers everywhere you can reach from an origin. An inbound isochrone covers everywhere from which you can reach a destination. The inbound question matters for a hospital or a warehouse.
The inbound search runs over the edges in reverse. One-way streets and turn limits can make the two areas differ. In Wherobots, the inbound argument sets the direction: true means the input point is a destination.
inbound
Multimodal and transit isochrones. A multimodal isochrone combines more than one travel mode. A transit isochrone combines walking with buses and trains that run to a timetable. Its edges have departure times, so the area changes with the time of day. Bauer, Gamper, Loperfido and Profanter described Computing isochrones in multi-modal, schedule-based transport networks at ACM (Association for Computing Machinery) SIGSPATIAL, a conference on spatial data, in 2008.
OSRM (Open Source Routing Machine) is a routing engine written in C++. It finds shortest paths in road networks built from OpenStreetMap data. It has car, bicycle and walking profiles. The OpenStreetMap Wiki lists isochrone tools including the Valhalla isochrone service, GraphHopper and pgRouting.
The OpenStreetMap Wiki defines an isodistance as a curve of equal travel distance. It is the close relative of the isochrone.
A radius is the cheapest shape to compute. It is also the easiest to state in a rule, such as "within 5 miles".
A radius goes wrong where travel does not follow a straight line. A river, a bay or a ridge puts places inside the circle that take far longer to reach. A fast road puts places outside the circle that you can reach sooner. The Wherobots test below measures how often that happens.
Galton's passage chart. Francis Galton published On the Construction of Isochronic Passage-Charts in the Proceedings of the Royal Geographical Society and Monthly Record of Geography in 1881. His chart is the first isochrone map. It shows travel time from London to places around the world.
Accessibility by public transport. Walter Hansen's How Accessibility Shapes Land Use (Journal of the American Institute of Planners, 1959) tied land use to accessibility. Accessibility is a measure of how easily people can reach places. O'Sullivan, Morrison and Shearer measured it with isochrones in GIS (geographic information system) software, the desktop software used to make and analyze maps. Their paper is Using desktop GIS for the investigation of accessibility by public transport: an isochrone approach (International Journal of Geographical Information Science, 2000).
Retail trade areas. A trade area is the zone a store draws its customers from. A Wherobots retail cannibalization study of two Texas taco chains looked at stores of one chain taking customers from each other. The study computed 5-minute drive-time areas for every Torchy's Tacos and Velvet Taco location with the open-source Valhalla isochrone API.
The study then converted the areas to H3 cells, a global grid of hexagons. Next, it summed the population of the cells that more than one store could reach. Our guide to points of interest covers the records of stores and places that such studies start from.
Emergency response coverage. Emergency medical and rescue calls made up 65.1% of US fire department responses in 2024, according to the US Fire Administration's statistics page. A drive-time isochrone around each station shows the area a crew can reach in a set time.
The Wherobots tutorial Making drive time isochrones computes 30-minute isochrones for fire stations in California between Bakersfield and Merced. It then lists the places outside every station's isochrone. Finally, it groups those places into clusters with DBSCAN (density-based spatial clustering of applications with noise). This method groups points that are packed closely together.
Site selection. A site screen ranks candidate land by travel to customers, staff or suppliers. Our article on data center site selection describes a screen built from distances to power, fiber and users. Where a test is about travel, an isochrone replaces the distance. The Wherobots post on location intelligence with isochrones runs a nationwide example of choosing fire station sites with 30-minute isochrones.
WherobotsDB has two isochrone functions. ST_Isochrone(geometry, time_limit, 'car', inbound) returns one polygon for one time limit in minutes. ST_Isochrones(geometry, array(...), 'car', inbound) returns one polygon per limit in a single call.
ST_Isochrone(geometry, time_limit, 'car', inbound)
ST_Isochrones(geometry, array(...), 'car', inbound)
The Wherobots documentation recommends ST_Isochrones for several limits from the same origin, because repeated ST_Isochrone calls repeat the search. Car is the only travel mode. Both functions are limited to paid organizations: the Professional, Innovation and Enterprise editions.
Wherobots also publishes Overture places with isochrones in the Havasu catalog, Wherobots' catalog of ready-to-query datasets. Overture Maps is an open map dataset that includes places such as shops and fire stations.
The Wherobots post on location intelligence with isochrones describes 5, 10, 15 and 20 minute car isochrones for 13.3 million US places, computed outbound. The table is wherobots_pro_data.overture_maps_foundation.overture_places_with_isochrones. It keeps the columns of the Overture places table and adds four more, isochrone_5min to isochrone_20min. The test below uses this table.
wherobots_pro_data.overture_maps_foundation.overture_places_with_isochrones
isochrone_5min
isochrone_20min
King County, Washington, includes Seattle and two islands: Vashon in Puget Sound and Mercer Island in Lake Washington. It also includes sparsely built land to the east. Fire stations make good origins because their coverage is a question of drive time.
The stations are the places whose Overture primary category is fire_department and that lie inside the King County land polygon. Overture lists the categories in its place categories reference. All 130 stations have a 10-minute isochrone. One isochrone is an empty polygon, so 129 stations remain.
fire_department
The method compares each isochrone with a circle of the same area around the same station. The radius is the square root of the isochrone's area divided by π. Overlap is the area the two shapes share, divided by the isochrone's area. The two areas are equal, so overlap is also the share of the circle inside the isochrone. An overlap of 1 means the circle and the isochrone match.
ST_AreaSpheroid measures area in square meters on a model of Earth's shape called WGS 84 (World Geodetic System 1984), with no map projection. WGS 84 is the model that GPS (Global Positioning System) uses: a slightly flattened sphere called an ellipsoid. A map projection flattens that curved surface onto a plane and distorts area in the process. Our articles on the coordinate reference system and map projections explain why that matters.
ST_AreaSpheroid
ST_Buffer with its third argument set to true draws the circle on the ellipsoid in meters.
ST_Buffer
WITH county AS ( SELECT geometry AS g FROM wherobots_open_data.overture_maps_foundation.divisions_division_area WHERE country = 'US' AND region = 'US-WA' AND subtype = 'county' AND names.primary = 'King County' AND class = 'land' ), st AS ( SELECT p.id, p.names.primary AS name, p.geometry AS pt, p.isochrone_10min AS iso FROM wherobots_pro_data.overture_maps_foundation.overture_places_with_isochrones p, county WHERE p.categories.primary = 'fire_department' AND p.bbox.xmin > -122.6 AND p.bbox.xmax < -120.9 AND p.bbox.ymin > 47.0 AND p.bbox.ymax < 47.8 AND ST_Intersects(county.g, p.geometry) AND NOT ST_IsEmpty(p.isochrone_10min) ), m AS (SELECT id, name, pt, iso, ST_AreaSpheroid(iso) AS iso_m2 FROM st), c AS (SELECT *, ST_Buffer(pt, SQRT(iso_m2 / PI()), true) AS circle FROM m), o AS (SELECT *, ST_AreaSpheroid(ST_Intersection(iso, circle)) AS inter_m2, ST_AreaSpheroid(circle) AS circ_m2 FROM c) SELECT COUNT(*) AS n, ROUND(PERCENTILE_APPROX(iso_m2 / 1e6, 0.5), 1) AS median_iso_km2, ROUND(MIN(iso_m2) / 1e6, 1) AS min_iso_km2, ROUND(MAX(iso_m2) / 1e6, 1) AS max_iso_km2, ROUND(PERCENTILE_APPROX(inter_m2 / iso_m2, 0.5), 3) AS median_overlap, ROUND(MIN(inter_m2 / iso_m2), 3) AS min_overlap, ROUND(MAX(inter_m2 / iso_m2), 3) AS max_overlap, ROUND(AVG(circ_m2 / iso_m2), 4) AS circle_area_check, ROUND(PERCENTILE_APPROX(SQRT(iso_m2 / PI()) / 1e3, 0.5), 2) AS median_radius_km, SUM(CASE WHEN ST_Contains(iso, pt) THEN 1 ELSE 0 END) AS iso_contains_station FROM o
The bbox filter uses each place's bounding box, the smallest rectangle around it. It skips places outside the county's rough extent before the slower test of whether each point lies inside the county polygon. The query ran in 7.8 seconds.
bbox
All 129 isochrones contain their station. The circle is drawn as a polygon with straight sides, so its area is close to a true circle's but not equal. On average its area is 0.57% smaller than the isochrone's (circle_area_check 0.9943).
circle_area_check
The same query, run once per station, adds each circle's land share. Land share is the share of the circle's area that lies on land. For this run, a wa view holds the Overture Washington State land polygon.
wa
At Vashon Island Fire and Rescue Station 59, 70.7% of the circle lies on open water. The circle shares 0.272 (27%) of its area with the drive-time area. Shoreline Fire Department Station 51 sits at the other end, at 0.915 (92%). Seattle Fire Stations 41 and 32 sit near Puget Sound. Their land shares are 0.439 and 0.525.
Mercer Island and Skykomish break the pattern. Overture's Washington land polygon leaves out Puget Sound but counts Lake Washington as land. Therefore Mercer Island's circle has a land share of 1.0. The cause of its overlap of 0.387 is something land share cannot measure.
Skykomish, in the east of the county, has the smallest isochrone, at 31.0 km². The figure below shows it as a narrow east-west band. Its overlap is 0.403.
This query adds the Washington land polygon and splits the stations by land share. A circle with a land share of 0.95 or more counts as on land. The rest have more than 5% of their area on open water.
WITH county AS ( SELECT geometry AS g FROM wherobots_open_data.overture_maps_foundation.divisions_division_area WHERE country = 'US' AND region = 'US-WA' AND subtype = 'county' AND names.primary = 'King County' AND class = 'land' ), wa AS ( SELECT geometry AS g FROM wherobots_open_data.overture_maps_foundation.divisions_division_area WHERE country = 'US' AND region = 'US-WA' AND subtype = 'region' AND class = 'land' ), st AS ( SELECT p.id, p.geometry AS pt, p.isochrone_10min AS iso FROM wherobots_pro_data.overture_maps_foundation.overture_places_with_isochrones p, county WHERE p.categories.primary = 'fire_department' AND p.bbox.xmin > -122.6 AND p.bbox.xmax < -120.9 AND p.bbox.ymin > 47.0 AND p.bbox.ymax < 47.8 AND ST_Intersects(county.g, p.geometry) AND NOT ST_IsEmpty(p.isochrone_10min) ), m AS (SELECT id, pt, iso, ST_AreaSpheroid(iso) AS iso_m2 FROM st), c AS (SELECT *, ST_Buffer(pt, SQRT(iso_m2 / PI()), true) AS circle FROM m), o AS ( SELECT ST_AreaSpheroid(ST_Intersection(iso, circle)) / iso_m2 AS overlap, ST_AreaSpheroid(ST_Intersection(circle, wa.g)) / ST_AreaSpheroid(circle) AS land_share, iso_m2 FROM c, wa ) SELECT CASE WHEN land_share < 0.95 THEN 'circle over 5%+ open water' ELSE 'circle on land' END AS setting, COUNT(*) AS stations, ROUND(PERCENTILE_APPROX(overlap, 0.5), 3) AS median_overlap, ROUND(MIN(overlap), 3) AS min_overlap, ROUND(PERCENTILE_APPROX(iso_m2 / 1e6, 0.5), 1) AS median_iso_km2, ROUND(CORR(overlap, land_share), 3) AS corr_overlap_land_share FROM o GROUP BY 1 UNION ALL SELECT 'all', COUNT(*), ROUND(PERCENTILE_APPROX(overlap, 0.5), 3), ROUND(MIN(overlap), 3), ROUND(PERCENTILE_APPROX(iso_m2 / 1e6, 0.5), 1), ROUND(CORR(overlap, land_share), 3) FROM o
The query ran in 137.6 seconds. The last column is the correlation between overlap and land share inside each group. Correlation measures how closely two numbers rise and fall together. A value of 1 means overlap rises in step with land share.
Among circles that reach open water, overlap tracks land share closely, with a correlation of 0.935. Among circles on land, land share is close to 1 for every station, and the correlation is 0.018.
The last query counts the buildings each method places within 10 minutes of a station. It merges the 129 isochrones into one shape and the 129 circles into another. It then tests the center point of each building in the Overture buildings dataset against both shapes.
WITH county AS ( SELECT geometry AS g FROM wherobots_open_data.overture_maps_foundation.divisions_division_area WHERE country = 'US' AND region = 'US-WA' AND subtype = 'county' AND names.primary = 'King County' AND class = 'land' ), st AS ( SELECT p.geometry AS pt, p.isochrone_10min AS iso FROM wherobots_pro_data.overture_maps_foundation.overture_places_with_isochrones p, county WHERE p.categories.primary = 'fire_department' AND p.bbox.xmin > -122.6 AND p.bbox.xmax < -120.9 AND p.bbox.ymin > 47.0 AND p.bbox.ymax < 47.8 AND ST_Intersects(county.g, p.geometry) AND NOT ST_IsEmpty(p.isochrone_10min) ), u AS ( SELECT ST_Union_Aggr(iso) AS iso_u, ST_Union_Aggr(ST_Buffer(pt, SQRT(ST_AreaSpheroid(iso) / PI()), true)) AS circle_u FROM st ), b AS ( SELECT ST_Centroid(geometry) AS c FROM wherobots_open_data.overture_maps_foundation.buildings_building WHERE bbox.xmin > -122.8 AND bbox.xmax < -120.7 AND bbox.ymin > 46.9 AND bbox.ymax < 47.95 ), t AS ( SELECT /*+ BROADCAST(u) */ ST_Intersects(u.iso_u, b.c) AS in_iso, ST_Intersects(u.circle_u, b.c) AS in_circle FROM b CROSS JOIN u ) SELECT SUM(CASE WHEN in_iso OR in_circle THEN 1 ELSE 0 END) AS in_either, SUM(CASE WHEN in_iso THEN 1 ELSE 0 END) AS within_any_isochrone, SUM(CASE WHEN in_circle THEN 1 ELSE 0 END) AS within_any_circle, SUM(CASE WHEN in_iso AND NOT in_circle THEN 1 ELSE 0 END) AS isochrone_only, SUM(CASE WHEN in_circle AND NOT in_iso THEN 1 ELSE 0 END) AS circle_only, ROUND((SELECT ST_AreaSpheroid(iso_u) FROM u) / 1e6, 1) AS iso_union_km2, ROUND((SELECT ST_AreaSpheroid(circle_u) FROM u) / 1e6, 1) AS circle_union_km2 FROM t
The query ran in 74 seconds.
The merged circles cover 3,204.9 km². The merged isochrones cover 2,800.2 km². The two methods disagree on 37,259 of the 985,151 buildings in either area. Isochrones reach 26,272 buildings that no circle covers. Circles cover 10,987 buildings that no isochrone reaches.
The results support the water half of the claim. No circle matched its drive-time area. The highest overlap was 0.915. The lowest overlaps came where circles crossed open water.
The "sparse roads" half rests on one case, Skykomish at 0.403. Mercer Island, at 0.387, sits in a lake that the land polygon counts as land. The test did not measure road density, so the causes of low overlap on land remain open.
Across the county, the two methods disagree on 37,259 of 985,151 buildings.
Galton's 1881 chart is the first isochrone map. Dijkstra's search and Hansen's accessibility paper both date from 1959. Later work took its method from Dijkstra and its purpose from Hansen.
From 2000, isochrones moved into GIS software and spatial databases. O'Sullivan and colleagues built public transport isochrones in desktop GIS software. Bauer and colleagues added timetables and changes between travel modes.
Marciuska and Gamper's Determining Objects within Isochrones in Spatial Network Databases (Lecture Notes in Computer Science, 2010) asked which stored objects lie inside an isochrone. Innerebner, Böhlen and Gamper described a web system for isochrones on networks with several travel modes. Their paper is ISOGA: A System for Geographical Reachability Analysis (Lecture Notes in Computer Science, 2013). The speed-up work of 2008 to 2015, described above, cut the cost of each search.
At large scale, the number of origins grows. An isochrone for every place in a country is a table of millions of polygons. Each later question about them is a spatial join, which matches rows by location. Examples include these questions:
Jia Yu, Jinxuan Wu and Mohamed Sarwat introduced GeoSpark (ACM SIGSPATIAL, 2015) to run such joins on Apache Spark. Apache Spark is a system that splits data processing across many machines. Yu, Zongsi Zhang and Sarwat described how GeoSpark divides data across machines and runs joins in Spatial data management in Apache Spark: the GeoSpark perspective and beyond (GeoInformatica, 2018). GeoSpark became Apache Sedona, the engine WherobotsDB is built on.
The King County queries above are joins of this kind, on 129 stations. Their results are inputs to the rest of a geospatial analysis, such as clustering the places no station reaches.
Compute isochrones and join them to buildings and places with Wherobots at cloud.wherobots.com.
An isochrone is a line of equal travel time. On a map, it is drawn as the area you can reach from a place in a set time with one travel mode, such as 10 minutes by car. It follows the road or transit network. So its shape bends around water, hills and gaps in the roads.
Pick an origin, a travel mode, one or more time limits and a direction: from the place or to it. Compute the area you can reach on a road network. Use a routing engine, an isochrone API or a SQL function such as ST_Isochrones in Wherobots. Then draw each time limit as its own polygon, with the shortest time on top.
Isochrone means a line of equal time. Several fields use the word for their own curves of equal time. Soil mechanics, geology and hydrology each have isochrones that describe a quantity at one moment. On this page, isochrone has its travel-time meaning, as used in maps and location analysis.
An isochrone joins places with equal travel time. An isodistance joins places with equal travel distance along the network. Take a road network with fast and slow roads. A 10 km isodistance and a 10-minute isochrone from the same point have different shapes, because fast roads stretch the isochrone further.
For any question about travel, yes. We looked at 129 fire stations in King County, Washington. For each one, we drew a circle with the same area as its 10-minute drive-time area. The median circle shared 0.781 (78%) of that area. At Vashon Island Fire and Rescue Station 59, most of the circle lies over water, and it shared 0.272 (27%).
An inbound isochrone is the area from which you can reach a destination within the time limit. An outbound isochrone is the area you can reach from an origin. In Wherobots, the fourth argument of ST_Isochrone is true for inbound and false for outbound.
The road network is stored as a graph. Intersections are nodes. Road segments are edges, each with a travel time. A shortest-path search, such as Dijkstra’s algorithm, works outward from the origin and stops at the time limit. A polygon is then drawn around the roads or points the search reached.
A transit isochrone shows the area you can reach by public transport and walking within a set time. It depends on timetables. So the same stop gives a different area at 8 am than at midnight. Bauer and colleagues described in 2008 how to compute isochrones on networks that combine walking with timetabled transit.
An isochrone API is a web service or function. It takes a location, a travel mode and a time limit. It returns the area you can reach as a polygon. Wherobots provides ST_Isochrone and ST_Isochrones as SQL functions that run on every row of a table, for car travel.
Francis Galton published an isochronic passage chart in 1881 in the Proceedings of the Royal Geographical Society. It showed the travel time from London to places around the world.
What is Spatial Intelligence? Definition, AI, Earth Scale
Spatial intelligence: AI that understands 3D space. Open map data holds a height for 96% of San Francisco's buildings and 0.13% of Nairobi's.
What Is PySpark? Definition, Tutorial, and Spatial Data
PySpark is the Python API for Apache Spark. Learn how it runs, with a short tutorial. Then see a spatial join that took 6 minutes without Apache Sedona's join planning and under a second with it.
What is a Semantic Layer? Definition, Examples, Spatial Rules
A semantic layer defines business terms and metrics once, so every tool gives the same answer. For location data it must also set the boundary, the distance and what counts as inside.
share this article
Awesome that you’d like to share our articles. Where would you like to share it to: