2015-05-10 8 views
6

Ich versuche eine interaktive Webmap in R zu erstellen, um Stürme mit Shiny, Leaflet und rCharts anzuzeigen (die Struktur basiert lose auf der http://ramnathv.github.io/bikeshare App).Erstellen einer interaktiven Webmap mit Markern in R mit Shiny, Leaflet und rCharts

Die Idee ist, dass der Benutzer nur einen Sturmnamen (df $ Name) auswählt und die Marker für diesen Sturm (lat/long) in einer Leaflet-Map (mit Zoom-In/Out-Funktion) angezeigt werden.

Ich kann Leaflet nicht erhalten, um eine neue Karte und Marker für jeden einzelnen Sturmnamen zu laden. Jede Hilfe/Beratung würde sehr geschätzt werden!

Dies ist, was die Daten (TCs.Rda) aussehen (Beispieldatendatei hochgeladen here):

Year Name Wind lat long 
2010 BONNIE 15  30.100 -91.000 
2010 FIVE 25  30.000 -88.900 
2010 FIVE 25  30.400 -88.800 
2010 FIVE 25  30.800 -88.600 

server.R

library(shiny); library(rCharts); library(leaflet)  
load("TCs.Rda") 
name <- sort(unique(data$Name)) 
shinyServer(function(input, output){  
    dataset <- reactive({ df <- data[data$Name == input$name, ] })  
    output$add <- renderText({paste("Storm name:", input$name)}) 
    output$Controls <- renderUI({ 
     list(selectInput("name", "Select storm", name, selected=name[1])) }) 
    output$myChart <- renderMap({ 
     df <- dataset() 
     map <- Leaflet$new() 
     map$setView(c(35, -80),zoom=5) 
     map$tileLayer(provider='Stamen.TonerLite')   
     for (i in 1:nrow(df)) { 
     map$marker(c(df[i, "lat"], df[i, "long"]), bindPopup=df[i, "Wind"])} 
     map$set(dom='myChart') 
     map$enablePopover(TRUE) 
     map$fullScreen(TRUE) 
     map  
     }) 
    }) 

ui.R

library(shiny); library(rCharts); library(leaflet) 
shinyUI(pageWithSidebar( 
    headerPanel("Storm tracks"), 
    sidebarPanel(h3("My subtitle"), uiOutput("Controls")), 
    mainPanel(      
    tabsetPanel(  
     h3(textOutput("add")),    
     tabPanel("map", tags$style(".leaflet {height: 400px;}"), # I can only get this to work with a tabset panel, but ideally both the textOutput and map would go directly in the mainPanel 
     showOutput("myChart", "leaflet"))) 
    ) 
)) 

Antwort

5

Ich habe es irgendwann selbst herausgefunden! Ein anderer Beitrag (Shiny renders a responsive rCharts leaflet map once, but is blank if you change the input variable) zeigte an, dass die Codezeile "map $ set (dom = 'myChart')" verhindern könnte, dass Leaflet bei jeder Auswahl eine neue Karte neu lädt.

Ich dachte nicht, dass das hier das Problem sein könnte (mein Beispiel ist ein wenig anders und verwendet nicht Geojson), aber anscheinend war es.

Dieses ist mein Arbeitscode, für den Fall hilft es jemand anderes -

server.R

library(shiny);library(rCharts);library(leaflet) 
load("TCs.Rda") 
name <- sort(unique(data$Name)) 
shinyServer(function(input, output){ 
    dataset <- reactive({df<- data[data$Name == input$name, ]})  
    output$add <- renderText({paste("Storm name:", input$name)}) 
    output$Controls <- renderUI({list(selectInput("name", "Select storm", name, selected=name[1])) }) 
output$myChart <- renderMap({ 
    df <- dataset() 
    map <- Leaflet$new() 
    map$setView(c(35, -80),zoom=3) 
    map$tileLayer(provider='Stamen.TonerLite')  
    for (i in 1:nrow(df)) {map$marker(c(df[i, "lat"], df[i, "long"]))}   
    map$fullScreen(TRUE) 
    map  
    }) 
}) 

ui.R

library(shiny); library(rCharts); library(leaflet) 
shinyUI(pageWithSidebar( 
    headerPanel("Storm tracks"), 
    sidebarPanel(h3("My subtitle"), uiOutput("Controls")), 
    mainPanel(  
     tabsetPanel(  
     tabPanel("map", h3(textOutput("add")), 
      tags$style(".leaflet {height: 400px;}"), 
      showOutput("myChart", "leaflet"))) 
) 
)) 

Und das Ergebnis sieht wie folgt aus:

enter image description here

Verwandte Themen