Municiplaity Map with Leaflet

Boa noite pessoal, estou assistindo as lives que estais fazendo em youtube, parabéns, eu sou cientista de dados pela UFBA (Salvador Bahia) e trabalho com R faz dois anos, na criação de dashboard interativo (Shiny) e tenho sempre o mesmo problema. Ao carregar os shapes files dos 5570 municípios do Brasil demora muito. Na hora de plotar qualquer taixa dos municípios o computador demora minutos! Qual é a solução que vocês pode-me aconselhar??
Eu usei esse código para carregar o shape file:

map_mun = brmap::brmap_municipio_simples
map_mun = map_mun %>% mutate(municipio_cod = as.character(municipio_cod) )
simplified_shape_mun <- ms_simplify(map_mun,keep = 0.01)

Alguém sabe se o mapview è mais rápido??

Obrigado desde já
Alberto Sironi

Olá @sirox84, obrigado pela pergunta e desculpe na demora da resposta.

Eu costumo utilizar a função sf::st_simplify(), do pacote {sf}. A função ms_simplify() também me parece uma boa saída.

Minha sugestão seria: ao invés de rodar essas funções de simplificação toda vez dentro do shiny app, guarde o resultado dela em um arquivo .rds, com readr::write_rds(). No shiny, você pega as informações desse arquivo .rds, já simplificado. Isso vai economizar um bom tempo na aplicação.

Ola jtrecenti,

Obrigado pela sugestão, eu rodo essa função só uma vez na hora de carregar os banco de dados, depois dentro do app eu chamo sempre o objeto simplified_shape_mun que é o meu dataframe já simplificado.

Agora que resolvi o problema da simplificação, tenho um segundo problema, ou seja, pra não carregar os mapas cada vez que aperto o botão confirmar dos meus inputs de entrada eu vi que existe o LeafletProxy.

Tentei implementá-lo mas não consigo que funcione.
o meu código é:

quintiles = unique(quantile(df_mapa$Tx_weight, probs = (0:5)/5,na.rm = T)) 
  pal_mortalidade <- colorBin("YlOrRd", domain = df_mapa$Tx_weight, bins = quintiles)

  labels <- sprintf(
    "<strong>%s</strong><br/>%g Taxa  </sup>",
    df_mapa$UF,df_mapa$Tx_weight) %>% lapply(htmltools::HTML)
  
  mortalidade  <- leaflet(df_mapa, options = leafletOptions(minZoom = 3,zoomSnap = 0.1,zoomDelta = 
    0.1) ) %>%  addTiles() %>% addPolygons(
    fillColor = ~pal_mortalidade(df_mapa$Tx_weight),
    weight = 0.5,
    opacity = 1,
    color = "white",
    dashArray = "3",
    fillOpacity = 0.7,
    label = labels,
    layerId = ~UF,
    highlightOptions = highlightOptions(color = "black", weight = 2,
                                        bringToFront = TRUE)) %>%
    addResetMapButton() %>% addLegend(pal = pal_mortalidade, values = ~variavel, opacity = 0.7, 
    title = NULL,position = "bottomright")%>%
    onRender(
      "function(el, x) {
                L.easyPrint({
                  sizeModes: ['Current', 'A4Landscape', 'A4Portrait'],
                  filename: 'mymap',
                  exportOnly: true,
                  hideControlContainer: false
                }).addTo(this);
                }"
    )

    output$plot_mapa_mortalidade <- renderLeaflet({
        mortalidade
    })

observeEvent(mortalidade, {
  leafletProxy("plot_mapa_mortalidade", data = mortalidade) %>%
    setShapeStyle(layerId = ~estado_cod, fillColor=~pal_mortalidade$Tx_weight, color = white) 
})

Obrigado
Alberto Sironi

Pelo que entendo do leafletProxy(), ele modifica um mapa de acordo com um evento. No seu caso, o objeto que está no primeiro parâmetro de seu observeEvent() deve ser um evento. Por exemplo, um botão que foi clicado. No entanto, parece que mortalidade é o seu mapa.

Segue exemplo minimal:

library(leaflet)
library(shiny)

ui <- fluidPage(
  # evento
  actionButton("mudar", "Adicionar 10 pontos!"),
  leafletOutput("mapa")
)

server <- function(input, output, session) {
  
  base <- reactive({
    input$mudar
    dplyr::sample_n(abjData::dados_aj, 10)
  })
  
  output$mapa <- renderLeaflet({
    # parte estática do mapa
    leaflet() %>% 
      addTiles() %>% 
      setView(-50, -18, 4)
  })
  
  observeEvent(input$mudar, {
    # parte dinâmica do mapa
    leafletProxy("mapa", data = base()) %>%
      addMarkers(lng = ~long, lat = ~lat)
    
  })
}

shinyApp(ui, server)

Obrigado pela dica, vou tentar aqui agora.