4、Folium标记与弹窗:添加点标记、自定义图标、弹窗内容、工具提示
地图上光有底图,说白了就是个空壳子。真正让地图“说话”的,是那些标记点。我刚开始做可视化项目时,就犯过这毛病——地图漂漂亮亮的,但用户点上去啥反应没有,跟看张壁纸似的。
今天咱们就聊聊,怎么给地图加上有灵魂的标记。包括点标记、自定义图标、弹窗和工具提示。嗯,这些功能在Folium里实现起来,其实比你想的简单。
4.1 添加点标记(Marker)
点标记是地图上最基础的元素。说白了,就是在地图某个经纬度位置,插个小图钉。
我个人习惯,先把经纬度搞清楚。别笑,我在项目里真见过有人把纬度当经度传的,结果标记点跑到非洲去了。
import folium
# 创建一个地图,中心点在北京
m = folium.Map(location=[39.9042, 116.4074], zoom_start=12)
# 添加一个简单的点标记
folium.Marker(
location=[39.9042, 116.4074], # 北京天安门
popup='<b>天安门广场</b>',
tooltip='点击查看详情'
).add_to(m)
m.save('marker_demo.html')
你看,就这么几行代码,一个标记就上去了。location传的是[纬度, 经度],这个顺序千万别搞反。
4.2 自定义图标
默认的蓝色水滴图标,说实话看多了有点腻。Folium支持自定义图标,你可以用Font Awesome图标,也可以用本地图片。
我个人比较喜欢用Font Awesome,省事,而且图标库丰富。
# 使用Font Awesome图标
folium.Marker(
location=[39.9042, 116.4074],
icon=folium.Icon(icon='cloud', color='blue', prefix='fa'),
popup='天安门广场'
).add_to(m)
# 使用颜色和形状组合
folium.Marker(
location=[39.9150, 116.3970],
icon=folium.Icon(icon='info-sign', color='red'),
popup='故宫博物院'
).add_to(m)
icon参数里,color支持:'red', 'blue', 'green', 'purple', 'orange', 'darkred', 'lightred', 'beige', 'darkblue', 'darkgreen', 'cadetblue', 'darkpurple', 'white', 'lightgray', 'gray', 'black' 这些颜色。
# 自定义HTML图标
icon_html = '<i style="font-size: 24px; color: #e74c3c;">☕</i>'
folium.Marker(
location=[39.9042, 116.4074],
icon=folium.DivIcon(html=icon_html),
popup='咖啡馆'
).add_to(m)
4.3 弹窗内容(Popup)
弹窗是用户点击标记后弹出的信息框。你可以放纯文本,也可以放HTML内容。我建议用HTML,这样排版更灵活。
# 带HTML内容的弹窗
popup_content = """
<div style="width: 200px;">
<h4>故宫博物院</h4>
<p>地址:北京市东城区景山前街4号</p>
<p>开放时间:8:30-17:00</p>
<p style="color: #e74c3c;">🎫 门票:60元</p>
</div>
"""
folium.Marker(
location=[39.9150, 116.3970],
popup=folium.Popup(popup_content, max_width=300),
tooltip='故宫'
).add_to(m)
这里有个坑,我踩过。popup内容里如果包含中文,记得把HTML的编码设置好。不然弹窗里显示乱码,用户体验很差。
- Popup支持HTML,可以放图片、表格、链接
- max_width控制弹窗最大宽度,避免内容撑爆
- 可以用folium.Popup()单独创建,方便复用
4.4 工具提示(Tooltip)
Tooltip和Popup的区别,你想想看。Tooltip是鼠标悬停时显示,Popup是点击后才显示。Tooltip适合放简短信息,比如地名、编号。
# 简单的Tooltip
folium.Marker(
location=[39.9042, 116.4074],
tooltip='天安门广场',
popup='点击查看详情'
).add_to(m)
# 带样式的Tooltip
folium.Marker(
location=[39.9150, 116.3970],
tooltip='<b style="color: #2ecc71;">故宫博物院</b>',
popup='故宫博物院详情'
).add_to(m)
Tooltip默认是鼠标悬停时显示,移开就消失。这个交互很自然,用户不用点击就能看到信息。
4.5 综合示例:批量添加标记
实际项目中,很少只加一两个标记。更多时候是从数据文件里批量读取。我给你看个例子,从列表里批量生成标记。
# 景点数据
spots = [
{'name': '天安门', 'lat': 39.9042, 'lng': 116.4074, 'desc': '中国的象征'},
{'name': '故宫', 'lat': 39.9150, 'lng': 116.3970, 'desc': '明清皇家宫殿'},
{'name': '颐和园', 'lat': 39.9999, 'lng': 116.2755, 'desc': '皇家园林博物馆'},
{'name': '天坛', 'lat': 39.8822, 'lng': 116.4066, 'desc': '明清帝王祭天场所'},
]
m = folium.Map(location=[39.9042, 116.4074], zoom_start=12)
for spot in spots:
popup_html = f"""
<div style="width: 180px;">
<h4>{spot['name']}</h4>
<p>{spot['desc']}</p>
</div>
"""
folium.Marker(
location=[spot['lat'], spot['lng']],
popup=folium.Popup(popup_html, max_width=250),
tooltip=spot['name'],
icon=folium.Icon(icon='star', color='red')
).add_to(m)
m.save('spots_map.html')
你看,用循环批量生成,代码简洁多了。我建议把数据单独放在CSV或JSON文件里,这样维护起来方便。
4.6 知识体系图
下面这张图,帮你理清标记与弹窗的核心逻辑。
4.7 避坑指南
做标记这块,有几个坑我替你们踩过了,记下来省得走弯路。
| 常见问题 | 原因 | 解决方案 |
|---|---|---|
| 标记点位置不对 | 经纬度顺序写反 | 记住:[纬度, 经度] |
| 弹窗显示乱码 | HTML编码问题 | 使用UTF-8编码,或转义特殊字符 |
| 图标不显示 | Font Awesome未加载 | 确保网络畅通,或使用本地图标 |
| Tooltip不出现 | 拼写错误(tooltip写成tooltip) | 检查参数名:tooltip |
嗯,基本上就这些。标记和弹窗是地图交互的基础,掌握了这些,你就能做出让用户愿意点着玩的地图了。
可可精品资料库