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

如何通过遍历DataFrame在Leaflet中添加图层控件实现标记过滤?

folium按DataFrame列值实现图层筛选的可行方案

原代码核心问题

  • 仅创建了单个FeatureGroup,未按Tipologia personaggio列的4个唯一值分别创建独立图层
  • 分组遍历逻辑和Marker添加逻辑完全割裂,Marker没有归属到对应分组的FeatureGroup下
  • 存在语法错误:Marker定义行有多余的"""符号,color变量未赋值定义
  • 未添加LayerControl控件,无法触发图层筛选功能

完整实现代码

import folium
from folium import FeatureGroup, LayerControl, MarkerCluster
import pandas as pd

# 1. 初始化基础地图
m = folium.Map(
    location=it_coords, 
    zoom_start=6,
    tiles='openstreetmap', 
    control_scale=True,
    prefer_canvas=True
)

# 2. 配置分组颜色映射,替换为你实际的4个唯一值和对应想要的颜色
color_map = {
    "唯一值1": "red",
    "唯一值2": "blue",
    "唯一值3": "green",
    "唯一值4": "orange"
}

# 3. 按Tipologia personaggio列分组,每个分组创建独立FeatureGroup图层
for grp_name, df_grp in df.groupby('Tipologia personaggio'):
    # 创建当前分组的FeatureGroup,名称为分组值,用于图层控件显示
    feature_group = FeatureGroup(name=grp_name)
    # 给当前分组创建独立的MarkerCluster,添加到当前FeatureGroup
    mc = MarkerCluster().add_to(feature_group)
    
    # 遍历当前分组的所有点位,添加Marker
    for _, row in df_grp.iterrows():
        # 自定义popup的html内容,按你的需求填充
        html = f"""
        <p>名称:{row.get('名称列', '')}</p>
        <p>地址:{row.get('地址列', '')}</p>
        """
        iframe = folium.IFrame(html=html, width=200, height=200)
        popup = folium.Popup(iframe, max_width=2650)
        
        # 按分组取对应颜色的图标
        folium.Marker(
            location=[row['Latitude'], row['Longitude']],
            popup=popup,
            icon=folium.Icon(color=color_map[grp_name], icon='info-sign')
        ).add_to(mc)
    
    # 把当前分组的FeatureGroup添加到地图
    feature_group.add_to(m)

# 4. 添加图层控件,开启筛选功能
LayerControl(collapsed=False).add_to(m)

# 保存或显示地图
m.save('map.html')

注意事项

  • 请提前替换color_map中的键为你Tipologia personaggio列实际的4个唯一值
  • popup的html内容可根据你DataFrame的实际字段自行调整

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 23:24:02