在线免费地图服务(需网络连接)
1. 开源地图服务
服务商 | 样式名称 | 适用场景 | 示例代码 |
---|---|---|---|
Stamen | terrain(地形) | 山川地貌可视化 | mapbox_style="stamen-terrain" |
toner(线稿风格) | 构建数据仪表盘背景 | mapbox_style="stamen-toner" | |
watercolor(水彩风格) | 艺术化地图展示 | mapbox_style="stamen-watercolor" | |
OpenStreetMap | 经典道路地图 | 基础地理信息展示 | 需通过 Stamen 的 open-street-map 风格间接调用 |
# 使用 Stamen 的 OpenStreetMap 风格
import plotly.graph_objects as go
fig = go.Figure(go.Scattermapbox(
lat=[35.6895], lon=[139.6917], # 东京坐标
mode='markers',
marker=dict(size=12, color='red')
))
fig.update_layout(
mapbox_style="stamen-open-street-map", # 正确用法
mapbox_zoom=13,
mapbox_center_lat=35.6895,
mapbox_center_lon=139.6917
)
fig.show()
2. 商业地图服务
服务商 | 样式名称 | 免费层级特点 | 代码示例 |
---|---|---|---|
Carto | positron(明亮色系) | 支持交互式地理分析 | mapbox_style="carto-positron" |
darkmatter(暗黑系) | 数据密集型可视化场景 | mapbox_style="carto-darkmatter" |
# Carto 商业地图示例
import plotly.graph_objects as go
fig = go.Figure(go.Scattermapbox(
lat=[40.7128], lon=[-74.0060], # 纽约坐标
mode='markers',
marker=dict(size=15, color='purple')
))
fig.update_layout(
mapbox_style="carto-positron",
mapbox_zoom=12,
title="纽约地标分布"
)
fig.show()
3. 国内地图服务
(1)高德地图(需API Key)
import plotly.graph_objects as go
# 高德地图瓦片URL格式
tile_url = "https://webst01.map.qq.com/tile/?x={x}&y={y}&z={z}&s=4&tk=你的API密钥"
fig = go.Figure(go.Scattermapbox(
lat=[31.2304], lon=[121.4737], # 上海坐标
mode='markers',
marker=dict(size=10)
))
fig.update_layout(
mapbox_style=None, # 禁用默认样式
mapbox_tiles=tile_url,
mapbox_zoom=11,
mapbox_center_lat=31.2304,
mapbox_center_lon=121.4737
)
fig.show()
注意:
- 需注册 高德开放平台 获取 API 密钥
- 国内访问建议使用
https
协议
(2)天地图(需注册账号)
import plotly.graph_objects as go
# 天地图瓦片URL格式(卫星影像)
tile_url = "http://t0.tianditu.gov.cn/img_w/i?x={x}&y={y}&z={z}"
fig = go.Figure(go.Scattermapbox(
lat=[23.1291], lon=[113.2644], # 广州坐标
mode='markers',
marker=dict(size=12, color='green')
))
fig.update_layout(
mapbox_style=None,
mapbox_tiles=tile_url,
mapbox_zoom=10,
mapbox_center_lat=23.1291,
mapbox_center_lon=113.2644
)
fig.show()
注意:
- 天地图需注册 国家地理信息公共服务平台 账号申请权限
- 不同瓦片层级(如道路地图/卫星影像)需修改 URL 参数
i
为对应服务类型
五、进阶技巧
- 混合地图叠加:
fig = go.Figure()
# 添加地形底图
fig.add_trace(go.Choroplethmapbox(
geojson=geojson_data,
colorscale="viridis",
opacity=0.3
))
# 添加散点层
fig.add_trace(go.Scattermapbox(
lat=lat_list,
lon=lon_list,
mode='markers',
marker=dict(color='red', size=8)
))
fig.show()
- 动态地图更新:
import pandas as pd
from plotly.subplots import make_subplots
# 创建时间轴动画
frames = []
for year in range(2015, 2020):
df_year = df[df['year'] == year]
fig = px.choropleth(df_year, locations="country", color="value")
frames.append(fig)
# 生成动画 GIF
animation = plotly.animationanimate(frames)
animation.save("global_gdp_animation.gif")
六、避坑指南
-
服务条款限制:
- Mapbox 免费层每天请求量限 50 万次
- 高德地图商业版需企业资质审核
- 天地图的瓦片服务有每日调用次数限制
-
国内网络环境:
- 直接访问 Mapbox 可能被屏蔽,建议使用代理或配置
mapbox_access_token
为国内镜像节点
- 直接访问 Mapbox 可能被屏蔽,建议使用代理或配置
-
性能优化:
- 使用
go.Choroplethmapbox
替代px.choropleth
可提升 3D 渲染性能 - 对大数据集采用地理聚合(geopandas 的
dissolve
方法)
- 使用