0

我是散景图的新手,我正在尝试用滑块绘制地图,但它没有更新。

我已经尝试了很多方法,但它仍然没有更新情节。

我正在使用散景服务器和非地理图我已经得到它......

我正在做的是:

def get_dataset(dataframe,column,geometry_column,val):
    g = geodataframe[geodataframe[column] == val]
    g_gdf = gpd.GeoDataFrame(g, geometry=geometry_column)
    g_gdf.crs = 'EPSG:3857'
    return g_gdf

(此函数接收数据帧并重新调整按时间值过滤的地理数据帧

def plot_area(geodataframe ,title_name,w ,h ,hovertool=None, tile = None, cmp_colum = None ,palette_name = None,
              cmp = False,ax =False):

from bokeh.plotting import figure
from bokeh.tile_providers import get_provider
from bokeh.models import GeoJSONDataSource,ColumnDataSource,ColorBar,BasicTicker,LinearColorMapper

poligonos = GeoJSONDataSource(geojson=geodataframe.to_json())
tile_provider = get_provider(tile)
p = figure(title=title_name,plot_width=w, plot_height=h,tooltips=hovertool)
p.add_tile(tile_provider)
p.axis.visible = ax

if cmp:
    color_mapper = LinearColorMapper(palette = palette_name , low = geodataframe[cmp_colum].min(),
                             high = geodataframe[cmp_colum].max())
    color_bar = ColorBar(color_mapper=color_mapper, ticker=BasicTicker(),location=(0,0),
                             label_standoff=12)
    
    p.patches('xs','ys', source=poligonos, fill_alpha=1, line_width=0.5, line_color='black',  
        fill_color={'field' :cmp_colum, 'transform': color_mapper})
    p.add_layout(color_bar, 'left')
else :
    pass

return p

这个函数绘制一个区域。

所以 ...

from bokeh.application import Application
from bokeh.application.handlers import FunctionHandler
from bokeh.models.widgets import DataTable,Paragraph
from bokeh.layouts import row, widgetbox
from bokeh.layouts import layout
from bokeh.models.widgets import Slider
import panel as pn
from bokeh.io import curdoc
from bokeh.io import show

g = get_dataset(precipitacao_por_bacia,'datahora','st_astext',dias[0])
g.reset_index(drop=True,inplace=True)
g['datahora'] = g['datahora'].apply(lambda x: str(x))
p = plot_area(g ,'Precipitação ',w = 500 ,h = 500, hovertool=[('Bacia','@bacia_nome'),
             ('precipitação','@val')],tile = 'CARTODBPOSITRON_RETINA', cmp_colum = 'val' ,
             palette_name = 'Viridis256',cmp = True,ax =False)

def update_map(attrname, old, new):
    g = get_dataset(precipitacao_por_bacia,'datahora','st_astext',dias[slider.value])
    g.reset_index(drop=True,inplace=True)
    plot_area(g ,'Precipitação ',w = 500 ,h = 500, hovertool=[('Bacia','@bacia_nome'),
             ('precipitação','@val')],tile = 'CARTODBPOSITRON_RETINA', cmp_colum = 'val' ,
              palette_name = 'Viridis256',cmp = True,ax =False)
    g['datahora'] = g['datahora'].apply(lambda x: str(x))
    output.text= str(g['datahora'][0])

slider = Slider(title="Day", value=0, start=0, end=409)
output=Paragraph()[enter image description here][1]

slider.on_change('value', update_map)
layout = row(p,widgetbox(slider,output))
curdoc().add_root(layout)
4

1 回答 1

0

您正在通过调用在回调回调中创建一个新图,plot_area但随后立即将其丢弃并且什么也不做。需要将其添加到文档中,以使其对客户端中呈现的内容产生任何影响。类似的东西

def update_map(attrname, old, new):

    p = plot_area(....)

    # replace the old plot with the new one
    layout.children[0] = p
于 2021-08-23T06:00:12.007 回答