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

如何在R的Leaflet中生成沿指定路径分布的热力图?

问题:如何在R Shiny的Leaflet中实现沿路径分布的热力图?

我有一个包含路径坐标的GeoJSON文件,以及一份包含utm_lat、utm_lng、passengers字段的CSV数据文件。目前我在R Shiny应用中使用Leaflet生成了普通热力图,但希望生成沿路径分布的热力图(参考目标示例图)。请问该如何实现?是否需要额外的数据文件?

当前部分代码:

heatway1 <- data.frame(heatway1$utm_lng, heatway1$utm_lat, heatway1$passengers)
colnames(heatway1) <- c("lng", "lat", "value")
heatway2 <- data.frame(heatway2$utm_lng, heatway2$utm_lat, heatway2$passengers)
colnames(heatway2) <- c("lng", "lat", "value")

map <- leaflet(filtered_data()) %>%
      addTiles() %>%
      setView(lng = mean(filtered_data()$utm_lng), 
              lat = mean(filtered_data()$utm_lat), 
              zoom = 13)
    
map <- map %>%
      addHeatmap(data = heatway1, intensity = ~value, blur = 20, max = 20, radius = 25, group = "way1")
    
map <- map %>%
      addHeatmap(data = heatway2, intensity = ~value, blur = 20, max = 20, radius = 25, group = "way2")
    
map <- map %>%
      addLegend(
        position = "bottomleft",
        pal = pal,
        values = ~passengers,
        title = "Passengers",
        opacity = 1
      )

map <- map %>% addLayersControl(overlayGroups = c("way1", "way2"), options = layersControlOptions(collapsed = FALSE)) %>%
      addGeodesicPolylines(data = geojsonroutedata, color = "#03F", opacity = 0.5) %>%
      addResetMapButton() %>% addSearchOSM() %>% addScaleBar(position = "bottomleft") # %>% addFullscreenControl()

解决方案

不需要额外的数据文件,利用现有GeoJSON和CSV即可实现,核心是将乘客数据绑定到路径上,再用渐变线条或专用路径热力组件呈现:

1. 数据预处理:关联路径与乘客数据

首先要把CSV中的乘客数据匹配到GeoJSON的路径节点或线段上,确保坐标系一致(若不一致用st_transform转换):

library(sf)
library(dplyr)

# 将CSV转为sf空间对象(假设GeoJSON是WGS84坐标系,若为UTM需调整crs参数)
heatway1_sf <- st_as_sf(heatway1, coords = c("lng", "lat"), crs = 4326)
heatway2_sf <- st_as_sf(heatway2, coords = c("lng", "lat"), crs = 4326)

# 将乘客数据关联到最近的路径线段
path_way1 <- geojsonroutedata %>%
  st_join(heatway1_sf, join = st_nearest_feature) %>%
  group_by(geometry) %>%
  mutate(total_pass = sum(value, na.rm = TRUE))

path_way2 <- geojsonroutedata %>%
  st_join(heatway2_sf, join = st_nearest_feature) %>%
  group_by(geometry) %>%
  mutate(total_pass = sum(value, na.rm = TRUE))

2. 实现沿路径的热力效果

有两种常用方式:

方式一:用渐变线条模拟(原生Leaflet)

通过线条颜色和宽度的渐变来体现乘客数量的分布,替代普通热力图:

# 定义颜色映射
pal <- colorNumeric(palette = "YlOrRd", domain = c(path_way1$total_pass, path_way2$total_pass))

# 重构地图代码,替换addHeatmap为addPolylines
map <- leaflet(filtered_data()) %>%
  addTiles() %>%
  setView(lng = mean(filtered_data()$utm_lng), lat = mean(filtered_data()$utm_lat), zoom = 13) %>%
  # 路径1的渐变线条
  addPolylines(data = path_way1,
               color = ~pal(total_pass),
               weight = ~sqrt(total_pass)*4, # 乘客越多线越粗
               opacity = 0.8,
               group = "way1") %>%
  # 路径2的渐变线条
  addPolylines(data = path_way2,
               color = ~pal(total_pass),
               weight = ~sqrt(total_pass)*4,
               opacity = 0.8,
               group = "way2") %>%
  addLegend(position = "bottomleft", pal = pal, values = ~total_pass, title = "Passengers", opacity = 1) %>%
  addLayersControl(overlayGroups = c("way1", "way2"), options = layersControlOptions(collapsed = FALSE)) %>%
  addResetMapButton() %>% addSearchOSM() %>% addScaleBar(position = "bottomleft")

方式二:用专用路径热力组件(leaflet.extras2包)

leaflet.extras2提供了addHeatmapLines函数,直接生成沿路径的热力效果:

install.packages("leaflet.extras2")
library(leaflet.extras2)

# 移除原有普通热力图,添加路径热力
map <- leaflet(filtered_data()) %>%
  addTiles() %>%
  setView(lng = mean(filtered_data()$utm_lng), lat = mean(filtered_data()$utm_lat), zoom = 13) %>%
  addHeatmapLines(data = heatway1,
                  lng = ~lng, lat = ~lat,
                  intensity = ~value,
                  blur = 12, radius = 18,
                  group = "way1") %>%
  addHeatmapLines(data = heatway2,
                  lng = ~lng, lat = ~lat,
                  intensity = ~value,
                  blur = 12, radius = 18,
                  group = "way2") %>%
  addLegend(position = "bottomleft", pal = pal, values = ~passengers, title = "Passengers", opacity = 1) %>%
  addLayersControl(overlayGroups = c("way1", "way2"), options = layersControlOptions(collapsed = FALSE)) %>%
  addResetMapButton() %>% addSearchOSM() %>% addScaleBar(position = "bottomleft")

3. 优化建议

  • 如果CSV数据是离散采样点,可使用st_interpolate_aw对乘客数进行空间插值,让路径上的热力分布更平滑。
  • 确保所有空间数据的坐标系统一,避免匹配或渲染错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 04:35:21