You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Bokeh打开谷歌地图并设置合适缩放以显示所有标记

如何自动计算Bokeh GMap的Zoom值以显示所有标记点

要让Bokeh加载谷歌地图时自动显示所有标记点,你需要先计算标记点的经纬度范围,再根据地图容器尺寸反推合适的缩放级别。以下是具体实现步骤和代码:

步骤1:提取标记点的经纬度范围

从你的ColumnDataSource中获取所有标记点的经度(x字段)和纬度(y字段),计算出经纬度的最大、最小值:

# 从数据源提取经纬度数据
lons = source.data['x']
lats = source.data['y']

# 计算经纬度的极值范围
min_lon, max_lon = min(lons), max(lons)
min_lat, max_lat = min(lats), max(lats)

步骤2:计算地图中心坐标

将地图中心设为所有标记点的经纬度中点,确保视野居中:

center_lat = (min_lat + max_lat) / 2
center_lon = (min_lon + max_lon) / 2

步骤3:计算合适的Zoom级别

根据谷歌地图的瓦片规则(每个瓦片256x256像素,Zoom级别对应全球瓦片数量),分别计算经度和纬度方向需要的缩放级别,取两者中较小的值(确保同时覆盖两个方向的范围),并限制在谷歌地图支持的0-21范围内:

import math

# 地图容器的宽高(与你定义的bokeh_width、bokeh_height一致)
map_width = bokeh_width
map_height = bokeh_height

# 计算经纬度差值
delta_lon = max_lon - min_lon
delta_lat = max_lat - min_lat

# 处理单点情况(差值为0时设默认Zoom)
if delta_lon == 0:
    zoom_lon = 15
else:
    # 经度方向需要的Zoom:预留20%边距确保点不贴边
    zoom_lon = math.log2((map_width * 1.2 * 360) / (delta_lon * 256))

if delta_lat == 0:
    zoom_lat = 15
else:
    # 纬度方向需要的Zoom
    zoom_lat = math.log2((map_height * 1.2 * 180) / (delta_lat * 256))

# 取最小的Zoom值并转为整数,限制在0-21之间
zoom = min(math.floor(zoom_lon), math.floor(zoom_lat))
zoom = max(0, min(zoom, 21))

步骤4:替换原有代码的参数

将计算出的中心坐标和Zoom值传入GMapOptions:

gmap_options = GMapOptions(lat=center_lat, lng=center_lon,
                           map_type=map_type, zoom=zoom)
p = gmap(api_key, gmap_options, title='PhotosTrip',
         width=bokeh_width, height=bokeh_height, tooltips=TOOLTIPS,
         tools=[hover, 'reset', 'wheel_zoom', 'pan'])
p.circle('x', 'y', size=8, alpha=0.5, color='black', source=source)

说明

  • 预留20%边距是为了避免标记点紧贴地图边缘,提升视觉效果;
  • 谷歌地图的Zoom级别范围是0(全球视图)到21(最大细节),所以需要限制计算出的Zoom值在这个区间内;
  • 如果所有标记点都在同一位置(经纬度差值为0),会默认使用Zoom=15,你可以根据需求调整这个默认值。

内容的提问来源于stack exchange,提问作者gtomer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 02:45:36