Routing directions between locations, travel distance or time origin-destination matrices and isolines for points of interest (POIs) based on the ‘HERE Routing’, ‘HERE Matrix Routing’ and ‘HERE Isoline Routing’ APIs.
In order to calculate route geometries (LINESTRING
)
between pairs of points using the ‘HERE Routing API’ the function
route()
is used. The function takes origin and destination
locations as sf
objects containing geometries of type
POINT
as input. Routes can be created for various transport
modes, as for example car or public transport. Optionally the current or
predicted traffic information is considered. For routes using the
transport mode "car"
a vehicle type can be specified, to
obtain an estimate of the energy consumption on the routes.
origin <- poi[1:2, ]
destination <- poi[3:4, ]
routes <- route(
origin = origin,
destination = destination
)
id | rank | section | departure | arrival | type | mode | distance | duration | duration_base | consumption | tolls |
---|---|---|---|---|---|---|---|---|---|---|---|
1 | 1 | 1 | 2023-09-18 12:45:53 | 2023-09-18 14:56:16 | vehicle | car | 211768 | 7823 | 7362 | 85.9268 | 44.6 |
2 | 1 | 1 | 2023-09-18 12:45:53 | 2023-09-18 15:52:27 | vehicle | car | 266757 | 11194 | 9870 | 105.5051 | 44.6 |
Construct a route label and print the routes on an interactive leaflet map:
routes$label <- paste(origin$city[routes$id],
destination$city[routes$id],
sep = " - "
)
if (requireNamespace("mapview", quietly = TRUE)) {
mapview::mapview(routes,
zcol = "label",
layer.name = "Route [O-D]",
map.types = c("Esri.WorldTopoMap"),
homebutton = FALSE
)
}
The function route_matrix()
calculates a matrix of route
summaries between given POIs. The function takes origin and destination
locations as sf
objects containing geometries of type
POINT
as input. If only one sf
object is
provided as origin
an origin-destination matrix, which
covers all route combinations, is constructed. Various transport modes
and current or predicted traffic information are supported. The
requested matrix is split into (sub-)matrices of dimension 15x100 in
order to use the maximum allowed matrix size per request. Thereby the
number of overall needed requests is minimized. The return value of the
function route_matrix
is one route summary matrix, that
fits the order of the provided POIs: orig_id
,
dest_id
.
# From - to
mat <- route_matrix(
origin = poi[1:2, ],
destination = poi[3:4, ]
)
# Construct O-D matrix (all routes between the POIs)
mat <- route_matrix(
origin = poi
)
Print the first 10 rows of the matrix table, created from the POIs above, where the distance is in meters, the travel time in seconds and the consumption in cost factor units:
orig_id | dest_id | request_id | departure | arrival | type | mode | distance | duration | error_code |
---|---|---|---|---|---|---|---|---|---|
1 | 1 | 1 | 2023-09-18 12:45:54 | 2023-09-18 12:45:54 | fast | car | 0 | 0 | 0 |
1 | 2 | 1 | 2023-09-18 12:45:54 | 2023-09-18 14:50:52 | fast | car | 176027 | 7498 | 0 |
1 | 3 | 1 | 2023-09-18 12:45:54 | 2023-09-18 14:56:25 | fast | car | 211777 | 7831 | 0 |
1 | 4 | 1 | 2023-09-18 12:45:54 | 2023-09-18 14:00:18 | fast | car | 100379 | 4464 | 0 |
1 | 5 | 1 | 2023-09-18 12:45:54 | 2023-09-18 14:11:52 | fast | car | 117575 | 5158 | 0 |
1 | 6 | 1 | 2023-09-18 12:45:54 | 2023-09-18 13:33:27 | fast | car | 54382 | 2853 | 0 |
1 | 7 | 1 | 2023-09-18 12:45:54 | 2023-09-18 15:32:26 | fast | car | 266763 | 9992 | 0 |
1 | 8 | 1 | 2023-09-18 12:45:54 | 2023-09-18 14:14:43 | fast | car | 132803 | 5329 | 0 |
2 | 1 | 1 | 2023-09-18 12:45:54 | 2023-09-18 14:55:38 | fast | car | 171881 | 7784 | 0 |
2 | 2 | 1 | 2023-09-18 12:45:54 | 2023-09-18 12:45:54 | fast | car | 0 | 0 | 0 |
Isolines are constructed by the function isoline()
. The
calculated polygons (POLYGON
or MULTIPOLYGON
)
connect the end points of all routes leaving from defined centers (POIs)
with either a specified length (isodistance), a specified travel time
(isochrone) or consumption (isoconsumption), whereby time is measured in
seconds, distance in meters and consumption. By default the
aggregate
parameter is set to TRUE
, which
means that the isoline polygons are intersected and the minimum range
value (time, distance or consumption) is taken in all intersecting
areas, then the polygons are aggregated to polygons of geometry type
MULTIPOLYGON
. Thereby overlapping isolines are avoided.
iso <- isoline(
poi,
range = seq(5, 30, 5) * 60,
range_type = "time",
routing_mode = "fast",
transport_mode = "car",
aggregate = TRUE,
traffic = FALSE
)
Convert range from seconds to minutes and print the aggregated isolines on an interactive leaflet map:
iso$minutes <- iso$range / 60
if (requireNamespace("mapview", quietly = TRUE)) {
mapview::mapview(iso,
zcol = "minutes",
layer.name = "Isoline [min]",
alpha = 0,
map.types = c("Esri.WorldTopoMap"),
homebutton = FALSE
)
}