嗨,我有一系列的房屋和一系列的火车站。我想计算从每个家庭(n = 1718)到每个站(n = 11)的步行距离。我知道谷歌限制你每天2000张,所以我会做所有家庭的阻止1站。我的数据如下:
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
我找到了这样的代码,但它总结了每个家的距离,而不是每个家的距离。我对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"
答案 0 :(得分: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。返回的数据框具有to
和from
数据帧的行号以及它们之间的距离(以米为单位)。该API已记录在案here。请仔细注意terms of use。