2016-12-09 4 views
1

Ich arbeite an Looping durch lange und breite Punkte für die Googleways API. Ich habe mit zwei Möglichkeiten, um zu, dass die Punkte Abschnitte in dem folgenden Link gezeigt zuzugreifen in dem Bemühen zu tun:Listen aus dem Google-Paket für Google-Wegbeschreibungen zusammenführen?

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

Unforuntaely da dies einen eindeutigen Schlüssel verwendet, kann ich nicht ein reproduzierbares Beispiel biete aber Unten sind meine Versuche, einer mit Mapply und der andere mit einer Schleife. Beide arbeiten in einer Antwort im Listenformat produzieren, aber ich bin nicht sicher, wie es entpacken Sie die Punkte Weg zu ziehen, wie Sie es, wenn nur ein Punkt vorbei:

df$routes$overview_polyline$points 

Irgendwelche Vorschläge?

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

Die beabsichtigte Ausgabe wie unten ein Datenrahmen würde. Wobei "id" die ursprüngliche Reise in

 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 gespeist repräsentiert zur Beantwortung der Frage auf dem Datenframe zur Paarliste:

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 code is basic l ooks wie solche:

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

und dann, bevor es mein Datenrahmen-Feed sieht aus wie so Fütterung (u kann ignorieren Abfahrt war ich, dass für den Abstand api verwenden):

   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

Added eine Bearbeitung mit dem beabsichtigten Ausgabe – LoF10

+0

und sind die Koordinaten alle Punkte in der Polylinie? – SymbolixAU

+0

genau so stellt das lat lon die Punkte in der Polylinie dar – LoF10

Antwort

2

Wie Sie wissen, das Ergebnis der API-Abfrage gibt eine Liste zurück. Und wenn Sie mehrere Aufrufe an die API ausführen, geben Sie mehrere Listen zurück.

Um die Daten von Interesse zu extrahieren, müssen Sie Standardoperationen auf Listen durchführen. In diesem Beispiel kann es mit ein paar *apply s

Mit dem data.frame feed wobei jede Zeile besteht aus einem Ursprung lat/lon (px/py) und ein Ziel lat/lon (dx/dy)

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

können Sie eine apply verwenden, um die google_directions() API für jede Zeile der data.frame abzufragen. Und innerhalb desselben apply können Sie tun, was auch immer Sie mit dem Ergebnis wollen, um es zu extrahieren/zu formatieren, wie Sie wollen.

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) 

}) 

So, jetzt lst ist eine Liste, die das Ergebnis jeder Abfrage sowie die dekodiert Linienzug als data.frame enthält. Um alle dekodiert Polylinien als einzelne data.frame Sie eine andere lapply tun können, und dann rbind es alle zusammen

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

Das ist sehr hilfreich, danke.Angenommen, ein Datenrahmen namens "feed" mit zwei Spalten, nämlich "Herkunft" und "Ziel", wie würde ich das in eine Paarliste ändern, wie Sie es haben? Ich habe versucht, pairlist() und setNames (as.list (feed $ ursprung), feed $ destination), aber keiner gab mir den Namen Ausgabe als Ihre und ich bin neu in der Arbeit mit Listen. Ich habe die Ausgabe in die obigen Änderungen eingefügt. – LoF10

+0

Wie generieren Sie den 'feed' data.frame? Es könnte einfacher sein, zu ändern, wie es erstellt wird, anstatt es in seinem aktuellen Zustand zu ändern (wie Sie jeden Wert in seine Komponente lat/lon cooridnates trennen müssen) – SymbolixAU

+0

Gotcha, gut in meinem Setup ziehe ich diese Koordinaten aus einer SQL-Datenbank als zwei Spalten, so dass sie standardmäßig zu einem Datenrahmen. Irgendwelche Vorschläge zum Ziehen, um mit einer Liste zu beginnen, wie Sie es getan haben? Sie erwähnen, wo Sie eine Liste verwenden: "Verwenden des Datei-Feeds (hier verwende ich eine Liste von Ursprung/Ziel-Paaren)" – LoF10

Verwandte Themen