You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 14:42:18