2014-10-10 100 views
3

嗨,我有一系列的住宅和一系列火车站。我想计算每个家庭(n = 1718)到每个家庭(n = 11)的步行距离。我知道谷歌限制你每天2000 obs,所以我会做所有家庭obs到1站。我的数据是这样的:使用经纬度向量查找R中的步行距离

Home data:      

     longitude latitude    
    1 -76.27769 36.86308 
    2 -76.29188 36.87556 
    3 -76.26982 36.86628 
    4 -76.27455 36.86894 

    Station Data 
     Longitude Latitude 
    1 -76.30377 36.85945 
    2 -76.29490 36.85395 
    3 -76.28896 36.85156 
    4 -76.28989 36.84719 
    5 -76.28579 36.84568 

,我发现这样的代码,但它总结的距离为每一个家庭,而不是为每个home.I'm漂亮的新R上的距离...帮助!

`distHoras <- function(origin, destination){ 

    origin <- gsub(",", "", origin) 
    origin <- gsub(" ", "+", origin) 
    origin <- paste("origins=", origin, sep = "") 

    destination <- gsub(",", "", destination) 
    destination <- gsub(" ", "+", destination) 
    destination <- paste("destination=", paste(destination, 
               collapse = "|"), sep = "") 


    mode4url <- paste("mode=", 'walking', sep = "") 
    lang4url <- paste("language=", 'en-EN', sep = "") 
    sensor4url <- paste("sensor=", tolower(as.character(FALSE)), 
         sep = "") 
    posturl <- paste(origin, destination, 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('origin', 'destination') 
elements.distance.text elements.distance.value 
      "1,253 km"    "1252635" 
elements.duration.text elements.duration.value 
     "9 days 8 hours"    "804659" 
     elements.status 
        "OK" 

回答

1

像这样的事情?输出

google.dist <- function(from,to,mode="walking") { 
    require(httr) 
    require(XML) 
    url <- "https://maps.googleapis.com/maps/api/distancematrix/xml" 
    origin <- paste(with(from,paste(latitude,longitude,sep=",")),collapse="|") 
    dest <- paste(with(to,paste(latitude,longitude,sep=",")),collapse="|") 
    response <- GET(url,query=list(origins=origin,destinations=dest,mode=mode)) 
    doc  <- content(response,type="text/xml") 
    status <- sapply(doc["//row/element/status"],xmlValue) 
    if(any(status!="OK")) warning("Error Status on some routes") 
    distance <- sapply(doc["//row/element/distance/value"],xmlValue) 
    data.frame(expand.grid(to=1:nrow(to),from=1:nrow(from)),distance=as.numeric(distance)) 
} 
google.dist(Home,Station) 
# to from distance 
# 1 1 1  3275 
# 2 2 1  2494 
# 3 3 1  2163 
# 4 4 1  2548 
# 5 5 1  2212 
# 6 1 2  2539 
# 7 2 2  2950 
# 8 3 2  3288 
# 9 4 2  3815 
# 10 5 2  4034 
# ... 

这使用带有XML输出的Google Distance Matrix API。返回的数据帧的行号分别为tofrom数据帧,距离为,它们之间的距离为。 API记录为here。请仔细注意terms of use

相关问题