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

使用Holoviews+Datashader绘制DynamicMap时无法动态更新的问题

地图动态更新与Rasterize使用问题

基本需求与挑战

  • 基本需求:绘制地图并根据选择的变量动态更新图表
  • 面临挑战:
    1. 数据量庞大,必须使用rasterize配合datashader进行数据聚合
    2. Holoviews的DynamicMap无法支持嵌套rasterize操作

代码示例

import holoviews as hv, datashader as ds, geoviews as gv, geoviews.tile_sources as gvts
from holoviews.operation.datashader import datashade, rasterize, dynspread
import panel as pn
hv.extension('bokeh')
opts = dict(width=700, height=500, tools=['hover'], 
            colorbar=True,symmetric=True,clim=(-5,5),
            cmap='Spectral')
tiles = gvts.OSM.options(alpha=0.6)

def load_dh(var=None):
    points = gv.Points(df, kdims=['longitude','latitude'])
    return rasterize(points, x_sampling=0.01, y_sampling=0.01, aggregator=ds.mean(var)).options(**opts)* tiles

def on_var_select(event):
    var = event.obj.value
    col[-1] = load_dh(var=var)

var_select = pn.widgets.Select(name='变量:', options=['dh_after_dtm10', '2', '3'])

var_select.param.watch(on_var_select, parameter_names=['value'])

col = pn.Column(var_select, load_dh(var_select.value))
col

问题现象

图表初始可正常显示,但切换下拉选择的变量时,地图无法更新。

额外尝试报错

尝试使用DynamicMap实现动态更新时,触发以下异常:

Exception: Nesting a DynamicMap inside a DynamicMap is not supported.

解决方案

问题根源在于手动更新Panel组件的方式存在缺陷,且错误嵌套了DynamicMap。可以通过Panel的bind函数直接绑定选择器与绘图逻辑,自动处理动态更新:

修改后的代码

import holoviews as hv, datashader as ds, geoviews as gv, geoviews.tile_sources as gvts
from holoviews.operation.datashader import datashade, rasterize, dynspread
import panel as pn
hv.extension('bokeh')

opts = dict(width=700, height=500, tools=['hover'], 
            colorbar=True,symmetric=True,clim=(-5,5),
            cmap='Spectral')
tiles = gvts.OSM.options(alpha=0.6)

def load_dh(var):
    points = gv.Points(df, kdims=['longitude','latitude'])
    # 直接返回rasterize处理后的元素,无需嵌套DynamicMap
    rasterized = rasterize(points, x_sampling=0.01, y_sampling=0.01, aggregator=ds.mean(var))
    return rasterized.options(**opts) * tiles

# 用pn.bind将选择器与绘图函数绑定,自动响应变量变化
var_select = pn.widgets.Select(name='变量:', options=['dh_after_dtm10', '2', '3'])
plot = pn.bind(load_dh, var=var_select)

# 组装并显示组件
col = pn.Column(var_select, plot)
col.servable()

关键说明

  1. 替换手动回调:pn.bind会自动监听选择器的变量变化,触发绘图函数重新生成图表,无需手动修改pn.Column的子元素
  2. 规避嵌套问题:rasterize本身已包含动态响应逻辑,不需要再包裹DynamicMap,避免触发嵌套异常
  3. 确保数据就绪:代码中假设df是已加载的包含经纬度和目标变量的DataFrame,需提前完成数据加载

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 17:51:45