2017-06-14 3 views
0

Ich versuche, Linien mit Flugblatt zu plotten, aber ich habe einige Schwierigkeiten bei der Trennung des Segments. Ich habe ein Objekt, das wie diesen Diese Datei stellt zwei Reisen als BeispielLeaflet separate Zeilen

> head(trips, n=15) 
    time.start time.end long.start long.end lat.start lat.end distance time.diff  speed color 
1 1476450598 1476450713 9.03913 9.03924 45.61335 45.61362 31.25292  115 0.9783524 green 
2 1476450713 1476450727 9.03924 9.03995 45.61362 45.61365 55.38651  14 14.2422459 green 
3 1476450727 1476450751 9.03995 9.04005 45.61365 45.61340 28.89870  24 4.3348057 green 
4 1476450751 1476450777 9.04005 9.04017 45.61340 45.61406 74.06267  26 10.2548313 green 
5 1476450777 1476450873 9.04017 9.03949 45.61406 45.61419 54.89125  96 2.0584219 green 
6 1476450873 1476450920 9.03949 9.03496 45.61419 45.61319 369.88687  47 28.3317600 green 
7 1476450920 1476450930 9.03496 9.03440 45.61319 45.61295 51.13973  10 18.4103034 green 
8 1476450930 1476450932 9.03440 9.03448 45.61295 45.61285 12.75643   2 22.9615714 green 
9 1476450932 1476450982 9.03448 9.03495 45.61285 45.61241 61.14351  50 4.4023330 green 
10 1476451362 1476451363 9.03553 9.03559 45.61197 45.61188 11.05462   1 39.7966396 green 
11 1476451363 1476451373 9.03559 9.03606 45.61188 45.61129 75.18742  10 27.0674701 green 
12 1476451373 1476451382 9.03606 9.03712 45.61129 45.61127 82.57276   9 33.0291031 green 
13 1476451382 1476451405 9.03712 9.04059 45.61127 45.61095 272.54942  23 42.6599094 green 
14 1476451405 1476451412 9.04059 9.04115 45.61095 45.61091 43.83450   7 22.5434586 green 
15 1476451412 1476451431 9.04115 9.04440 45.61091 45.61064 254.85994  19 48.2892512 green 

sieht (es gibt viele mehr, aber es ist nur eine Idee zu geben), idealerweise den Punkt no.9 (Ende der ersten Reise) sollte nicht mit Punkt 10 (Beginn der 2. Fahrt) verknüpft werden. Ich habe dies mit dem mapImageData ist das Äquivalent der Fliesen in Leaflet

ggmap(mapImageData)+ 
    geom_segment(data=trips, mapping=aes(y=trips$lat.start, x=trips$long.start, 
             yend=trips$lat.end, xend=trips$long.end),color=trips$color,size=1) 

in diesem Code Kommando und dann mit Ich füge Punkte der Befehl geom_segment, die Anfangs- und Endposition von jedem Punkt angeben.

Mit Prospekt muss ich den Befehl addPolylines(data = mydata, lng = ~long, lat = ~lat, weight=1,color="purple") verwenden. Der Unterschied besteht darin, dass dieser Befehl eine Spalte von Länge und eine Spalte der Breite will, in meinem Beispiel so etwas wie diese

head(mydata, n=15) 
     lat long 
1 45.61335 9.03913 
2 45.61362 9.03924 
3 45.61365 9.03995 
4 45.61340 9.04005 
5 45.61406 9.04017 
6 45.61419 9.03949 
7 45.61319 9.03496 
8 45.61295 9.03440 
9 45.61285 9.03448 
10 45.61197 9.03553 
11 45.61188 9.03559 
12 45.61129 9.03606 
13 45.61127 9.03712 
14 45.61095 9.04059 
15 45.61091 9.04115 

aber diese, alle Punkte verbindet, wie kann ich sagen, wenn nicht die Punkte zu verbinden? zum Beispiel Position Nr. 9 und 10 sollten nicht miteinander verbunden sein. Danke, Marco

+0

Sie können die Daten schmelzen und die Zeilennamen halten. Verwenden Sie das Argument 'group' (Zeilennamen wären die Gruppierung), um den Start und den Stopp anzugeben. – troh

Antwort

1

Vor allem brauchen wir eine Möglichkeit, die verschiedenen Reisen zu unterscheiden.
benutzte ich

df$group <- c(rep(1, 9), rep(2, 6)) 

auf das, was Sie gesagt haben, aber ändern Sie Ihre df wie es passt.

Danach werden wir eine Polylinie für jede Gruppe hinzuzufügen:

m <- leaflet(df) %>% 
    addTiles() 

for (i in unique(df$group)) { 
    m <- m %>% 
     addPolylines(data = df[df$group == i, ], 
        lng = ~long.start, 
        lat = ~lat.start) 
} 

Ergebnis:

enter image description here

Trotz einer for loop ist dies recht schnell. Zur Beschleunigung es eine Kerbe können wir eine lapply verwenden:

m <- leaflet(df) %>% 
     addTiles() 

lapply(unique(df$group), 
     function(x) { 
      addPolylines(m, 
         data = df[df$group == x, ], 
         lng = ~long.start, 
         lat = ~ lat.start) 
     }) 
rbenchmark::benchmark(
    apply = { 

     m <- leaflet(df) %>% 
      addTiles() 

     lapply(unique(df$group), function(x) { 
      addPolylines(m, 
         data = df[df$group == x, ], 
         lng = ~long.start, 
         lat = ~ lat.start) 
     }) 
    }, 
    forcycle = { 

     m <- leaflet(df) %>% 
      addTiles() 

     for (i in unique(df$group)) { 
      addPolylines(m, 
         data = df[df$group == i, ], 
         lng = ~long.start, 
         lat = ~lat.start) 
     }}, 
    replications = 1000) 
#>  test replications elapsed relative user.self sys.self user.child 
#> 1 apply   1000 2.91 1.000  2.92  0   NA 
#> 2 forcycle   1000 3.04 1.045  3.00  0   NA 
+0

Vielen Dank für Ihre Hilfe, es funktioniert perfekt, nur eine Frage, gibt es eine Möglichkeit, das gleiche Ergebnis ohne einen Zyklus zu replizieren? Wie ggmap würde es tun? Ich frage das nur, weil ein Zyklus für gewöhnlich sehr langsam ist, wenn es viele Wiederholungen gibt. Vielen Dank noch einmal –

+0

mit einigen Benchmark aktualisiert – GGamba

Verwandte Themen