将全球网格化的netCDF数据绘制到网络地图上

时间:2018-08-17 14:01:53

标签: python d3.js netcdf plotly.js

我想在网络浏览器中将具有全局半度分辨率的netCDF文件(即,每半度经度/纬度都有一个值)绘制到交互式世界地图上(我不要要在Jupyter Notebook中使用IPython;它应该是一个单独的Web应用程序)。因此,我的方法是:

对于前端,我想使用 plotly.js ,因为它附带了许多预定义的2D地图图。特别是,我为此选择了scattergeo。由于plotly无法直接处理netCDF文件,因此我必须将它们转换为plotly或D3可以处理的适当格式。我在启用了Python Flask的后端中执行此操作。为简单起见,我先将netCDF文件转换为Pandas数据框,然后转换为 CSV 格式的数据,然后将其传输到客户端。然后,CSV数据包含360行和720列(因为我们具有半度分辨率)。

显然,我必须相应地将传输的数据解析为类似JSON的格式。 d3.csvParse()处理完数据后,它将返回360 'Objects',其中包含720个值,每个值都标有一个数字(0-719),如下所示:

Object { 0: "someData", 1: "someData", ..., 719: "someData" }

但是,我真的不知道如何继续。我将所有纬度(-90至90,分0.5步)和经度(-180至180,分0.5步)的数组传递给lat的{​​{1}}和lon属性数据。但是我应该如何处理scattergeo属性?我认为,这是实际数据值起作用的地方,但是如何从上面显示的对象访问它们呢?

这是我如何想象这种工作方式的一些代码片段。

Python

text

JavaScript

...
vname = '<netCDF_Variable>'
var = rootgrp.variables[vname]
frame = var[nearest,:,:]
df = pd.DataFrame(data=frame)

#write to a CSV file
output = io.StringIO()
df.to_csv(output, na_rep='null')
return output.getvalue()

也许我选择了错误的方法,所以对其他方法的每条建议都会受到赞赏。

0 个答案:

没有答案