Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Choroplethmapbox渲染速度慢吗?_Python_Geojson_Plotly Dash_Choropleth - Fatal编程技术网

Python Choroplethmapbox渲染速度慢吗?

Python Choroplethmapbox渲染速度慢吗?,python,geojson,plotly-dash,choropleth,Python,Geojson,Plotly Dash,Choropleth,在过去的几天里,我第一次使用Plotly和Dash,希望为地理NetCDF4数据开发一个基于浏览器的数据浏览器。到目前为止,这一点给我留下了深刻的印象,但是我发现与choroplethmappbox的一些交互更新和渲染所花的时间比预期的要长。我相信这可能是讨论过的同一个问题 以下是可用的代码和示例数据,其中可以使用以下命令运行Dash应用程序: python choropleth.py(python 3.7) 我的数据来源于一个4D NetCDF4文件(在本例中是一个海洋温度的模型-temp.n

在过去的几天里,我第一次使用Plotly和Dash,希望为地理NetCDF4数据开发一个基于浏览器的数据浏览器。到目前为止,这一点给我留下了深刻的印象,但是我发现与
choroplethmappbox
的一些交互更新和渲染所花的时间比预期的要长。我相信这可能是讨论过的同一个问题

以下是可用的代码和示例数据,其中可以使用以下命令运行Dash应用程序: python choropleth.py(python 3.7)

我的数据来源于一个4D NetCDF4文件(在本例中是一个海洋温度的模型-temp.nc),其尺寸为时间、深度、纬度和经度。在我的例子中,我只绘制一个二维叶绿素贴图,但我希望用户以交互方式选择所需的时间间隔(以及最终的深度)(渲染将始终在二维空间中)

使用中的示例,我使用二维网格单元的GeoJSON文件和熊猫数据帧来渲染海洋温度。一切正常,但滑块值(时间)的任何更改都需要很长时间才能更新(在我的机器上约为6秒)。似乎在选择滑块值和运行
update\u figure()
回调之间还有一秒左右的时间,然后在浏览器中开始新渲染之前还有4-5秒

update\u figure()
回调直接从NetCDF4文件读取请求的数据,然后直接更新现有图形字典中的Z值,并将其作为新图形返回(请参见下面的代码片段)。起初,我担心响应时间慢是由于从NetCDF4读取数据造成的,但是一个基本的定时函数显示,在大多数情况下,
update\u figure()
回调在不到0.01秒的时间内运行。因此,延迟似乎要么来自
@app.callback
,要么来自Dash中的渲染函数(post
update_figure()

我怀疑缓慢的渲染时间与每个单元多边形的GeoJSON有关(总共渲染47k网格单元多边形,每个多边形由6个点定义(即总共284k点)),不幸的是,这无法进一步简化

我正在寻求有关如何在用户与应用程序交互时加快更新/渲染速度的建议。我的两个想法包括:

  • 如果可能,使用WebGL?从文档中我不清楚
    choroplethmappbox
    是否已经使用WebGL?如果没有,是否有一种途径可以利用它来加快渲染速度
  • 实现某种形式的客户端回调,尽管我不知道这是否可行,因为我需要在用户请求时直接从NetCDF文件中读取值?也许可以读取/返回新的Z值,然后在客户端将其与现有的GeoJSON合并

  • 感谢您的建议。

    这似乎很有趣-您是否尝试过询问Dash论坛或在GitHub上打开门票?我想知道它是否会在那里得到更多的关注。这看起来很有趣-你有没有试过问Dash论坛或者在GitHub上开一张票?我想知道它是否会在那里得到更多的关注。
    # Create the callback and callback function (update_figure)
    @app.callback(Output('plot', 'figure'),
                  [Input('slide', 'value')],
                  [State('plot','relayoutData'),State('plot', 'figure')])
    def update_figure(x,r,f):
        t0 = tme.time()
        f['layout']['mapbox']['center']['lat'] = f['layout']['mapbox']['center']['lat']
        f['layout']['mapbox']['center']['lon'] = f['layout']['mapbox']['center']['lon']
        f['layout']['mapbox']['zoom'] = f['layout']['mapbox']['zoom']
    
        # If the map window has been panned or zoomed, grab those values for the new figure
        if r is not None:
            if 'mapbox.center' in r:
                f['layout']['mapbox']['center']['lat'] = r['mapbox.center']['lat']
                f['layout']['mapbox']['center']['lon'] = r['mapbox.center']['lon']
                f['layout']['mapbox']['zoom'] = r['mapbox.zoom']
    
        # Extract the new time values from the NetCDF file
        tmp = nc['temp'][x, -1, :, :].values.flatten()
        # Repace the Z values in the original figure with the updated values, leave everything else (e.g. cell geojson and max/min ranges) as-is
        f['data'][0]['z'] = np.where(np.isnan(tmp), None, tmp).tolist()
        print("update_figure() time: ",tme.time()-t0)
        return f