持有有效API密钥与CSV数据,Bokeh谷歌地图无法显示Glyphs(点)
问题描述
我尝试用CSV文件中的有效经纬度数据,在Bokeh谷歌地图上显示数据点(Glyphs)。API密钥有效,地图能正常渲染,但圆形标记始终不显示。我已验证数据类型,地图选项也设置到了对应位置,可数据点还是没出现。
尝试的代码
from bokeh.models import ColumnDataSource, GMapOptions from bokeh.plotting import gmap from bokeh.io import output_file, show import pandas as pd output_file("gmap.html") edu = pd.read_csv('adult_education.csv') latitude = edu['Latitude'] longitude = edu['Longitude'] map_options = GMapOptions(lat=50.748165, lng=-122.595148, map_type="roadmap", zoom=5) p = gmap("Valid API", map_options, title="Vancouver") source = ColumnDataSource( data=dict(lat=latitude.tolist(), lon=longitude.tolist())) p.circle(x="lon", y="lat", size=20, fill_color="blue", fill_alpha=0.8, source=source) show(p)
当前效果

预期效果

解决方案
1. 检查数据有效性与坐标顺序
先确认CSV里的Latitude和Longitude是数值类型,且无缺失值(NaN),可以在代码中加入验证:
print(edu[['Latitude', 'Longitude']].info()) print(edu[['Latitude', 'Longitude']].head())
如果发现坐标顺序颠倒(比如经度存在Latitude列),需要交换circle方法的x和y参数:
p.circle(x="lat", y="lon", size=20, fill_color="blue", fill_alpha=0.8, source=source)
2. 确认API权限
确保你的谷歌API密钥已启用Maps JavaScript API,且没有IP限制或配额耗尽,可在谷歌云控制台查看API状态。
3. 调整图层添加方式
直接用p.circle可能存在渲染顺序问题,改用add_glyph显式添加标记:
from bokeh.models import Circle glyph = Circle(x="lon", y="lat", size=20, fill_color="blue", fill_alpha=0.8) p.add_glyph(source, glyph)
4. 匹配地图范围与数据
确认数据点的经纬度在当前地图可视范围内,打印坐标范围后调整地图参数:
print("纬度范围:", edu['Latitude'].min(), "-", edu['Latitude'].max()) print("经度范围:", edu['Longitude'].min(), "-", edu['Longitude'].max())
比如温哥华市区的合适参数:
map_options = GMapOptions(lat=49.2827, lng=-123.1207, map_type="roadmap", zoom=10)
修正后的完整代码
from bokeh.models import ColumnDataSource, GMapOptions, Circle from bokeh.plotting import gmap from bokeh.io import output_file, show import pandas as pd output_file("gmap.html") edu = pd.read_csv('adult_education.csv') # 验证并清理数据 cleaned_data = edu[['Latitude', 'Longitude']].dropna() print(cleaned_data.describe()) map_options = GMapOptions(lat=49.2827, lng=-123.1207, map_type="roadmap", zoom=10) p = gmap("你的有效API密钥", map_options, title="Vancouver") source = ColumnDataSource( data=dict( lat=cleaned_data['Latitude'].tolist(), lon=cleaned_data['Longitude'].tolist() ) ) p.add_glyph(source, Circle(x="lon", y="lat", size=20, fill_color="blue", fill_alpha=0.8)) show(p)
内容的提问来源于stack exchange,提问作者oosapoyo
相关产品推荐
相关产品推荐

