Shiny结合Leaflet绘制带时间滑块的月均温多边形地图
美国月均温Shiny Leaflet可视化实现问题
现有代码核心问题
- 字段逻辑不匹配:滑块取值范围取自
values字段,但数据筛选逻辑用Valid_Seas做范围判断,直接导致筛选结果异常 - 图层类型错误:原代码使用点标记函数
addMarkers渲染,要求数据包含独立经纬度、id字段,但实际数据为面数据,几何信息存储在Geometry列,需使用多边形渲染函数 - 初始定位参数错误:Leaflet的
fitBounds参数顺序为「西南角经度、西南角纬度、东北角经度、东北角纬度」,原代码经度顺序颠倒,会导致初始视图定位到完全错误的区域 - 缺失填色逻辑:未配置基于
Prob字段的颜色映射规则、填充参数与对应图例,无法实现气温分布的色阶展示
修正后可运行代码
library(shiny) library(leaflet) library(dplyr) library(sf) # 前置数据读取:需确保tempyear21为sf格式空间对象,Geometry为有效几何列 # 示例读取逻辑:tempyear21 <- st_read("你的气温数据存储路径") # 配置气温色阶,可根据实际数据范围、展示需求调整色板 temp_pal <- colorNumeric(palette = "RdYlBu", reverse = TRUE, domain = tempyear21$Prob) ui <- bootstrapPage( tags$style(type = "text/css", "html, body {width:100%;height:100%}"), leafletOutput("map", width = "100%", height = "100%"), absolutePanel(top = 10, right = 10, style="z-index:500;", tags$h3("2021年月平均气温"), # 若需切换为Valid_Seas字段筛选,将下方所有values替换为Valid_Seas即可 sliderInput("periode", "选择月份", min(tempyear21$values), max(tempyear21$values), value = min(tempyear21$values), # 单月选择模式,需范围选择可改回range取值 step = 1, sep = "" ) ) ) server <- function(input, output, session) { # 响应式筛选对应时间维度数据 reactive_data_chrono <- reactive({ tempyear21 %>% filter(values == input$periode) # 单月筛选逻辑,范围筛选改回>=、<=区间判断即可 }) # 静态底图初始化 output$map <- renderLeaflet({ leaflet() %>% addTiles() %>% # 修正边界坐标顺序 fitBounds(-166.99, 24.91, -49.57, 68.00) %>% # 底图加载时统一添加图例,避免滑块拖动时重复重绘 addLegend(pal = temp_pal, values = tempyear21$Prob, title = "月均温", position = "bottomright") }) # 响应式渲染气温多边形图层 observe({ req(reactive_data_chrono()) leafletProxy("map", data = reactive_data_chrono()) %>% clearShapes() %>% addPolygons( fillColor = ~temp_pal(Prob), # 按Prob字段值映射填充色 fillOpacity = 0.7, color = "#333333", weight = 1, popup = ~paste0("月份: ", values, "<br>均温: ", round(Prob,1)) # 可选点击弹窗展示数值 ) }) } shinyApp(ui, server)
自定义调整说明
- 若需使用
Valid_Seas字段做时间筛选,将代码中滑块配置、筛选逻辑对应的values字段全部替换为Valid_Seas即可 - 若需支持月份范围选择而非单月切换,将滑块
value参数改回range(tempyear21$values),筛选逻辑改回values >= input$periode[1] & values <= input$periode[2]即可 - 填色规则可按需调整:比如用
colorBin实现分档填色、更换palette参数的色值匹配气温展示习惯
内容的提问来源于stack exchange,提问作者Nevin
相关产品推荐
相关产品推荐

