How do I get driving time from Google Maps API?
Asked Answered
A

2

4

I use the following function to estimate the time (in hours) to drive a certain distance, assuming an average speed of 65 km/h:

distHoras <- function(origin, destination){
  xml.url <- paste0('http://maps.googleapis.com/maps/api/distancematrix/xml?origins=',
                    origin, '&destinations=', destination, '&mode=driving&sensor=false')
  xmlfile <- xmlParse(getURL(xml.url))
  dist <- xmlValue(xmlChildren(xpathApply(xmlfile,"//distance")[[1]])$value)
  distance <- as.numeric(sub(" km", "", dist))
  time <- (distance / 1000) / 65
  return(time)
}

How can I tweak this function in order to have it yield time directly, so I don't need to make this 65 km/h assumption and thus get a better estimate? After reading the documentation, I tried switching 'distance' with 'duration', but it didn't work. I'm probably missing something simple, but I'm quite new to working with APIs and am overwhelmed by all that text. Appreciate any help!

Adkison answered 24/6, 2013 at 18:11 Comment(0)
C
5

Are you looking for this :

library(ggmap)
from <- 'Paris'
to <- 'London'
mapdist(from,to,mode='driving')
 from     to      m      km    miles seconds  minutes    hours
1 Paris London 454416 454.416 282.3741   18283 304.7167 5.078611

mapdist Compute map distances using Google Maps.

To answer your question, I think it is easier (even recommended) to use json version of google API than XML one.

Here a fast version using RJSONIO. Even I recommend you to use the function above. No need to do any conversion since the result is already in hours.

library(RJSONIO)
distHoras <- function(origin, destinations){

origin <- gsub(",", "", origin)
origin <- gsub(" ", "+", origin)
origin <- paste("origins=", origin, sep = "")

destinations <- gsub(",", "", destinations)
destinations <- gsub(" ", "+", destinations)
destinations <- paste("destinations=", paste(destinations, 
                                             collapse = "|"), sep = "")


mode4url <- paste("mode=", 'driving', sep = "")
lang4url <- paste("language=", 'en-EN', sep = "")
sensor4url <- paste("sensor=", tolower(as.character(FALSE)), 
                   sep = "")
posturl <- paste(origin, destinations, mode4url, sensor4url, 
                 sep = "&")
url_string <- paste("http://maps.googleapis.com/maps/api/distancematrix/json?", 
                    posturl, sep = "")
url_string <- URLencode(url_string)
connect <- url(url_string)
tree <- fromJSON(paste(readLines(connect), collapse = ""))
close(connect)
rapply(tree$rows,I)
}

Now you test it :

distHoras('Paris','London')
 elements.distance.text elements.distance.value  elements.duration.text 
               "454 km"                "454416"        "5 hours 5 mins" 
elements.duration.value         elements.status 
                "18283"                    "OK" 
Campanile answered 24/6, 2013 at 18:17 Comment(3)
Cool, I didn't know this function existed. Worked like a charm, thanks! Nonetheless, I'd still like to know how I could tweak the handcrafted function I've provided.Adkison
@wleoncio it is a good exercise to study mapdist code. You can see my edit for a small version.Campanile
Thanks for the tip, I'll sink my teeth into this soon.Adkison
S
0

I'm going to throw my own pacakge into the mix that also queries Google's API for you

(You need a valid Google API key to use it)

library(googleway)

api_key <- "your_api_key_here"

google_distance(origins = "Paris", 
                                destinations = "London",
                                key = api_key)

# $destination_addresses
# [1] "London, UK"
# 
# $origin_addresses
# [1] "Paris, France"
# 
# $rows
# elements
# 1 456 km, 456230, 5 hours 31 mins, 19858, 6 hours 12 mins, 22311, OK
# 
# $status
# [1] "OK"
Shanika answered 6/2, 2017 at 3:24 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.