2013-06-24 41 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" 
相关问题