2016-04-11 7 views
5

Neu hier und relativ neu zu R auch, also bitte verzeih mir apriori und lass mich wissen, was ich in diesem Beitrag falsch mache, um andere in Zukunft nicht zu ärgern:Kann nicht mit dem Broschürenpaket von R in Schleife gehen, um mehrere Karten zu erzeugen

Ich versuche eine Sequenz (Sep-1971 bis April-1972) von Flugblattkarten zu erstellen. Am Ende möchte ich sie glänzend machen und einen Benutzer eine Animation abspielen lassen (Pause).

No While und For-Loops funktionierte für mich. Increments hatte funktioniert, als ich meine i s nach dem Ausführen des Codes überprüft, funktioniert die Broschüre nicht. Ohne den Loop hat mein "Dynamic Leaflet Fails" (siehe unten im Code-Abschnitt) funktioniert und eine Karte geöffnet.

Ist es nicht möglich, Broschüren sequenziell zu erstellen?

#set working directory 
require(leaflet) 
require(dplyr) 

#Build data.frame with 10 obs + 3 cols 
power <- data.frame(Latitude <-c(33.515556, 38.060556, 47.903056, 49.71, 49.041667, 31.934167, 54.140586, 54.140586, 48.494444, 48.494444), Longitude <- c(
129.837222, -77.789444, 7.563056, 8.415278, 9.175, -82.343889, 13.664422, 13.664422, 17.681944, 17.681944), start <- c(as.Date(
"15-Sep-1971", "1-Dec-1971", "1-Feb-1972", "1-Feb-1972", "1-Feb-1972", "1-Feb-1972", "1-Apr-1972", "1-Apr-1972", "24-Apr-1972", "24-Apr-1972", format = "%d-%b-%Y"))) 

#"Dynamic" leaflet Fails1: While+For combo 
i<- as.Date("1971-09-14") 
while (i < as.Date("1972-05-01")) { for(star in start){ 
if (star > i) { 
leaflet(power) %>% addTiles() %>% 
    addCircleMarkers(lng = ~Longitude, lat = ~Latitude) 
}} 
i <- i+60} 

#"Dynamic" leaflet Fails2: For+break combo 
lap <- seq(as.Date("1971-09-14"), as.Date("1972-05-01"), by = "month") 
for(i in lap) { 
leaflet (data = power[power$start > i,]) %>% 
addTiles() %>% 
addCircleMarkers(lng = ~Longitude, lat = ~Latitude) 
if (i > as.Date("1951-01-01")) 
{  break }} 
+0

Da dieses Merkblatt dynamische Karten erstellt, ist es eine bessere Idee, eine Karte zu erstellen, wo Sie das Startdatum anpassen können. 'shiny' macht es ziemlich einfach. Andernfalls, wenn Sie eine Broschüre verwenden, um statische Karten zu erstellen (keine gute Idee), erstellen Sie eine Plotfunktion, oder speichern Sie zumindest die Karten, die Sie erstellen, damit Sie etwas damit machen können. – alistaire

+0

Danke Alistaire! Was ist der Unterschied zwischen einer (einzelnen) dynamischen und statischen Flugblattkarte? Wenn es einen gibt, fehlt mir etwas Großes. Wie ich es sehe, wird die Broschüre die Anpassungen nicht glänzend stören, aber ich kann falsch liegen und ich bin offen für Vorschläge. Mit all dem versuche ich, so etwas zu erschaffen: (https://seth127.shinyapps.io/slider/), aber ich konnte keinen Code von einem anderen früheren Projekt finden, in dem die Animation und das Flugblatt von shiny kombiniert wurden. Wenn du einen Vorschlag hast, wie das geht, erleuchte mich bitte! – Naibaf

+0

Uh! -3 Forschungsaufwand. Zurück zum Lernen und mein Herz ist gebrochen. In allem Ernst, habe ich das viele Versuche und Fehler gemacht und im Internet surfen, vielleicht mehr als das, was meine Post involviert zu haben scheint. Teilen Sie Ihre Gehirne mit mir, PLZ – Naibaf

Antwort

12

Hier ist ein schneller Weg, leaflet-timeline in der Art, wie Sie vorschlagen, hinzuzufügen. Aus irgendeinem Grund wird die Zeitleiste in RStudio Viewer nicht perfekt wiedergegeben, scheint jedoch in Chrome ordnungsgemäß zu funktionieren. Ich habe den Code inline kommentiert, um die Schritte zu beschreiben.

library(htmlwidgets) 
library(htmltools) 
library(leaflet) 
library(geojsonio) 

#Build data.frame with 10 obs + 3 cols 
power <- data.frame(
    "Latitude" = c(33.515556, 38.060556, 47.903056, 49.71, 49.041667, 31.934167, 54.140586, 54.140586, 48.494444, 48.494444), 
    "Longitude" = c(129.837222, -77.789444, 7.563056, 8.415278, 9.175, -82.343889, 13.664422, 13.664422, 17.681944, 17.681944), 
    "start" = do.call(
    "as.Date", 
    list(
     x = c("15-Sep-1971", "1-Dec-1971", "1-Feb-1972", "1-Feb-1972", "1-Feb-1972", "1-Feb-1972", "1-Apr-1972", "1-Apr-1972", "24-Apr-1972", "24-Apr-1972"), 
     format = "%d-%b-%Y" 
    ) 
) 
) 

# set start same as end 
# adjust however you would like 
power$end <- power$start 


# use geojsonio to convert our data.frame 
# to GeoJSON which timeline expects 
power_geo <- geojson_json(power,lat="Latitude",lon="Longitude") 

# create a leaflet map on which we will build 
leaf <- leaflet() %>% 
    addTiles() 

# add leaflet-timeline as a dependency 
# to get the js and css 
leaf$dependencies[[length(leaf$dependencies)+1]] <- htmlDependency(
    name = "leaflet-timeline", 
    version = "1.0.0", 
    src = c("href" = "http://skeate.github.io/Leaflet.timeline/"), 
    script = "javascripts/leaflet.timeline.js", 
    stylesheet = "stylesheets/leaflet.timeline.css" 
) 

# use the new onRender in htmlwidgets to run 
# this code once our leaflet map is rendered 
# I did not spend time perfecting the leaflet-timeline 
# options 
leaf %>% 
    setView(44.0665,23.74667,2) %>% 
    onRender(sprintf(
    ' 
function(el,x){ 
    var power_data = %s; 

    var timeline = L.timeline(power_data, { 
     pointToLayer: function(data, latlng){ 
     var hue_min = 120; 
     var hue_max = 0; 
     var hue = hue_min; 
     return L.circleMarker(latlng, { 
      radius: 10, 
      color: "hsl("+hue+", 100%%, 50%%)", 
      fillColor: "hsl("+hue+", 100%%, 50%%)" 
     }); 
     }, 
     steps: 1000, 
     duration: 10000, 
     showTicks: true 
    }); 
    timeline.addTo(HTMLWidgets.find(".leaflet")); 
} 
    ', 
    power_geo 
)) 
+1

pünktliches Portfolio, du bist ein Zauberer und ein wahrer Gentleman. Ich habe mich für 'power $ end <- power $ start + 90' entschieden, um die Marker zu sehen und ich werde damit noch etwas herumspielen. Vielen vielen Dank. – Naibaf

+0

@timelyportfolio. gute Antwort. Was würden Sie tun, um die Farbe an eine Variable anzupassen? – MLavoie

+0

Wenn ich richtig verstehe, könnte man in 'sprintf' mit' jsonlite :: toJSON' eine Farbkarte hinzufügen. Also 'var colors =% s' und dann' jsonlite :: toJSON (liste (var1 = list (color = "...", fillColor = "...", ...), auto_unbox = TRUE) 'und zuletzt Fügen Sie die Suche im JavaScript hinzu. Schwer zu erklären im Kommentar. – timelyportfolio

7

Eine aktualisierte Version des Beitrags von @factualportfolio aus dem letzten Jahr. Ich musste eine timelineControl Funktion hinzufügen, um es zur Arbeit zu bringen. Ich musste auch die getMap() Funktion des Broschürenelements aufrufen, um die Funktionen zum Binden an das Kartenobjekt zu erhalten.

library(htmlwidgets) 
library(htmltools) 
library(leaflet) 
library(geojsonio) 

#Build data.frame with 10 obs + 3 cols 
power <- data.frame(
    "Latitude" = c(33.515556, 38.060556, 47.903056, 49.71, 49.041667, 31.934167, 54.140586, 54.140586, 48.494444, 48.494444), 
    "Longitude" = c(129.837222, -77.789444, 7.563056, 8.415278, 9.175, -82.343889, 13.664422, 13.664422, 17.681944, 17.681944), 
    "start" = do.call(
     "as.Date", 
     list(
      x = c("15-Sep-1971", "1-Dec-1971", "1-Feb-1972", "1-Feb-1972", "1-Feb-1972", "1-Feb-1972", "1-Apr-1972", "1-Apr-1972", "24-Apr-1972", "24-Apr-1972"), 
      format = "%d-%b-%Y" 
     ) 
    ) 
) 

# set start same as end 
# adjust however you would like 
power$end <- power$start + 30 


# use geojsonio to convert our data.frame 
# to GeoJSON which timeline expects 
power_geo <- geojson_json(power,lat="Latitude",lon="Longitude", pretty = T) 

# create a leaflet map on which we will build 
leaf <- leaflet() %>% 
    addTiles() 

# add leaflet-timeline as a dependency 
# to get the js and css 
leaf$dependencies[[length(leaf$dependencies)+1]] <- htmlDependency(
    name = "leaflet-timeline", 
    version = "1.0.0", 
    src = c("href" = "http://skeate.github.io/Leaflet.timeline/"), 
    script = "javascripts/leaflet.timeline.js", 
    stylesheet = "stylesheets/leaflet.timeline.css" 
) 

# use the new onRender in htmlwidgets to run 
# this code once our leaflet map is rendered 
# I did not spend time perfecting the leaflet-timeline 
# options 
leaf %>% 
    setView(44.0665,23.74667,2) %>% 
    onRender(sprintf(
     ' 
     function(el,x){ 
     var power_data = %s; 

     var timelineControl = L.timelineSliderControl({ 
      formatOutput: function(date) { 
      return new Date(date).toString(); 
      } 
     }); 

     var timeline = L.timeline(power_data, { 
     pointToLayer: function(data, latlng){ 
     var hue_min = 120; 
     var hue_max = 0; 
     var hue = hue_min; 
     return L.circleMarker(latlng, { 
     radius: 10, 
     color: "hsl("+hue+", 100%%, 50%%)", 
     fillColor: "hsl("+hue+", 100%%, 50%%)" 
     }); 
     }, 
     steps: 1000, 
     duration: 10000, 
     showTicks: true 
     }); 
     timelineControl.addTo(HTMLWidgets.find(".leaflet").getMap()); 
     timelineControl.addTimelines(timeline); 
     timeline.addTo(HTMLWidgets.find(".leaflet").getMap()); 
     } 
     ', 
     power_geo 
    )) 
+0

@timelyportfolio: Das ist großartig, aber vorausgesetzt, Sie haben einen komplexeren data.frame, wie geben Sie an, welche Variable die Timeline-Informationen enthält? Gibt es dafür ein Argument in ' geojson_json() '? –

Verwandte Themen