2013-06-24 45 views
3

我使用下面的函數來估計的時間(以小時計),以驅動一個一定的距離,假設爲65公里/小時的平均速度:如何從Google Maps API獲取駕車時間?

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計算地圖的距離。

要回答你的問題,我認爲使用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爲您

(您需要一個有效的谷歌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" 
相關問題