python 地图热力图
时间: 2025-05-16 11:40:16 浏览: 17
### 如何用Python生成地图热力图
#### 使用的库推荐
为了生成地图热力图,通常会结合多个库完成任务。以下是几个常用库及其功能说明:
- **Matplotlib**: 提供基础绘图能力,适合简单的可视化需求[^2]。
- **Seaborn**: 构建于 Matplotlib 之上,提供了更高级别的 API 来简化复杂图表的绘制过程。
- **Folium**: 是一个用于地理可视化的 Python 库,支持将数据叠加到交互式的 Leaflet 地图上[^1]。
- **Baidu Map API (百度地图 API)**: 如果需要更高精度的地图服务以及热力图效果,可以借助百度地图提供的 API 功能[^4]。
对于初学者来说,如果只是想快速实现热力图的效果而不涉及复杂的地理位置转换操作,则可以直接利用 Folium 或者 Seaborn 完成基本的任务;但如果涉及到具体的城市名称转为经纬度坐标或者更加精细的操作,则可能需要用到 Baidu Map API 的帮助[^3]。
#### 示例代码
下面分别给出基于不同工具集的例子代码片段。
##### 方法一:使用 `Folium` 创建简单热力图
此方法适用于已经拥有经纬度坐标的场景下直接渲染热度分布情况。
```python
import folium
from folium.plugins import HeatMap
# 数据准备 - 假设有如下形式的数据列表 [(纬度,经度,权重)]
data = [
[39.9042, 116.4074, 5],
[31.2304, 121.4737, 8],
[23.1291, 113.2644, 10]
]
# 初始化地图中心位置为中国某一点
map_osm = folium.Map(location=[39.9042, 116.4074], zoom_start=5)
# 添加热力层至地图对象中
HeatMap(data).add_to(map_osm)
# 将最终结果保存为HTML文件以便查看
file_path = "./heatmap.html"
map_osm.save(file_path)
print(f"File saved to {file_path}")
```
##### 方法二:通过调用百度地图API构建高精度过滤后的热力图
当仅有地址字符串而无确切GPS数值时可采用这种方式先获取对应点位再进一步处理。
注意,在实际应用前需前往官网申请个人密钥并替换掉模板中的占位符部分。
```python
import requests
import json
from pyecharts.charts import Geo
from pyecharts import options as opts
def get_lng_lat(address):
url = 'http://api.map.baidu.com/geocoding/v3/'
params = {
'address': address,
'output': 'json',
'ak': '<Your_BD_API_KEY>' # 替换为自己注册得到的应用程序秘钥
}
res = requests.get(url,params=params)
if not res.status_code==200:
raise Exception('Failed fetching location info.')
result=json.loads(res.text)
lng=result['result']['location']['lng']
lat=result['result']['location']['lat']
return {'lng':lng,'lat':lat}
locations=['北京市','上海市','广州市'] # 测试地点集合
points=[] # 存储解析出来的经纬度信息
for loc in locations:
point=get_lng_lat(loc)
points.append([point['lat'],point['lng']])
geo=(
Geo()
.set_global_opts(
visualmap_opts=opts.VisualMapOpts(max_=max_weight,min_=min_weight),
title_opts=opts.TitleOpts(title="Example of City Heatmap"),
legend_opts=opts.LegendOpts(is_show=False))
.add_schema(maptype='china')
.add("",[(str(p),w) for p,w in zip(points,[random.randint(1,10)*i/len(locations)])])
.render_notebook() # 可视化预览(Jupyter Notebook环境下有效)
)
```
以上两种方式各有优劣,前者部署容易但灵活性较低;后者虽然前期准备工作较多却能带来更好的用户体验与更高的精确程度。
---
阅读全文
相关推荐


















