Python Folium库制作地图热力图的完整步骤
系统介绍使用Python Folium库制作交互式地图热力图的完整步骤,涵盖环境准备、数据清洗、底图构建、HeatMap参数调优及HTML文件导出等全过程与避坑指南。
在Python地理空间数据可视化中,制作交互式热力图的核心路径是利用Folium库的基础地图对象结合其内置插件folium.plugins.HeatMap。完整的实现过程分为五个明确环节:安装必要依赖环境、组织并清洗经纬度与权重数据、初始化基础瓦片地图、配置热力扩散参数并添加图层、最终将交互式地图导出为独立的HTML文件。遵循这一标准流程,读者无需搭建复杂的GIS后端即可快速完成空间热点聚集分析与展示。
一、准备运行环境与必要依赖
Folium本身是基于Leaflet.js库封装的Python接口,其底层借助Jinja2进行网页模板渲染,并通过branca生成HTML组件。在开始编写代码前,必须确保Python运行环境中已安装Folium以及处理矩阵数据的Pandas或NumPy。
在终端或命令行执行以下命令完成安装:
pip install folium pandas
若在Jupyter Notebook环境中开发,安装完成后可以直接在单元格内导入并测试版本:
import folium
import pandas as pd
print(folium.__version__)
二、整理经纬度与权重数据结构
热力图插件HeatMap对输入数据的组织形式有严格要求。输入数据必须是由坐标构成的嵌套列表(二维数组或NumPy Array),其元素形式主要有两种:
- 双元组格式
[[lat_1, lon_1], [lat_2, lon_2], ...]:仅包含位置坐标,每个点位在计算热力聚集时默认权重均为1。 - 三元组格式
[[lat_1, lon_1, weight_1], [lat_2, lon_2, weight_2], ...]:包含位置与权重,第三列为数值权重(如人流量、消费额、事件发生频次)。
关键易错警示:常见的经纬度标示往往是“经度(Longitude)、纬度(Latitude)”,例如经度116.40、纬度39.90。但Folium遵循Leaflet的标准规范,必须将纬度(Latitude)放在第一位,经度(Longitude)放在第二位。如果顺序颠倒,热力图点位将漂移到两极或印度洋,甚至直接超出地图有效绘制边界。
利用Pandas提取对应列的代码模式如下:
# 从 DataFrame 中提取特定的三列,并直接转为标准Python列表
heat_data = df[['latitude', 'longitude', 'count']].values.tolist()
三、初始化基础地图容器(folium.Map)
热力图层不能独立存在,它必须依附于基础底图对象。通过folium.Map()构造函数可以实例化一张交互式地图,最关键的参数包括定位点与缩放级:
location:地图初始展示的地理中心点坐标,采用[lat, lon]列表格式。通常可以取所有数据点纬度与经度的平均值。zoom_start:初始缩放级别。城市级通常设为11~13,省份级为7~9,全国级为4~5。tiles:底图切片样式。默认是'OpenStreetMap',如果希望背景色更淡以突显热力渐变色彩,建议使用低对比度底图如'CartoDB positron'。
# 计算数据中心点坐标
center_lat = df['latitude'].mean()
center_lon = df['longitude'].mean()
# 实例化基础地图容器
m = folium.Map(
location=[center_lat, center_lon],
zoom_start=12,
tiles='CartoDB positron'
)
四、配置并加载热力图插件(plugins.HeatMap)
基础地图容器就绪后,需要引入folium.plugins.HeatMap类生成热力图层,并调用其add_to(m)方法完成图层挂载。在这个阶段,视觉表现主要由四个关键超参数共同决定:
参数配置的具体代码样例如下:
from folium.plugins import HeatMap
# 定义自拟热力阶梯色彩
custom_gradient = {
0.2: '#2b83ba',
0.4: '#abdda4',
0.6: '#ffffbf',
0.8: '#fdae61',
1.0: '#d7191c'
}
# 实例化热力图层并配置渲染超参数
heatmap_layer = HeatMap(
data=heat_data,
radius=18,
blur=12,
max_zoom=14,
min_opacity=0.3,
gradient=custom_gradient
)
# 将热力图层挂载至基础地图
heatmap_layer.add_to(m)
五、保存产物与完整可执行案例
完成图层挂载后,调用地图对象的save()方法,即可将所有JavaScript脚本、Leaflet依赖、瓦片链接和坐标数据整合成一个独立的HTML静态文件。该文件可以在任何现代浏览器中直接离线打开,支持无缝缩放、平移与交互。
下面是一个包含测试数据生成、底图构建、热力图层挂载以及最终导出的完整单文件代码:
import folium
from folium.plugins import HeatMap
import numpy as np
# 1. 模拟生成以北京为中心的随机热力点数据 (纬度, 经度, 权重)
np.random.seed(42)
n_points = 300
latitudes = np.random.normal(loc=39.9042, scale=0.03, size=n_points)
longitudes = np.random.normal(loc=116.4074, scale=0.04, size=n_points)
weights = np.random.uniform(low=1.0, high=10.0, size=n_points)
# 2. 组装成嵌套列表结构
heat_data = [[lat, lon, float(w)] for lat, lon, w in zip(latitudes, longitudes, weights)]
# 3. 初始化底图中心与缩放级别
beijing_map = folium.Map(
location=[39.9042, 116.4074],
zoom_start=12,
tiles='CartoDB positron'
)
# 4. 创建热力图层并挂载
HeatMap(
data=heat_data,
radius=20,
blur=15,
min_opacity=0.2,
max_zoom=13
).add_to(beijing_map)
# 5. 导出为独立可交互 HTML 文件
output_path = "beijing_traffic_heatmap.html"
beijing_map.save(output_path)
print(f"热力图已成功生成并保存至:{output_path}")
六、排查指南与常见问题矩阵
在实际操作与项目落地过程中,初学者常会遇到地图呈现异常的情况。以下总结最典型的三种故障现象、底层诱因以及对应的标准化修复手段:
核心检查清单归纳
| 检查环节 | 标准要求 | 未满足时的异常后果 |
|---|---|---|
| 坐标次序 | 必须为 [纬度, 经度] |
热力点漂移至异常区域或无法在当前视野内渲染 |
| 数据纯净度 | 无 NaN、None 或空字符 |
Leaflet底层报未捕获异常,地图完全空白 |
| 扩散参数 | radius 介于 10~30,blur 匹配其0.6倍 |
过大则热力糊成一片,过小则点位碎裂无聚集效应 |
| 产物格式 | 调用 map.save("path.html") 导出 |
未持久化保存为独立HTML,无法供跨端浏览器交付 |
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













