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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 12:27:24