An isochrone shows all areas reachable from a place within a maximum
travel time. This vignette uses the r5r
package and the Porto Alegre (Brazil) sample data included in it to
calculate and map public transport isochrones from the city’s central
bus station at several travel time thresholds.
r5r::isochrone() builds both polygon- and line-based
isochrones; we cover both.
Warning: to count opportunities (e.g. jobs,
schools or hospitals) within each isochrone, we strongly recommend NOT
using isochrone(). The Accessibility
vignette shows much more efficient ways.
build_network()Set Java memory before loading the packages (why).
build_network() takes the directory holding the
OpenStreetMap and GTFS data:
Polygon-based isochrones are the most common: set
polygon_output = TRUE. The polygons are built on a regular
grid of Web
Mercator pixels whose resolution is set by zoom. Higher
zooms give more detailed isochrones but take longer, and may fail with
an error in large networks. The default, 10, uses cells of 153 m at the
Equator.
Below, isochrones use the median travel time of departures every minute over a 60-minute window (2pm to 3pm).
# read all points in the city
points <- fread(file.path(data_path, "poa_hexgrid.csv"))
# subset point with the geolocation of the central bus station
central_bus_stn <- points[291,]
# isochrone intervals
time_intervals <- seq(0, 100, 10)
# routing inputs
mode <- c("WALK", "TRANSIT")
max_walk_time <- 30 # in minutes
time_window <- 60 # in minutes
departure_datetime <- as.POSIXct("13-05-2019 14:00:00",
format = "%d-%m-%Y %H:%M:%S")
# calculate travel time matrix
iso1 <- r5r::isochrone(
r5r_network,
origins = central_bus_stn,
mode = mode,
polygon_output = TRUE,
cutoffs = time_intervals,
departure_datetime = departure_datetime,
max_walk_time = max_walk_time,
time_window = time_window,
progress = FALSE,
zoom = 10
)isochrone() works like
travel_time_matrix(), but with
polygon_output = TRUE it returns an sf
data.frame with one POLYGON/MULTIPOLYGON per
origin, cutoff and percentile:
Mapping the isochrones:
# extract OSM network
street_net <- street_network_to_sf(r5r_network)
main_roads <- subset(street_net$edges, street_class %like% 'PRIMARY|SECONDARY')
colors <- c('#ffe0a5','#ffcb69','#ffa600','#ff7c43','#f95d6a',
'#d45087','#a05195','#665191','#2f4b7c','#003f5c')
ggplot() +
geom_sf(data = iso1, aes(fill=factor(isochrone)), color = NA, alpha = .7) +
geom_sf(data = main_roads, color = "gray55", size=0.01, alpha = 0.2) +
geom_point(data = central_bus_stn, aes(x=lon, y=lat, color='Central bus\nstation')) +
scale_fill_manual(values = rev(colors) ) +
scale_color_manual(values=c('Central bus\nstation'='black')) +
labs(fill = "Travel time\n(in minutes)", color='') +
theme_minimal() +
theme(axis.title = element_blank())For line-based isochrones, set polygon_output = FALSE
(no zoom needed). The output is a LINESTRING
sf data.frame.
# calculate travel time matrix
iso2 <- r5r::isochrone(
r5r_network,
origins = central_bus_stn,
mode = mode,
polygon_output = FALSE,
cutoffs = time_intervals,
departure_datetime = departure_datetime,
max_walk_time = max_walk_time,
time_window = time_window,
progress = FALSE
)
head(iso2)Mapping the isochrones:
ggplot() +
geom_sf(data = iso2, aes(color=factor(isochrone)), alpha = .7) +
scale_color_manual(values = rev(colors) ) +
geom_point(data = central_bus_stn, aes(x=lon, y=lat), color='black') +
labs(color = "Travel time\n(in minutes)") +
theme_minimal() +
theme(axis.title = element_blank())Stop the network and run Java’s garbage collector to free the memory it used:
If you have any suggestions or want to report an error, please visit the package GitHub page.