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

如何在folium中将热力图置于Marker图层之上?

解决folium中热力图被标记图层覆盖的问题

在folium里,图层的显示逻辑是后添加的图层会叠加在之前添加的图层上方。你当前的代码先添加了公交站点的CircleMarker,再加热力图,最后添加营地的Marker,导致标记图层都压在热力图上面,遮挡了部分内容。

要让热力图置于所有标记图层之上,最直接的方法就是调整图层添加顺序:先把所有标记(CircleMarker和Marker)都添加到地图,最后再添加热力图。

修改后的代码如下:

# 初始化地图
hm = folium.Map(location=[32.8801,-117.2340], zoom_start=10)

# 先添加公交站点标记
for i,r in bus_stops.iterrows():
    folium.CircleMarker([r['Y'], r['X']],
                        radius = 1,
                        color = 'gray',
                        opacity = 0.6
          ).add_to(hm)

# 再添加营地标记
for i in range(0,len(encamp_df)):
    folium.Marker([encamp_df['lat'][i], encamp_df['lon'][i]]).add_to(hm)

# 最后添加热力图,此时热力图会显示在所有标记上层
HeatMap(
    list(zip(geo_df.lat.values, geo_df.lon.values)),
    min_opacity=0.2,
    radius=17, 
    blur=15, 
    max_zoom=1,
).add_to(hm)

hm

如果需要更灵活地管理图层(比如允许用户手动切换显示状态),可以用folium.FeatureGroup对元素分组,再控制分组的添加顺序:

hm = folium.Map(location=[32.8801,-117.2340], zoom_start=10)

# 创建标记分组,统一管理所有标记元素
marker_group = folium.FeatureGroup(name="标记图层")
# 添加公交站点到分组
for i,r in bus_stops.iterrows():
    folium.CircleMarker([r['Y'], r['X']],
                        radius = 1,
                        color = 'gray',
                        opacity = 0.6
          ).add_to(marker_group)
# 添加营地标记到分组
for i in range(0,len(encamp_df)):
    folium.Marker([encamp_df['lat'][i], encamp_df['lon'][i]]).add_to(marker_group)
# 将标记分组添加到地图
marker_group.add_to(hm)

# 创建热力图分组并添加到地图(后添加,所以显示在标记上层)
heat_group = folium.FeatureGroup(name="热力图")
HeatMap(
    list(zip(geo_df.lat.values, geo_df.lon.values)),
    min_opacity=0.2,
    radius=17, 
    blur=15, 
    max_zoom=1,
).add_to(heat_group)
heat_group.add_to(hm)

# 可选:添加图层控制器,方便切换显示不同图层
folium.LayerControl().add_to(hm)

hm

调整后热力图就会显示在所有标记上方,不会被遮挡。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 00:30:57