2016-12-09 3 views
1

Je travaille sur la boucle à travers des points longs et de latitude pour l'API googleways. Je suis venu avec deux façons de le faire dans un effort pour accéder aux points de sections indiquées dans le lien suivant:lier les listes sur le paquet googleways pour google directions?

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

Unforuntaely car cela utilise une clé unique que je ne peux pas donner un exemple reproductible mais Voici mes tentatives, l'une utilisant mapply et l'autre avec une boucle. Les deux travaillent dans la production d'une réponse sous forme de liste, mais je ne suis pas sûr comment déballer à tirer sur la route des points que vous en passant un seul point:

df$routes$overview_polyline$points 

Toutes les suggestions?

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 **

La sortie envisagée est une trame de données comme ci-dessous:. Où "id" représente le voyage d'origine alimenté dans

 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 fourni pour répondre à la question sur la liste de données à la liste de paires:

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

le code sql est basique l ooks comme par exemple:

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

puis avant de le nourrir mon flux de trames de données ressemble donc (u peut ignorer le départ que j'utilisais que pour la api à distance):

   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

Ajout d'une modification avec la sortie prévue – LoF10

+0

et les coordonnées de tous les points de la polyligne? – SymbolixAU

+0

exactement de sorte que le lat lon représente les points dans la polyligne – LoF10

Répondre

2

Comme vous le savez le résultat de la requête API renvoie une liste. Et si vous faites plusieurs appels à l'API, vous retournerez plusieurs listes.

Donc, pour extraire les données d'intérêt, vous devez effectuer des opérations standard sur les listes. Dans cet exemple, il peut être fait avec un couple de *apply s

Utilisation du data.frame feed où chaque ligne se compose d'une origine latitude/longitude (px/py) et une destination latitude/longitude (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)) 

Vous pouvez utiliser un apply pour interroger l'API google_directions() pour chaque ligne de la data.frame. Et dans le même apply vous pouvez faire ce que vous voulez avec le résultat pour extraire/formater comme vous voulez.

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) 

}) 

Alors maintenant lst est une liste qui contient le résultat de chaque requête, plus le polyligne décodé comme data.frame. Pour obtenir tous les polylignes décodés comme un seul data.frame vous pouvez faire une autre lapply, puis rbind tous ensemble

## 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

Ceci est très utile, merci.En supposant une base de données nommée "feed" avec deux colonnes, à savoir "origine" et "destination", comment pourrais-je changer cela dans une liste de paires comme vous l'avez? J'ai essayé pairlist() et setNames (as.list (feed $ origine), feed $ destination), mais ni l'un ni l'autre ne m'ont donné le nom de sortie comme le vôtre et je suis nouveau à travailler avec des listes. J'ai inclus le débit dans les modifications ci-dessus. – LoF10

+0

comment générez-vous le 'feed' data.frame? Il pourrait être plus facile de changer la façon dont il est créé, plutôt que de le changer dans son état actuel (comme vous devez séparer chaque valeur dans son composant lat/lon cooridnates) – SymbolixAU

+0

Gotcha, bien dans ma configuration Je tire ces coordonnées d'un base de données SQL comme deux colonnes de sorte qu'ils par défaut à une trame de données. Avez-vous des suggestions pour commencer avec une liste comme vous l'avez fait? Vous mentionnez l'endroit où vous utilisez une liste: "Utilisation du flux de données (ici j'utilise une liste de paires origine/destination)" – LoF10