Как получить время в пути из Google Maps API?

Я использую следующую функцию, чтобы оценить время (в часах), чтобы проехать определенное расстояние, при средней скорости 65 км/ч:

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)
}

Как я могу настроить эту функцию, чтобы она напрямую выдавала время, чтобы мне не нужно было делать предположение о 65 км/ч и, таким образом, получать более точную оценку? Прочитав документацию, я попытался переключить "расстояние" на "длительность", но это не работал. Я, вероятно, упускаю что-то простое, но я новичок в работе с API, и весь этот текст перегружен мной. Ценим любую помощь!


person Waldir Leoncio    schedule 24.06.2013    source источник


Ответы (2)


Вы ищете это:

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 Вычисляйте расстояния на карте с помощью Карт Google.

Чтобы ответить на ваш вопрос, я думаю, что проще (даже рекомендуется) использовать json-версию API Google, чем XML.

Вот быстрая версия с использованием RJSONIO. Даже я рекомендую вам использовать функцию выше. Нет необходимости делать какие-либо преобразования, так как результат уже в часах.

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)
}

Теперь вы тестируете его:

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" 
person agstudy    schedule 24.06.2013
comment
Круто, я не знал, что есть такая функция. Сработало как шарм, спасибо! Тем не менее, я все еще хотел бы знать, как я могу настроить функцию ручной работы, которую я предоставил. - person Waldir Leoncio; 24.06.2013
comment
@wleoncio это хорошее упражнение для изучения кода mapdist. Вы можете увидеть мою правку для маленькой версии. - person agstudy; 24.06.2013
comment
Спасибо за подсказку, скоро в нее вгрызаюсь. - person Waldir Leoncio; 24.06.2013

Я собираюсь добавить свой собственный пакет в смесь, которая также запрашивает API Google для вас.

(Для его использования необходим действующий ключ Google API)

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"
person SymbolixAU    schedule 06.02.2017