Shiny Leaflet 输入滑块中的 Chloropleth 地图着色基于大空间多边形数据框列

问题描述 投票:0回答:1

我正在尝试根据列中列出的年份创建带有滑块输入的闪亮传单地图。

Large SpatialPolygonsDataFrame
的数据组件如下所示,其中邮政编码位于侧面,年份作为列名称: enter image description here

我想使用

P2015
P2020
列创建一个滑块。

当选择不同的输入年份时,如何让地图改变颜色?

我不确定我是否理解如何正确使用

reactive
功能。

这是我目前拥有的代码:

ui <- fillPage(
  
  titlePanel("Title"),
  
  tags$style(type = "text/css", "html, body {width:100%; height:100%}"),
  
  leafletOutput("mymap", width = "100%", height = "100%"),
  
  absolutePanel(top = 10, right = 10,
                sliderInput("year", "Year", min = 2015, max = 2020,
                            value = 2015, step = 1)
  )
)

server <- function(input, output, session) {

  LargeSpatialPDF <- rgdal::readOGR("~/blah.geojson")

  output$mymap <- renderLeaflet({
    leaflet(LargeSpatialPDF ) %>% 
      addMapPane(name="polygons", zIndex = 410) %>% 
      setView( lat=-32.30, lng=116.5 , zoom=9.45) %>%
      addProviderTiles(providers$Esri.WorldGrayCanvas) %>% 
      addProviderTiles(providers$Stamen.TonerLabels, 
                       options = leafletOptions(pane = "maplabels"),
                       group = "map labels")
  })

#not sure how to use this reactive statement here?
  layer <- reactive({LargeSpatialPDF})

observeEvent({input$year}, {
    year_column <- paste0('P',input$year)
    data=layer()[year_column]
  
    bins <- c(0,1,5, 10,15,20,25,30,Inf)
    pal <- colorBin(c("#fff7cf",
                      "#f7e2af",
                      "#f2cc91",
                      "#eeb576",
                      "#eb9c60",
                      "#e7824e",
                      "#e36543",
                      "#dd433d",
                      "#d6003d"), domain = LargeSpatialPDF@data[year_column], bins = bins)
    
    leafletProxy("mymap", data = data) %>%
      addPolygons(
        fillColor = ~pal(x),
        weight = 1,
        opacity = 1,
        color = "white",
        dashArray = "3",
        fillOpacity = 0.7,
        highlight = highlightOptions(
          weight = 2,
          color = "white",
          dashArray = "",
          fillOpacity = 1,
          bringToFront = TRUE),
        label = labels,
        labelOptions = labelOptions(
          style = list("font-weight" = "normal", padding = "3px 8px"),
          textsize = "15px",
          direction = "auto"))
      
  })
  
}

shinyApp(ui = ui, server = server)

r shiny r-leaflet
1个回答
1
投票

reactive
不是必需的,因为
LargeSpatialPDF
是静态的。
我认为你的代码的问题是:

  1. x
    从哪里来
    fillColor = ~pal(x)
    ??
  2. 不是
    df["colname"]
    而是
    df[["colname"]]
    给出一个向量。
  3. clearShapes()
    是必须的。

以下是我的例子:

library(shiny)
library(leaflet)
library(sp)

ui <- fillPage(

    titlePanel("Title"),
    
    leafletOutput("mymap", width = "100%", height = "100%"),
    
    absolutePanel(top = 10, right = 10,
                  sliderInput("year", "Year", min = 1, max = 3,
                              value = 1, step = 1)
    )
)


server <- function(input, output, session) {
    # sample_data
    dsn <- system.file("vectors/ps_cant_31.MIF", package = "rgdal")[1]
    LargeSpatialPDF <- rgdal::readOGR(dsn=dsn, layer="ps_cant_31", stringsAsFactors=FALSE)
    set.seed(1); LargeSpatialPDF@data <- cbind(LargeSpatialPDF@data, 
                                               data.frame(P1 = sample(44), P2 = sample(44), P3 = sample(44)))
    
    output$mymap <- renderLeaflet({
        leaflet() %>% 
            addMapPane(name="polygons", zIndex = 410) %>% 
            setView( lat=43.5, lng=1.5 , zoom=8 ) %>%
            addProviderTiles(providers$Esri.WorldGrayCanvas) %>% 
            addProviderTiles(providers$Stamen.TonerLabels, 
                             options = leafletOptions(pane = "maplabels"),
                             group = "map labels")
    })
    
    observeEvent({input$year}, {
        year_column <- paste0('P',input$year)
        
        bins <- seq(0, 45, length = 9)
        pal <- colorBin(c("#fff7cf",
                          "#f7e2af",
                          "#f2cc91",
                          "#eeb576",
                          "#eb9c60",
                          "#e7824e",
                          "#e36543",
                          "#dd433d",
                          "#d6003d"), domain = LargeSpatialPDF@data[[year_column]], bins = bins)
        
        leafletProxy("mymap") %>%
            clearShapes() %>%   # important
            addPolygons(
                data = LargeSpatialPDF,
                fillColor = ~ pal(LargeSpatialPDF@data[[year_column]]),   # use values of the year
                options = pathOptions(pane = "polygons"))  # my guess
    })
}

shinyApp(ui = ui, server = server)
© www.soinside.com 2019 - 2024. All rights reserved.