如何在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
相关产品推荐
相关产品推荐

