Python Folium:基于分组图层控制实现标记集群组可见性管理
Folium标记集群+多层级图层控制解决方案
核心层级调整思路
正确的嵌套顺序应该是:MarkerClusterGroup → FeatureGroup(net1/net2) → SubGroup(a-f) → 标记。这样图层控制的显示/隐藏操作会直接触发集群的更新,同时满足父组(net1/net2)和子组(a-f)的独立控制需求。
完整代码示例
import folium from folium.plugins import MarkerCluster, SubGroup # 创建基础地图 m = folium.Map(location=[40.7128, -74.0060], zoom_start=10) # 1. 创建顶级标记集群容器 marker_cluster = MarkerCluster(name="所有标记集群") marker_cluster.add_to(m) # 2. 创建一级FeatureGroup(net1、net2),添加到集群容器 net1 = folium.FeatureGroup(name="net1", show=True) net1.add_to(marker_cluster) net2 = folium.FeatureGroup(name="net2", show=True) net2.add_to(marker_cluster) # 3. 创建二级SubGroup,分别添加到对应FeatureGroup # net1下的子组 sub_a = SubGroup(net1, name="子组a", show=True) sub_a.add_to(m) # 注意:SubGroup需要直接添加到地图实例 sub_b = SubGroup(net1, name="子组b", show=True) sub_b.add_to(m) sub_c = SubGroup(net1, name="子组c", show=True) sub_c.add_to(m) # net2下的子组 sub_d = SubGroup(net2, name="子组d", show=True) sub_d.add_to(m) sub_e = SubGroup(net2, name="子组e", show=True) sub_e.add_to(m) sub_f = SubGroup(net2, name="子组f", show=True) sub_f.add_to(m) # 4. 给每个子组添加带属性的标记 # 子组a的标记(红色图标) folium.Marker( location=[40.7306, -73.9352], popup="子组a标记1", icon=folium.Icon(color="red") ).add_to(sub_a) folium.Marker( location=[40.7484, -73.9857], popup="子组a标记2", icon=folium.Icon(color="red") ).add_to(sub_a) # 子组b的标记(蓝色图标) folium.Marker( location=[40.6782, -73.9442], popup="子组b标记1", icon=folium.Icon(color="blue") ).add_to(sub_b) # 其他子组标记可按此格式添加... # 5. 添加图层控制器 folium.LayerControl(collapsed=False).add_to(m) # 保存地图 m.save("cluster_map.html")
关键注意事项
- SubGroup的添加方式:SubGroup必须直接添加到地图实例(
add_to(m)),同时关联到父FeatureGroup(SubGroup(net1, name="子组a")),这样才能在图层控制里同时显示父组和子组的选项。 - 集群容器的位置:MarkerCluster作为所有可切换组的父容器,确保任何子组的显示/隐藏都会触发集群的重新计算。
- 默认显示状态:通过
show=True设置所有组默认可见,符合需求。
效果验证
- 取消勾选
net1时,其下所有子组(a、b、c)的标记会隐藏,集群数量自动更新。 - 单独取消某一个子组(如子组a),仅该子组的标记隐藏,其他子组和net2不受影响。
内容的提问来源于stack exchange,提问作者Jordan Schnell
相关产品推荐
相关产品推荐

