Search code examples
rroutesggmaptravel-time

Driving Distance with Multiple Routes


I'm trying to use the ggmap package with the route() function to obtain driving distance and time from a tibble consisting of multiple pairs of coordinates.

Data:

locations <- tibble(start_loc = c("44.025135, -69.892204", "44.0175617, -70.0108097"), end_loc = "43.9195136, -69.9665309")

What I would like to end up with is the locations tibble appended with two more columns, a total travel time and total distance. For this I probably need to loop through each row in locations, passing each pair of coordinates through the route() function. The trouble is that the output from route() produces a row for each step in the route.

What I have so far:

library(ggmap)
library(dplyr)

locations

# A tibble: 2 x 2
#  start_loc               end_loc                
# <chr>                   <chr>                  
#1 44.025135, -69.892204   43.9195136, -69.9665309
#2 44.0175617, -70.0108097 43.9195136, -69.9665309

for(i in 1:nrow(locations)) {
  route_output <- route(from = locations$start_loc[i], to = locations$end_loc[i], 
                        mode = c("driving"), output = c("simple"), units ="mi", structure = "legs")
}

route_output
# A tibble: 6 x 11
#      m    km  miles seconds minutes   hours start_lon start_lat end_lon end_lat route
#  <int> <dbl>  <dbl>   <int>   <dbl>   <dbl>     <dbl>     <dbl>   <dbl>   <dbl> <chr>
#1  2608 2.61  1.62       184   3.07  0.0511      -70.0      44.0   -70.0    44.0 A    
#2   524 0.524 0.326       32   0.533 0.00889     -70.0      44.0   -70.0    44.0 A    
#3  3106 3.11  1.93       232   3.87  0.0644      -70.0      44.0   -70.1    44.0 A    
#4  9516 9.52  5.91       528   8.8   0.147       -70.1      44.0   -70.0    43.9 A    
#5    88 0.088 0.0547       9   0.15  0.0025      -70.0      43.9   -70.0    43.9 A    
#6  1960 1.96  1.22       166   2.77  0.0461      -70.0      43.9   -70.0    43.9 A 

What this is showing is each step of the route for only the last start_loc end_loc pair. So it's not looping as I would like and I don't get summary info. I don't even have a way to tack the route_output tibble back onto the `locations tibble. In short, I'm really jammed up.

Advice on what to do? If the ggmap package is not good for this, what else should I use?


Solution

  • Try something like:

    library(ggmap)
    
    locations <- data.frame(start_loc = c("44.025135, -69.892204", "44.0175617, -70.0108097"), end_loc = "43.9195136, -69.9665309")
    
    trip_dist_time <- function(from, to, mode) {
        
        results <- ggmap::route(from, to, mode)
        
        data.frame(time_minutes = sum(results$minutes),
                   distance_km = sum(results$km),
                   mode = mode)
    }
    
    # Select a travel mode from "driving", "walking", "bicycling", "transit"
    travel_mode <- "driving"
    
    results <- mapply(trip_dist_time, locations$start_loc, locations$end_loc, travel_mode, SIMPLIFY = FALSE)
    results <- Reduce(rbind, results)
    results <- cbind(locations, results)
    results
    

    You'll get:

                    start_loc                 end_loc time_minutes distance_km    mode
    1   44.025135, -69.892204 43.9195136, -69.9665309        15.95      16.476 driving
    2 44.0175617, -70.0108097 43.9195136, -69.9665309        19.40      17.802 driving