Объединение списков из пакета googleways для указаний google?

Я работаю над прохождением точек долготы и широты для API googleways. Я придумал два способа сделать это, чтобы получить доступ к разделам точек, показанным в следующей ссылке:

https://cran.r-project.org/web/packages/googleway/vignettes/googleway-vignette.html

К сожалению, поскольку здесь используется уникальный ключ, я не могу привести воспроизводимый пример, но ниже приведены мои попытки: одна использует mapply, а другая - цикл. Оба работают в создании ответа в формате списка, но я не уверен, как распаковать его, чтобы вытащить маршрут точек, как если бы вы проходили только одну точку:

df$routes$overview_polyline$points

Какие-либо предложения?

library(googleway)

dir_results = mapply(
  myfunction,
  origin = feed$origin,
  destination = feed$destination,
  departure = feed$departure
)

OR

empty_df = NULL
for (i in 1:nrow(feed)) {
  print(i)
  output = google_directions(feed[i,"origin"], 
                             feed[i,"destination"], 
                             mode = c("driving"), 
                    departure_time = feed[i,"departure"], 
                    arrival_time = NULL,
                    waypoints = NULL, alternatives = FALSE, avoid = NULL,
                    units = c("metric"), key = chi_directions, simplify = T)
  empty_df = rbind(empty_df, output)
}

РЕДАКТИРОВАТЬ**

Предполагаемый вывод будет кадром данных, как показано ниже: где "id" представляет исходное отключение.

     lat       lon                                                                    id
1  40.71938 -73.99323 40.7193908691406+-73.9932174682617 40.7096214294434+-73.9497909545898
2  40.71992 -73.99292 40.7193908691406+-73.9932174682617 40.7096214294434+-73.9497909545898
3  40.71984 -73.99266 40.7193908691406+-73.9932174682617 40.7096214294434+-73.9497909545898
4  40.71932 -73.99095 40.7193908691406+-73.9932174682617 40.7096214294434+-73.9497909545898
5  40.71896 -73.98981 40.7193908691406+-73.9932174682617 40.7096214294434+-73.9497909545898
6  40.71824 -73.98745 40.7193908691406+-73.9932174682617 40.7096214294434+-73.9497909545898
7  40.71799 -73.98674 40.7193908691406+-73.9932174682617 40.7096214294434+-73.9497909545898
8  40.71763 -73.98582 40.7193908691406+-73.9932174682617 40.7096214294434+-73.9497909545898

РЕДАКТИРОВАТЬ **** dput предусмотрена для ответа на вопрос на фрейме данных в список пар:

structure(list(origin = c("40.7193908691406 -73.9932174682617", 
"40.7641792297363 -73.9734268188477", "40.7507591247559 -73.9739990234375"
), destination = c("40.7096214294434-73.9497909545898", "40.7707366943359-73.9031448364258", 
"40.7711143493652-73.9871368408203")), .Names = c("origin", "destination"
), row.names = c(NA, 3L), class = "data.frame")

SQL-код в основном выглядит так:

feed = sqlQuery(con, paste("select top 10
                             longitude as px,
                             latitude as py,
                             dlongitude as dx ,
                             dlatitude as dy,
                             from mydb"))

и затем перед передачей мой фрейм данных выглядит так (вы можете игнорировать отправку, я использовал это для расстояния api):

                origin                       destination           departure
1  40.7439613342285 -73.9958724975586  40.716911315918-74.0121383666992 2017-03-03 01:00:32
2  40.7990493774414 -73.9685516357422 40.8066520690918-73.9610137939453 2017-03-03 01:00:33
3  40.7406234741211 -74.0055618286133 40.7496566772461-73.9834671020508 2017-03-03 01:00:33
4  40.7172813415527 -73.9953765869141 40.7503852844238-73.9811019897461 2017-03-03 01:00:33
5  40.7603607177734 -73.9817123413086 40.7416114807129-73.9795761108398 2017-03-03 01:00:34

1 ответ

Решение

Как известно, результат запроса API возвращает список. И если вы делаете несколько вызовов API, вы получите несколько списков.

Таким образом, чтобы извлечь интересующие вас данные, вы должны выполнить стандартные операции со списками. В этом примере это может быть сделано с парой *applys

Использование data.frame feed где каждая строка состоит из начала координат широты / долготы (px/py) и пункт назначения широта / долгота (dx/dy)

feed <- data.frame(px = c(40.7193, 40.7641),
                   py = c(-73.993, -73.973),
                   dx = c(40.7096, 40.7707),
                   dy = c(-73.949, -73.903))

Вы можете использовать apply запросить google_directions() API для каждой строки data.frame. И в пределах того же apply Вы можете делать с результатом все, что хотите, чтобы извлечь / отформатировать его так, как вы хотите.

lst <- apply(feed, 1, function(x){
    ## query Google Directions API
    res <- google_directions(key = key, 
                             origin = c(x[['px']], x[['py']]),
                             destination = c(x[['dx']], x[['dy']]))

    ## Decode the polyline
    df_route <- decode_pl(res$routes$overview_polyline$points)

    ## append the original coordinates as an 'id' column
    df_route[, "id"] <- paste0(paste(x[['px']], x[['py']], sep = "+")
                                ," "
                                , paste(x[['dx']], x[['dy']], sep = "+")
                                , collapse = " ")

    ## store the results of the query, the decoded polyline, 
    ## and the original query coordinates in a list
    lst_result <- list(route = df_route, 
                       full_result = res, 
                       origin = c(x[['px']], x[['py']]), 
                       destination = c(x[['dx']],x[['dy']]))

    return(lst_result)

})

А сейчас lst список, который содержит результат каждого запроса плюс декодированную полилинию в виде data.frame. Чтобы получить все декодированные полилинии как один data.frame, вы можете сделать другой lapply, а потом rbind все вместе

## do what we want with the result, for example bind all the route coordinates into one data.frame
df <- do.call(rbind, lapply(lst, function(x) x[['route']]))
head(df)
       lat       lon                              id
1 40.71938 -73.99323 40.7193+-73.993 40.7096+-73.949
2 40.71992 -73.99292 40.7193+-73.993 40.7096+-73.949
3 40.71984 -73.99266 40.7193+-73.993 40.7096+-73.949
4 40.71932 -73.99095 40.7193+-73.993 40.7096+-73.949
5 40.71896 -73.98981 40.7193+-73.993 40.7096+-73.949
6 40.71824 -73.98745 40.7193+-73.993 40.7096+-73.949
Другие вопросы по тегам