如何使用Python Bokeh遍历经纬度列表并批量绘制地理地图点位
批量绘制经纬度列表到Bokeh地理地图
没问题,我帮你把单个点位的代码改成批量处理的版本!其实只需要对现有代码做几个小调整,就能轻松遍历所有坐标并绘制在地图上。
完整实现代码
from pyproj import Transformer from bokeh.plotting import figure, show from bokeh.tile_providers import get_provider, Vendors # 你的经纬度坐标列表 values_list = [['54.866451477248', '14.960403166572'], ['54.864632875802', '14.961946867018'], ['54.954669039256', '14.948996004456'], ['55.062464907296', '14.942403568565'], ['54.8500632', '14.8440791'], ['55.4865391', '14.4950162'], ['55.136166', '14.007264'], ['55.333691003583', '14.76279273417'], ['54.931334101644', '14.881326183346']] # 初始化EPSG4326(WGS84)到EPSG3857(Web Mercator)的转换器 transformer = Transformer.from_crs("epsg:4326", "epsg:3857") # 批量转换所有坐标:遍历列表,处理每个经纬度对 # 注意:列表中的坐标是字符串,需要先转为浮点数 web_mercator_coords = [] for lat_str, lng_str in values_list: lat = float(lat_str) lng = float(lng_str) x, y = transformer.transform(lat, lng) web_mercator_coords.append((x, y)) # 将转换后的坐标拆分为x和y两个列表 x_coords, y_coords = zip(*web_mercator_coords) # 设置地图画布和瓦片层 tile_provider = get_provider(Vendors.STAMEN_TONER_BACKGROUND) m = figure(plot_width=800, plot_height=400, x_range=(1500000, 2000000), # 调整范围适配所有点位 y_range=(6000000, 6600000), x_axis_type='mercator', y_axis_type='mercator') m.add_tile(tile_provider) # 一次性绘制所有点位 m.circle(x=x_coords, y=y_coords, size=10, color='red') show(m)
关键调整说明
- 批量坐标转换:原来的代码只处理了第一个点,现在我们遍历
values_list中的每一组坐标,先把字符串格式的经纬度转为浮点数(这一步很重要,不然transform会报错),再统一转换为Web Mercator坐标。 - 优化地图范围:我调整了
x_range和y_range的数值,确保所有点位都能显示在画布内,你可以根据实际需求再微调这个范围。 - 批量绘制:Bokeh的
circle方法支持直接传入列表作为x/y参数,不用循环逐个添加点,既简洁又高效。
更简洁的坐标转换方式
如果你喜欢更紧凑的代码,可以用列表推导式代替循环,一行完成所有坐标转换:
# 用列表推导式批量转换坐标 x_coords, y_coords = zip(*[transformer.transform(float(lat), float(lng)) for lat, lng in values_list])
这样整个代码会更简洁,功能完全一致。
内容的提问来源于stack exchange,提问作者hello543
相关产品推荐
相关产品推荐

