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

如何更新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))

关键修改说明

  1. 去掉了多余的f1g和f2g对象,直接通过GeoDataFrame的to_json()方法更新数据源,减少不必要的中间变量
  2. 修正了Select的语法错误,确保初始化正常
  3. 重构了update_plot的判断逻辑,用elif让逻辑更清晰,避免重复判断
  4. 修正了控件引用的变量名错误,确保布局能正确加载选择器
  5. 给patches加上了line_color,让图形边界更明显,方便切换时观察变化

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:56:26