Mapdist: 控制交通影响的距离计算

3
我正在进行一个项目,需要获取从“接送点”到“下车点”的最短距离和时间。 在我的数据集中,有一个变量表示“行程距离”和“接送日期”,我的任务是计算“行程距离”变量与Google估计距离的偏差,并通过控制出发时间来计算每次旅行需要多长时间。 以下是我数据的一小部分示例(该数据集包含约1.5百万行,我正在尝试找到解决<2,500查询限制的方法)。
trip_distance   pickup_datetime     pickup                  dropoff
1     8.1     2011-01-01 23:13:56    40.77419%2C-73.872608    40.78055%2C-73.955042
2     10.6    2011-01-04 17:12:49    40.7737%2C-73.870721    40.757007%2C-73.971953
3     15.9    2011-01-05 18:41:53   40.773761%2C-73.87086    40.707277%2C-74.007301

代码:

library(ggmap)
rownames(X) <- NULL
res <- mapdist(from= X$pickup, 
           to = X$dropoff, 
           mode = "driving" ,
           output = "simple", messaging = FALSE, sensor = FALSE,
           language = "en-EN", override_limit = FALSE, departure_time= X$pickup_date)

我得到的错误信息是:
 Error in mapdist(from = X$pickup, to = X$dropoff, mode = "driving",      output = "simple",  :  unused argument (departure_time = X$pickup_date)

是否有办法使用mapdist控制交通?

dput(head(X))

structure(list(pickup_datetime = structure(c(1293923636, 1294161169, 
1294252913, 1294259376, 1294419723, 1293903309), class = c("POSIXct", 
"POSIXt"), tzone = ""), trip_distance = c(8.1, 10.6, 15.9, 8.9, 
11.5, 9.6), pickup = c("40.77419,-73.872608", "40.7737,-73.870721", 
"40.773761,-73.87086", "40.773776,-73.870908", "40.774161,-73.87302", 
"40.774135,-73.8749"), dropoff = c("40.78055,-73.955042",         "40.757007,-73.971953", 
"40.707277,-74.007301", "40.770568,-73.95468", "40.758284,-73.986621", 
"40.758691,-73.961359")), .Names = c("pickup_datetime",     "trip_distance", 
"pickup", "dropoff"), row.names = c(NA, 6L), class = "data.frame")

1
请提供 dput(head(X)) - Steven Beaupré
我已将其添加到问题中,请在上方查找。谢谢。 - Estefy
2个回答

3
ggmap中的mapdist()函数不会返回交通信息,因为它似乎没有使用&departure_time=key=参数(这些参数是检索交通信息所必需的)构造URL。
根据Google Maps距离矩阵API 文档中提到的:

对于行驶模式的请求:您可以指定departure_time来接收考虑交通状况的路线和行程持续时间(响应字段:duration_in_traffic)。仅当请求包含有效的API密钥或有效的Google Maps APIs Premium Plan客户端ID和签名时才可使用此选项。

此外,在您的数据集中,pickup_date已过去,因此无法将其用作departure_time参数。

departure_time必须设置为当前时间或将来的某个时间。它不能在过去。

需要使用数字格式:

您可以将时间指定为自1970年1月1日UTC午夜以来的秒数。或者,您可以指定一个值为now,该值将出发时间设置为当前时间(精确到最近一秒)。


话虽如此,您可以手动构造自己的请求到Google Maps距离矩阵API,使用所需的参数(请注意,我修改了您的初始数据集以提供未来发生的pickup_datetime

APIKEY = ##Your API key goes here##

url_string <- paste0("https://maps.googleapis.com/maps/api/distancematrix/json",
                     "?origins=", df$pickup,
                     "&destinations=", df$dropoff,
                     # convert POSIXct to numeric
                     "&departure_time=", as.numeric(df$pickup_datetime),
                     "&traffic_model=best_guess",
                     "&key=", APIKEY)

这将给你一个字符向量url_string,其中包含所有的URL。例如,你可以检索第一条目的信息:
connect <- url(url_string[1])  
tree <- jsonlite::fromJSON(paste(readLines(connect), collapse = ""), 
                           simplifyDataFrame = FALSE)

然后使用以下方式访问流量信息:

tree$rows[[1]]$elements[[1]]$duration_in_traffic

这将会给出:

$text
[1] "17 mins"

$value
[1] 1016

数据

df <- structure(list(pickup_datetime = structure(c(1473923636, 1474161169, 
1474252913, 1474259376, 1474419723, 1473903309), class = c("POSIXct", 
"POSIXt")), trip_distance = c(8.1, 10.6, 15.9, 8.9, 11.5, 9.6
), pickup = c("40.77419,-73.872608", "40.7737,-73.870721", "40.773761,-73.87086", 
"40.773776,-73.870908", "40.774161,-73.87302", "40.774135,-73.8749"
), dropoff = c("40.78055,-73.955042", "40.757007,-73.971953", 
"40.707277,-74.007301", "40.770568,-73.95468", "40.758284,-73.986621", 
"40.758691,-73.961359")), class = "data.frame", .Names = c("pickup_datetime", 
"trip_distance", "pickup", "dropoff"), row.names = c(NA, -6L))

如果我使用这段代码是正确的,那么我只能逐个获取输出。我该如何获得包含所有请求输出的向量或矩阵?就像我在上面的代码中所得到的一样。谢谢! - Estefy
@Estefy 你可以直接循环遍历 url_string - Steven Beaupré

3
我写了一个名为googleway的程序包,用于访问Google地图API。您可以在其中指定您的API密钥,并使用API提供的功能(如出发时间和交通情况)。但是,您需要使用开发版本,因为我注意到traffic_model中存在一个小错误。这将在下一个发布版本中修复。
devtools::install_github("SymbolixAU/googleway")
library(googleway)

key <- "your_api_key"

## data.frame of origin & destination coordiantes
## you can obviously add in a 'pickup' datetime column too, 
## but remembering that for Google API it must be in the future
df <- data.frame(orig_lat = c(40.77419, 40.7737, 40.773761),
                 orig_lon = c(-73.872608, -73.870721, -73.87086),
                 dest_lat = c(40.78055, 40.757007, 70.707277),
                 dest_lon = c(-73.955042, -73.971953,-74.007301))

现在,您可以使用您喜欢的循环方法获取数据框中每一行上每组点之间的距离。

例如:

lst <- apply(df, 1, function(x) { 
  google_distance(origins = list(c(x["orig_lat"], x["orig_lon"])),
                  destinations = list(c(x["dest_lat"], x["dest_lon"])),
                  departure_time = Sys.time() + (24 * 60 * 60),
                  traffic_model = "best_guess",
                  key = key)
  })

然后您可以从返回的列表中访问数据。
lst[[1]]$origin_addresses
# [1] "Central Terminal Dr, East Elmhurst, NY 11371, USA"
lst[[1]]$destination_addresses
# [1] "1294-1296 Lexington Ave, New York, NY 10128, USA"
lst[[1]]$rows$elements
# [[1]]
# distance.text distance.value duration.text duration.value duration_in_traffic.text duration_in_traffic.value status
# 1       12.8 km          12805       21 mins           1278                  23 mins                      1355     OK

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接