如何通过遍历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
相关产品推荐
相关产品推荐

