Folium绘制重复经纬度点位时弹窗仅显示末行数据如何解决
问题场景
用folium绘制点位地图时,数据源中同一地理坐标点位对应多条关联业务记录(同个仓库对应多个存储产品),逐行遍历绘制标记会导致同坐标位置叠加多个标记,最终弹窗仅能展示最后一条记录的信息,无法完整展示点位下所有关联数据。
示例测试数据集:
import pandas as pd import folium d = {'Location code': [132, 132, 132, 556, 556, 430], 'Product code': [1072567, 1309006, 1400940, 7776654, 7776654, 7551230], 'Days of Supply': [50, 22, 24, 77, 100, 32], 'Latitude': [42.97046, 42.97046, 42.97046, 41.470183, 41.470183, 38.864575], 'Longitude': [80, 80 , 80, 72, 72, 60]} map_df = pd.DataFrame(data=d) # 初始化地图,中心点取所有坐标均值 m = folium.Map(location=[map_df['Latitude'].mean(), map_df['Longitude'].mean()], zoom_start=5) # 示例颜色选择函数,可根据业务规则调整 def color_selector(dos_value): if dos_value < 30: return 'red' elif dos_value < 60: return 'orange' else: return 'green'
原有实现存在3个明显问题:
- 分组维度错误,按
Location code+Product code分组会把同个位置的不同产品拆成独立分组,最终在同坐标生成多个重叠标记 - 弹窗内容仅取单行数据,没有聚合同位置下的所有关联记录
- 代码中
dos变量未定义,直接调用会触发报错
修复方案
核心逻辑:按唯一地理点位分组,每个点位仅生成1个标记,提前聚合组内所有业务数据拼接为结构化HTML内容放入弹窗,不需要额外做DataFrame扁平化处理。
实现步骤:
- 分组键选择唯一标识点位的字段:
Location code、Latitude、Longitude,确保每个分组对应一个实际地理点位 - 遍历分组时,逐行拼接组内所有产品、供应天数的记录,生成带表格的HTML内容,信息展示更清晰
- 点位颜色可根据点位的聚合指标(如平均供应天数、最低供应天数)计算,避免单条数据的偏差
完整实现代码:
# 按唯一地理点位分组 for (loc_code, lat, lon), df_grp in map_df.groupby(['Location code', 'Latitude', 'Longitude']): # 拼接弹窗HTML内容:先加点位基础信息,再加产品明细表格 popup_html = f""" <h4>仓库编号: {loc_code}</h4> <table border="1" cellpadding="4" cellspacing="0"> <tr> <th>产品编码</th> <th>供应天数</th> </tr> """ # 遍历当前点位下所有产品记录,拼接表格行 for _, row in df_grp.iterrows(): popup_html += f""" <tr> <td>{row['Product code']}</td> <td>{row['Days of Supply']}</td> </tr> """ popup_html += "</table>" # 计算点位聚合指标选颜色,这里取点位最低供应天数判断风险 min_dos = df_grp['Days of Supply'].min() marker_color = color_selector(min_dos) # 生成弹窗和标记,每个点位仅添加1次 popup = folium.Popup(folium.Html(popup_html, script=True), max_width=500) folium.Marker( location=[lat, lon], popup=popup, icon=folium.Icon(color=marker_color, icon='home', prefix='fa') ).add_to(m) # 保存地图 m.save('site_supply_map.html')
实现效果:
- 同个坐标位置不会出现重叠标记,点击标记即可弹窗查看该点位下所有关联的产品、供应天数字段
- 不需要提前对DataFrame做扁平化处理,分组时直接聚合数据逻辑更清晰,后续新增字段只需要修改HTML拼接部分即可
- 颜色规则基于点位整体指标设置,更符合业务监控的实际需求
注:如果同个点位记录量极大(单点位超过100条关联记录),可以在弹窗中加滚动条样式,避免弹窗过高超出可视区域,只需给表格加
style="max-height:300px;overflow-y:auto;display:block;"的样式即可。
内容的提问来源于stack exchange,提问作者Ty Swenson
相关产品推荐
相关产品推荐

