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。比如用emoji或者SVG图标。我做过一个项目,用咖啡杯图标标记咖啡馆,效果特别好。
# 自定义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默认是鼠标悬停时显示,移开就消失。这个交互很自然,用户不用点击就能看到信息。

💡 使用建议: Tooltip放简短信息(10个字以内),Popup放详细信息。我一般把Tooltip当“标题”,Popup当“详情页”。

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 知识体系图

下面这张图,帮你理清标记与弹窗的核心逻辑。

Folium标记与弹窗 点标记 (Marker) 自定义图标 (Icon) 弹窗 (Popup) 工具提示 (Tooltip) location=[lat, lng] popup / tooltip Font Awesome图标 自定义HTML图标 支持HTML内容 max_width控制 悬停显示 简短信息

4.7 避坑指南

做标记这块,有几个坑我替你们踩过了,记下来省得走弯路。

常见问题 原因 解决方案
标记点位置不对 经纬度顺序写反 记住:[纬度, 经度]
弹窗显示乱码 HTML编码问题 使用UTF-8编码,或转义特殊字符
图标不显示 Font Awesome未加载 确保网络畅通,或使用本地图标
Tooltip不出现 拼写错误(tooltip写成tooltip) 检查参数名:tooltip

嗯,基本上就这些。标记和弹窗是地图交互的基础,掌握了这些,你就能做出让用户愿意点着玩的地图了。

可可精品资料库