如何更新Bokeh中的GeoJSONDataSource?切换Shapefile失败求助
解决Bokeh中GeoJSONDataSource无法切换的问题
我帮你定位到了代码里的几个关键问题,这就是你无法切换显示图形的原因,咱们逐个修正:
问题点梳理
- 语法错误:
Select组件定义时,value, ='F1'多了一个逗号,导致语法报错 - 逻辑错误:
update_plot函数里两个if判断都是select.value == 'F2',完全覆盖了切换到F1的逻辑 - 变量名错误:控件引用时用了未定义的
select1,应该是你之前定义的select - 冗余引用:直接使用
f1g.geojson不如直接调用f1.to_json()更直观,避免额外的数据源对象引用
修正后的完整代码
import geopandas as gpd from bokeh.plotting import figure from bokeh.models import GeoJSONDataSource, Select from bokeh.io import curdoc from bokeh.layouts import row, widgetbox # 读取两个Shapefile数据 f1 = gpd.read_file('shape1.shp') f2 = gpd.read_file('shape2.shp') # 初始化GeoJSON数据源,默认加载f1的数据 geo_source = GeoJSONDataSource(geojson=f1.to_json()) # 修复Select组件的语法错误,修正变量名 select = Select(title="Shape", options=['F1', 'F2'], value='F1') # 创建绘图对象 p = figure(plot_width=600, plot_height=500) p.patches('xs', 'ys', source=geo_source, fill_color='white', line_color='black') # 加上边线颜色更清晰 # 修复更新函数的逻辑错误 def update_plot(attrname, old, new): if select.value == 'F1': geo_source.geojson = f1.to_json() elif select.value == 'F2': geo_source.geojson = f2.to_json() # 绑定选择事件 select.on_change('value', update_plot) # 布局并添加到文档 controls = widgetbox(select) curdoc().add_root(row(controls, p))
关键修改说明
- 去掉了多余的
f1g和f2g对象,直接通过GeoDataFrame的to_json()方法更新数据源,减少不必要的中间变量 - 修正了
Select的语法错误,确保初始化正常 - 重构了
update_plot的判断逻辑,用elif让逻辑更清晰,避免重复判断 - 修正了控件引用的变量名错误,确保布局能正确加载选择器
- 给
patches加上了line_color,让图形边界更明显,方便切换时观察变化
内容的提问来源于stack exchange,提问作者emax
相关产品推荐
相关产品推荐

