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

如何创建带滑块的Shiny应用,在已生成的Leaflet地图上查看时序数据

实现方法

首先要提前确保你的AQ_df数据框中的date列已经转换为R识别的日期/时间格式(如Date或POSIXct类型),如果是字符串可通过lubridate包的相关函数转换,比如AQ_df$date <- ymd_hms(AQ_df$date)(根据你的实际日期格式调整函数)。

整体Shiny应用的代码结构如下:

# 提前加载所需包
library(shiny)
library(leaflet)
library(dplyr)
library(lubridate) # 处理日期用,可选

# 提前定义你的调色板pal,和你原有逻辑保持一致
# 示例:pal <- colorNumeric(palette = "YlOrRd", domain = AQ_df$severity) 按你原有定义修改

# 定义UI界面
ui <- fluidPage(
  # 日期滑块输入
  sliderInput(
    inputId = "date_select",
    label = "选择日期范围",
    min = min(AQ_df$date, na.rm = T),
    max = max(AQ_df$date, na.rm = T),
    value = range(AQ_df$date, na.rm = T), # 默认选中全部日期范围
    timeFormat = "%Y-%m-%d", # 显示的日期格式,带时间可添加%H:%M等格式符
    step = 86400 # 步长为1天(单位为秒),小时级数据可改为3600
  ),
  # Leaflet地图输出占位
  leafletOutput(outputId = "aq_map", width = "100%", height = "800px")
)

# 定义服务端逻辑
server <- function(input, output) {
  # 初始渲染底图,仅加载一次,无需重复渲染
  output$aq_map <- renderLeaflet({
    leaflet(width="100%") %>%
      setView(lng=-123.2504, lat= 49.2652, zoom=15) %>%
      addProviderTiles("Esri.WorldStreetMap")
  })

  # 监听滑块变化,动态更新地图点位
  observeEvent(input$date_select, {
    # 按选中的日期范围筛选数据
    filtered_df <- AQ_df %>%
      filter(date >= input$date_select[1], date <= input$date_select[2])

    # 用leafletProxy更新已有地图,避免重复渲染整个底图
    leafletProxy("aq_map", data = filtered_df) %>%
      clearShapes() %>% # 清除之前的点位
      clearControls() %>% # 清除之前的图例
      addCircles(
        lng = ~Longitude,
        lat = ~Latitude,
        radius = 30,
        color = 'black',
        fillColor = ~pal(severity),
        fillOpacity = 1,
        weight=1,
        popup = ~paste0("<strong>ID: </strong>", RAMP_label, "</br>",
                       "<strong>位置: </strong>", RAMP_desc, "</br>",
                       "<strong>PM2.5 (ug/m3): </strong>", PM_RAMP, "</br>",
                       "<strong>CO (ppb): </strong>", CO_RAMP, "</br>",
                       "<strong>NO (ppb): </strong>", NO_RAMP, "</br>",
                       "<strong>NO2 (ppb): </strong>", NO2_RAMP, "</br>",
                       "<strong>O3 (ppb): </strong>", O3_RAMP, "</br>",
                       "<strong>日期: </strong>", date)
      ) %>%
      addLegend(
        position = c("topright"),
        pal=pal,
        values=~severity,
        title="<strong>PM2.5 (ug/m3)</strong>"
      )
  })
}

# 启动Shiny应用
shinyApp(ui = ui, server = server)
注意事项
  • 如果只需要选择单个日期而非范围,可将sliderInput的value参数设置为单个日期值,筛选逻辑也对应调整为日期等于选中值即可
  • 注意popup的写法要改成公式式~引用数据框列,不要直接写AQ_df$xxx,否则会一直调用全量数据而非筛选后的数据集
  • 滑块的timeFormat和step参数可根据你的数据时间粒度灵活调整

内容的提问来源于stack exchange,提问作者James

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 12:48:04