3、Folium入门:从零开始玩转地图可视化

说实话,做地图可视化这块,我踩过不少坑。最早用Matplotlib画地图,那叫一个痛苦——坐标对不准、样式调半天、交互更是别想。后来接触到Folium,嗯,真香。

Folium是什么?简单说,它是Leaflet.js的Python封装。Leaflet是前端最流行的轻量级地图库,Folium让你用Python代码就能生成交互式地图HTML。我在项目中用它做过物流路径展示、疫情数据热力图、甚至公司门店分布图,效果都还不错。

核心要点:Folium = Python + Leaflet.js,写Python代码,生成HTML地图,浏览器直接打开就能交互。

3.1 安装与第一个地图

安装特别简单,一行命令搞定:

pip install folium

我个人习惯用conda环境,但pip也完全没问题。装好后,我们来画第一张地图:

import folium

# 创建地图对象,中心点设为北京天安门
m = folium.Map(location=[39.9042, 116.3974], zoom_start=12)

# 保存为HTML文件
m.save('my_first_map.html')

运行完这段代码,你当前目录下会多出一个HTML文件。双击打开,一张可拖拽、可缩放的地图就出现了。是不是很简单?

小提示:location参数是[纬度, 经度],别搞反了。我刚开始就犯过这个错,地图直接飞到非洲去了……

3.2 地图样式与瓦片图层

默认的地图样式是OpenStreetMap,但说实话,有时候不太好看。Folium支持多种瓦片图层,你可以自由切换。

什么叫瓦片图层?说白了,地图是由无数个小图片(瓦片)拼起来的。不同厂商提供的瓦片风格不同,比如有的偏暗色、有的标注更清晰。

常用的瓦片类型:

tiles参数值 风格描述 适用场景
'OpenStreetMap' 默认,清晰明亮 通用场景
'Stamen Terrain' 带地形阴影 山地、海拔展示
'Stamen Toner' 黑白高对比 数据叠加、打印
'CartoDB positron' 浅色简约 商务展示
'CartoDB dark_matter' 深色暗黑 夜间模式、炫酷风格

代码示例:

# 使用Stamen Terrain风格
m = folium.Map(
    location=[39.9042, 116.3974],
    zoom_start=12,
    tiles='Stamen Terrain'
)
m.save('terrain_map.html')

# 使用暗黑风格
m_dark = folium.Map(
    location=[39.9042, 116.3974],
    zoom_start=12,
    tiles='CartoDB dark_matter'
)
m_dark.save('dark_map.html')

你想想看,做数据展示的时候,背景地图太花哨反而会干扰数据本身。所以我一般推荐用'CartoDB positron'或'Stamen Toner',干净利落。

注意:有些瓦片服务需要联网才能加载。如果你在离线环境,记得提前缓存瓦片,或者使用本地瓦片源。我曾经在客户现场演示时,网络断了,地图一片空白……那场面,别提多尴尬了。

3.3 地图控件:让交互更顺手

光有地图还不够,用户需要能缩放、能全屏、能切换图层。Folium提供了现成的控件,几行代码就能加上。

3.3.1 缩放控件

默认就有,不用额外配置。但你可以控制它的位置:

m = folium.Map(location=[39.9042, 116.3974], zoom_start=12)
# 缩放控件默认在左上角,不用写代码就有了

3.3.2 全屏控件

这个需要额外插件。先安装:

pip install folium
# 全屏控件在folium的plugins模块里

代码:

from folium.plugins import Fullscreen

m = folium.Map(location=[39.9042, 116.3974], zoom_start=12)

# 添加全屏按钮
Fullscreen().add_to(m)

m.save('fullscreen_map.html')

全屏按钮会出现在地图右上角,点击后地图铺满整个浏览器窗口。做汇报展示时特别好用。

3.3.3 图层控制

这个功能我特别喜欢。你可以叠加多个图层,让用户自己选择看哪个:

import folium

# 创建基础地图
m = folium.Map(location=[39.9042, 116.3974], zoom_start=12)

# 创建两个不同的瓦片图层
tile1 = folium.TileLayer('OpenStreetMap', name='默认街道图')
tile2 = folium.TileLayer('CartoDB dark_matter', name='暗黑风格')

# 添加到地图
tile1.add_to(m)
tile2.add_to(m)

# 添加图层控制控件
folium.LayerControl().add_to(m)

m.save('layer_control.html')

打开这个HTML,右上角会多出一个图层切换按钮。点击就能在「默认街道图」和「暗黑风格」之间切换。嗯,这里要注意:name参数决定了显示在控件里的名字,你可以随便起。

避坑指南:我曾经在项目中同时添加了5个图层,结果控件列表太长,用户体验很差。建议图层数量控制在3个以内,最多不超过4个。

3.4 知识体系总览

为了让你更直观地理解本章内容,我画了一张结构图:

Folium入门 安装与基础地图 pip install folium Map(location, zoom_start) 地图样式与瓦片图层 OpenStreetMap / Stamen / CartoDB tiles参数切换风格 地图控件 缩放控件(默认) 全屏控件(Fullscreen) 图层控制(LayerControl)

这张图把本章的三个核心模块串起来了:先学会安装和创建基础地图,然后掌握不同瓦片风格的切换,最后加上交互控件让地图更易用。三者层层递进,缺一不可。

3.5 实战小贴士

最后分享几个我在项目中积累的经验:

  • 坐标精度:纬度范围-90到90,经度范围-180到180。小数点后4位精度就够用了,约11米的误差。
  • zoom_start:值越大越放大。1是全世界,18是街道级别。城市级别用12-14比较合适。
  • 文件大小:Folium生成的HTML通常只有几十KB,加载很快。但如果叠加了大量数据点,文件会膨胀,注意优化。
  • 中文标注:Folium默认字体支持中文,但如果你用某些特殊瓦片,中文可能显示为方框。这时候换个瓦片源就好。

我的习惯:每次新建地图项目,我都会先写一个测试脚本,把常用的几种瓦片和控件都试一遍,确认没问题再开始正式开发。这步虽然简单,但能避免很多后期返工。

好了,Folium入门就讲到这里。你动手试试看,把上面的代码跑一遍,感受一下交互式地图的魅力。相信我,一旦用上,你就再也不想回去用静态地图了。

可可精品资料库