2017-12-24 10 views
1

Ich möchte die Polylinie zwischen diesen beiden Punkten hinzufügen. Wie kann ich das machen?So fügen Sie Routen (Polylinien) zwischen zwei Markierungen in der Broschüre hinzu

m <- leaflet() %>% 
    addPolylines() %>% 
    addTiles() %>% # Add default OpenStreetMap map tiles 
    addMarkers(lng = -87.6266382, lat = 41.8674336, 
       popup = "starting") %>% 
    addMarkers(lng = -87.64847, lat = 41.9168862, 
       popup = "Destination") 

m # Print the map 

Beispiel für die Daten.

| region  | from_lat | from_long | to_lat  | to_long | 
|-------------|------------|------------- |-------------|----------- | 
| 1   | 41.8674336 | -87.6266382 | 41.887544 | -87.626487 | 
| 2   | 41.8674336 | -87.6266382 | 41.9168862 | -87.64847 | 
| 3   | 41.8674336 | -87.6266382 | 41.8190937 | -87.6230967| 
+0

@jazzurro yup. Ich habe das auch gesehen. aber ich möchte die Route wie GPS, aber ist zwischen zwei Markierungen, anstatt gerade Linie. Ist das möglich ? oder frage ich falsche frage? –

+0

Ich denke, Sie möchten das Google-Paket überprüfen. – jazzurro

+0

https://rdrr.io/cran/googleway/man/add_polylines.html ist es so etwas? –

Antwort

1

Hier ist mein Versuch. Da Sie einige Routen auf einer Prospektkarte zeichnen möchten, möchten Sie diese Aufgabe über das Paket googleway erreichen. Sie können Routendaten mit google_directions() und decode_pl() extrahieren. Da Sie mehrere Routen haben, möchten Sie lapply() verwenden und einen Datensatz erstellen. Sobald Sie die Routendaten haben, ist Ihre Aufgabe unkompliziert. Sie verwenden die Daten in addPolylines().

library(dplyr) 
library(googleway) 
library(leaflet) 

mydf <- data.frame(region = 1:3, 
        from_lat = 41.8674336, 
        from_long = -87.6266382, 
        to_lat = c(41.887544, 41.9168862, 41.8190937), 
        to_long = c(-87.626487, -87.64847, -87.6230967)) 

mykey <- "you need to have your API key here" 

lapply(1:nrow(mydf), function(x){ 

    foo <- google_directions(origin = unlist(mydf[x, 2:3]), 
          destination = unlist(mydf[x, 4:5]), 
          key = mykey, 
          mode = "driving", 
          simplify = TRUE) 

    pl <- decode_pl(foo$routes$overview_polyline$points) 

    return(pl) 

     } 
    ) %>% 
bind_rows(.id = "region") -> temp 


m <- leaflet() %>% 
    addProviderTiles("OpenStreetMap.Mapnik") %>% 
    addPolylines(data = temp, lng = ~lon, lat = ~lat, group = ~region) %>% 
    addMarkers(lng = -87.6266382, lat = 41.8674336, 
       popup = "starting")%>% 
    addMarkers(data = mydf, lng = ~to_long, lat = ~to_lat, 
       popup = "Destination") 

enter image description here

+0

Darf ich noch eine Frage stellen? Sie haben erwähnt, dass mit google_directions() und decode_pl() die Routendaten extrahiert werden können. Wie könnte ich das erreichen? mit as.numeric (foo) und as.numeric (pl) .. Entschuldigung, wenn ich eine dumme Frage stelle. Ich bin ein Neuling in R, vor allem für Google Map. –

+0

@EwsonPhang Werfen Sie einen Blick auf [** diesen Link **] (https://cran.r-project.org/web/packages/googleway/vignettes/googleway-vignette.html) – jazzurro

+0

@EwsonPhang Werfen Sie einen Blick auf die Paket. Sie können Ihre Aufgabe mit dem Paket erledigen. Der Autor des Pakets ist auf SO. Wenn Sie ihn/sie fangen würden, würden Sie mehr Informationen bekommen. – jazzurro

1

@ Antwort des jazzurro ist spot-on so sollte, dass die akzeptierte Antwort bleiben.

Wie schon angedeutet, können Sie dies alles innerhalb des googleway Pakets tun, wenn Sie eine Google Map erstellen und plotten möchten. Der Hauptunterschied zur Verwendung der Broschüre besteht darin, dass Sie die Polylinie nicht dekodieren müssen, da Google Map die codierte Zeichenfolge für Sie verarbeiten kann.

polylines <- lapply(1:nrow(mydf), function(x){ 

    foo <- google_directions(origin = unlist(mydf[x, 2:3]), 
          destination = unlist(mydf[x, 4:5]), 
          key = apiKey, 
          mode = "driving", 
          simplify = TRUE) 

    ## no need to decode the line, just return the string as-is 
    foo$routes$overview_polyline$points 
} 
) 

df <- data.frame(polylines = unlist(polylines), stringsAsFactors = F) 

## add some colour values for the markers 
mydf$colour_from <- "red" 
mydf$colour_to <- "blue" 

## plot the polylines and the markers 
google_map(key = mapKey) %>% 
    add_markers(data = mydf, lat = "from_lat", lon = "from_long", colour = "colour_from") %>% 
    add_markers(data = mydf, lat = "to_lat", lon = "to_long", colour = "colour_to") %>% 
    add_polylines(data = df, polyline = "polylines") 

enter image description here


Hinweis: Ich bin der googleway Autor.

+0

Ich bin froh, dass Sie diese Frage gefunden haben. Ich dachte, du würdest nachsehen, ob es ein Gooleway-Tag geben würde. :) Also habe ich es zu der Frage hinzugefügt. Ich möchte nur bestätigen, dass wir für jede Schleife goole_directions() durchlaufen müssen. Ist das richtig? Oder könnten wir mehrere Routen gleichzeitig ablegen und die Verwendung von "lapply" vermeiden? – jazzurro

+0

@jazzurro - das ist eine gute Frage, und ich habe versucht, eine geeignete Methode zu finden, die Schleifen zu vermeiden.Da die 'google_ *' api-Aufrufe jedoch immer nur einzeln ausgeführt werden können, muss ich noch einen Weg finden. Wenn Sie irgendwelche Vorschläge haben, bin ich glücklich, sie zu hören. Außerdem habe ich in der Dev-Version Methoden hinzugefügt, um [die Ergebnisse einfacher zu extrahieren] (https://github.com/SymbolixAU/googleway/blob/master/R/results_directions.R). – SymbolixAU

+0

Wenn es eine solche Beschränkung gibt, müssen wir nur bei dem bleiben, was Google sagt. Ich war mir über diesen Punkt nicht ganz sicher, als ich meinen obigen Code schrieb. Es wäre schön, diese Regelung in Ihrem CRAN-Handbuch oder in Ihrer Vignette zu sehen. Dann würden Ihre Paketbenutzer wissen, dass sie eine Schleife durchlaufen müssen, um Daten für mehrere Routen zu erhalten. Der OP schien über diesen Punkt verwirrt zu sein, als er seinen Code im obigen Kommentar sah. Was das Extrahieren der Ergebnisse betrifft, sieht das ziemlich gut aus. Ist 'direction_polyline <- function (res) .access_result (resultType (res)," Polylinie ")' gibt einen Datenrahmen mit long und lat zurück? – jazzurro

Verwandte Themen