0

I want to visualise the development of fatal traffic accidents and accidents with severe injuries on state and community level in a leaflet map. As a solution i use a shiny app with a radio button for switching between state and community level and leaflet base Layer Groups to switch between visualisation of fatalities or severe injuries.In addition there is a checkbox to select different clusters of communities. For communities everything works fine, but for states it seems like only the last added layer in leaflet proxy is shown. When i switch to the fatalities of state level nothing is shown. If i change the order accidents with severe injuries for state level is not shown. I tried to seperate the leaflet proxy in two observe blocks, but nothing seems to work.

library(sf)
library(tidyverse)
library(leaflet)
library(shiny)
library(leaflet.extras)
library(ggplot2)
library(htmlwidgets)
library(dplyr)


readRDS(land, "stackoverflow_state.rds")
readRDS(communities, "stackoverflow_communities.rds")

pal_leaf_heavy= colorFactor(palette = c("red", "yellow", "green", "darkgreen"), 
                      levels = c(4, 3,2,1))

pal_leaf_fatal = colorFactor(palette=c("yellow", "green", "darkgreen"),
                             levels=c(3,2,1))


ui = fluidPage(
  sidebarLayout(position = "left",
                sidebarPanel(
                  checkboxGroupInput("regiostar_selection", "Regiostarklasse", 
                                     choices=c(51,52,53,54),
                                     selected=c(51,52,53,54),
                                     inline=TRUE),
                  radioButtons("level", "Ebene: ", choices=c("Gemeinde", "Bundesland"), inline=TRUE, selected="Gemeinde")
                ),
                mainPanel( width=12,
                             column(8, leafletOutput("map", height="85vh"))
                           )
                )
  )

server <- function(input, output, session){
  f_communities <- reactive({
    if(length(input$regiostar_selection) > 0){
      communities %>% filter(RegioStaRGem5 %in% input$regiostar_selection)
    }
    else{
      communities
    }
  })
  
  
  level_data <- reactive({
    switch(input$level,
           "Gemeinde" = f_communities(),
           "Bundesland" = land
    )
  })
  
  output$map=renderLeaflet({leaflet() %>% addTiles() %>% 
      addPolygons(data=communities, layerId =communities$AGS, col=pal_leaf_heavy(communities$heavy_rating), label=communities$GEN, group="Entwicklung Unfaelle mit Schwerstverletzten") %>%
      addPolygons(data=communities, col=pal_leaf_fatal(communities$fatal_rating), group="Entwicklung toedliche Unfaelle", label=communities$GEN,
                  layerId=communities$AGS) %>%
      addLegend(colors=c("darkgreen","lightgreen", "yellow", "red"), 
                labels = c("Zielwert für 2030 erreicht", "Jahresziel erreicht", "Zahlen sind gesunken seit 2019, aber Jahresziel nicht erreicht", "Zahlen seit 2019 nicht gesunken" ), 
                group="Legend Unfaelle mit Schwerstverletzten") %>%
      addLegend(colors=c("darkgreen", "lightgreen", "yellow"),
                labels=c("Vision Zero erreicht", "Zielwert für 2030 erreicht", "Ziel noch nicht erreicht"),
                group="Legend toedliche Unfaelle") %>%
      addLayersControl(baseGroups = c("Entwicklung Unfaelle mit Schwerstverletzten", "Entwicklung toedliche Unfaelle"),
                       overlayGroups = c("Legend Unfaelle mit Schwerstverletzten", "Legend toedliche Unfaelle")) %>%
      addSearchOSM(options=searchOptions(collapsed = FALSE, zoom = 9))
  })
  
  
  
  
  observe({
    leafletProxy("map", data=level_data()) %>% clearGroup(group="Entwicklung toedliche Unfaelle") %>%
      addPolygons(data=level_data(), col=pal_leaf_fatal(level_data()$fatal_rating), group="Entwicklung toedliche Unfaelle", label=level_data()$GEN,
                  layerId=level_data()$AGS) %>%
      clearGroup(group="Entwicklung Unfaelle mit Schwerstverletzten") %>%
      addPolygons(data=level_data(), layerId =level_data()$AGS, col=pal_leaf_heavy(level_data()$heavy_rating), label=level_data()$GEN, group="Entwicklung Unfaelle mit Schwerstverletzten")
    
    
  })
  
  
}

shinyApp(ui=ui,server=server)

1 Answer 1

0

The most simple and cleanest answer seems to avoid using baseLayerGroups in a shiny application. So i just use an additional radio button to switch between fatal accidents and accidents with severe injuries. In the leaflet proxy i use an ifelse statement that shows map of fatalities and severe injuries depending on the users input.

Not the answer you're looking for? Browse other questions tagged or ask your own question.