如何统计重复街道地址并正确使用Folium绘制结果?
问题分析与解决方案
咱们来拆解你遇到的两个folium使用问题:
1. folium.Marker(m) 报错的原因
folium.Marker 是用来创建单个点位标记的,它需要接收的是单个点的经纬度(比如 location=[37.09024, -95.712891] 这种格式),但你直接把包含所有点位的列表 m 传进去,它根本不知道该怎么处理一堆坐标,自然会报错。要批量加标记的话,得循环遍历每个点位来创建Marker。
2. HeatMap(m).add_to(m) 报错的原因
这里有两个核心问题:
- 变量名冲突:你把数据列表命名成了
m,但add_to()方法需要传入的是folium的Map对象,不是你的数据列表。 - 逻辑错误:HeatMap本身没问题(你的数据格式
[[lat, lon, count], ...]是符合要求的),但你把数据列表传给了add_to(),相当于让HeatMap添加到一堆数据里,这完全不符合folium的逻辑。
修正后的完整代码示例
先补全你漏掉的「创建基础地图」步骤,再分别处理HeatMap和Marker:
import pandas as pd import folium from folium.plugins import HeatMap # 你之前的预处理代码 df = pd.read_csv('C:\\Users\\ryans\\OneDrive\\Desktop\\lat_lon.csv') df['Count'] = df.groupby('Street')['Street'].transform('count') # 整理绘图数据,换个变量名避免冲突 point_data = df[['latitude', 'longitude', 'Count']].groupby(['latitude', 'longitude']).sum().reset_index().values.tolist() # 第一步:创建基础地图对象(这是你之前缺失的关键步骤) # 用数据的平均经纬度作为地图初始中心,适配你的数据范围 center_lat = df['latitude'].mean() center_lon = df['longitude'].mean() my_map = folium.Map(location=[center_lat, center_lon], zoom_start=10) # 第二步:添加热力图,把HeatMap添加到地图对象my_map里 HeatMap(point_data).add_to(my_map) # 第三步:批量添加标记,循环遍历每个点位创建Marker for lat, lon, count in point_data: folium.Marker( location=[lat, lon], popup=f"该坐标下地址数量: {int(count)}", # 点击标记显示计数 tooltip="点击查看详情" # 鼠标悬停提示 ).add_to(my_map) # 在Jupyter Notebook里直接显示地图 my_map # 或者保存为HTML文件 # my_map.save('street_count_map.html')
关键注意点
- 所有folium图层(Marker、HeatMap等)都必须添加到
folium.Map对象上,这是folium的核心逻辑,不能跳过创建地图的步骤。 - 批量创建Marker一定要循环遍历数据,因为Marker是单个点位的组件。
- 变量名尽量区分开(比如数据用
point_data,地图用my_map),避免因重名导致的逻辑混乱。
内容的提问来源于stack exchange,提问作者ASH
相关产品推荐
相关产品推荐

