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

Folium HeatMapWithTime绘制不同半径点时序热力图异常问题

问题背景

需求为使用Folium绘制时序动态热力图时,为每个热力点配置独立的半径值。
初始实现代码如下:

from folium import plugins

map_hooray = folium.Map(location=[-23.5506507, -46.6333824],
                    zoom_start = 10) 

# 字段类型转换
df_acc['LAT'] = df_acc['LAT'].astype(float)
df_acc['LONG'] = df_acc['LONG'].astype(float)
df_acc['RADIUS'] = df_acc['RADIUS'].astype(int)

heat_df = df_acc[['LAT', 'LONG', 'RADIUS']]

# 构造时间权重字段
heat_df['Weight'] = df_acc['TEMPO'].astype(float)
heat_df = heat_df.dropna(axis=0, subset=['LAT','LONG', 'Weight'])

# 构造时序点位数据、逐点半径数据
heat_data = [[[row['LAT'],row['LONG']] for index, row in heat_df[heat_df['Weight'] == i].iterrows()] for i in range(0,40)]
heat_radius = [[[row['RADIUS']] for index, row in heat_df[heat_df['Weight'] == i].iterrows()] for i in range(0,40)]
# 加载时序热力层
hm = plugins.HeatMapWithTime(heat_data,radius=heat_radius,auto_play=True,max_opacity=0.8)
hm.add_to(map_hooray)
map_hooray

运行代码后地图仅加载底图,无任何热力点渲染:
异常运行效果
移除radius=heat_radius参数后,热力点可正常绘制,但所有点半径完全一致:
统一半径正常运行效果

核心结论

folium.plugins.HeatMapWithTime 原生不支持逐点设置独立半径。
查看组件参数定义和前端渲染逻辑可知,radius参数仅支持两类合法输入:

  • 单个数值:全局统一半径,对所有时间帧、所有点位生效
  • 一维数组:长度和时间帧总数一致,为每个时间帧配置一个统一半径,同一帧内所有点位半径相同
    传入和点位结构对齐的多层嵌套半径数组,会导致前端渲染逻辑类型校验失败,直接中断热力层渲染,因此只显示底图。
替代实现方案

方案1:半径折算为权重,复用原生热力组件

热力图点位的权重值会直接影响渲染时的扩散范围,可将需要设置的半径值做归一化处理后作为点位权重传入,配合全局基础半径参数,模拟逐点半径差异的视觉效果:

# 提前计算半径最大值做归一化
radius_max = heat_df['RADIUS'].max()
# 构造带权重的点位数据,结构为[纬度, 经度, 归一化半径权重]
heat_data = [
    [
        [row['LAT'], row['LONG'], row['RADIUS']/radius_max] 
        for _, row in heat_df[heat_df['Weight'] == i].iterrows()
    ] 
    for i in range(0,40)
]

hm = plugins.HeatMapWithTime(
    heat_data,
    radius=12, # 配置全局基础半径
    blur=8, # 调整模糊度匹配扩散效果
    max_val=1.0,
    auto_play=True,
    max_opacity=0.8
)
hm.add_to(map_hooray)

该方案实现成本最低,无需修改依赖或额外开发,适合仅需视觉上区分点位大小、对半径精度要求不高的场景。

方案2:自定义时序图层,逐点配置CircleMarker

如果对半径精度要求高,需要严格按照指定值渲染点位大小,可放弃HeatMapWithTime,自行实现时序图层切换逻辑:

  • 按时间帧分组数据,为每个时间帧创建独立的FeatureGroup
  • 帧内每个点位根据自身RADIUS值生成CircleMarker,精确配置半径参数
  • 借助plugins.TimestampedGeoJson或自定义时间轴控件,控制不同时间帧图层的显隐,实现动态播放效果
    该方案灵活性最高,可同时自定义点位颜色、透明度、弹窗等所有属性,缺点是代码量相对更大。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 21:09:33