2013-06-24 1 views
3

я использую следующую функцию для оценки времени (в часах) для приведения в действие определенное расстояние, при средней скорости 65 км/ч:Как мне получить время вождения от API Карт Google?

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 км/ч и, следовательно, получить более точную оценку? Прочитав the documentation, я попытался переключить «расстояние» на «продолжительность», но это не сработало. Я, вероятно, пропустил что-то простое, но я совершенно новый для работы с API-интерфейсами и перегружен всем этим текстом. Цените любую помощь!

ответ

4

Вы ищете это:

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 карте расстояния с помощью Google Maps.

Чтобы ответить на ваш вопрос, я думаю, что использовать json-версию google API проще (даже рекомендуется), чем 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" 
+0

Прохладный, я не знал, что эта функция существует. Поработал как шарм, спасибо! Тем не менее, мне все равно хотелось бы знать, как я могу настроить ручную функцию, которую я предоставил. –

+0

@wleoncio это хорошее упражнение для изучения кода mapdist. Вы можете увидеть мое редактирование для небольшой версии. – agstudy

+0

Спасибо за подсказку, я скоро впишу свои зубы в это. –

0

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

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

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"