Waldir Leoncio Waldir Leoncio - 4 years ago 136
R Question

How do I get driving time from Google Maps API?

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!

Answer Source

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" 
Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download