2016-12-09 3 views
1

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

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

Unforuntaely, так как это использует уникальный ключ не может обеспечить воспроизводимый пример, но Ниже приведены мои попытки, один с использованием 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) 
} 

EDIT **

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

 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 

EDIT **** 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") 

код страны является основным l ooks, как например:

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

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

   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 
+0

Добавлен правку с предполагаемым выходом – LoF10

+0

и координаты всех точек в полилинии? – SymbolixAU

+0

точно так, что lat lon представляет точки в полилинии – LoF10

ответ

2

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

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

Использование 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 
+0

Это очень полезно, спасибо.Предполагая, что кадр данных с именем «feed» состоит из двух столбцов, а именно «origin» и «destination», как я могу изменить его в список пар, как он есть? Я попробовал парыlist() и setNames (as.list (feed $ origin), feed $ destination), но не дал мне название как ваш, и я новичок в работе со списками. Я включил dput в правки выше. – LoF10

+0

Как вы создаете файл данных feed? Возможно, было бы легче изменить способ его создания, а не изменить его в текущем состоянии (так как вам нужно отделить каждое значение в его компоненте lat/lon cooridnates) – SymbolixAU

+0

Gotcha, ну в моей настройке я вытаскиваю эти координаты из sql базы данных в виде двух столбцов, поэтому они по умолчанию используются для данных. Любые предложения по потянув, чтобы начать с списка, как вы это делали? Вы указываете, где используется список: «Использование фида набора данных (здесь я использую список пар источника/назначения)» – LoF10

Смежные вопросы