气象数据之风向数据展示原理
本人并不是气象专业出身,若有错误,欢迎指正。
效果:
本篇博客不讲述具体编程,只为记录对气象数据的了解。
一、气象数据简介:
气象数据本身包括的门类多种多样。所以记录的格式也多种多样。比如温度、湿度、风向、洋流。。。等等。
气象数据的本职其实更像是栅格数据。
初步举例(温度):
将世界地图以一度为步长,分为横向360格,纵向181格。每个格子记录一个温度值。这就组成了一个简单的气象数据。
而netcdf、grib2等格式中可以同时装载不同时间、不同海拔高度的数据。
二、风向数据简介:
其中风向和洋流数据比较特殊,它不同于温度等,在每一个点 只有一个值,可以直接展示为热力图等形式。
以风向数据为例:
风向数据在一个点上同时存储了风向和风力。
有意思的是,其存的并不是一个方向角度和一个风力大小。而是在南北方向(U)、东西方向(V)两个方向上的风力值,通过分量的方式确定风力和风向。
三、前端展示原理:
前端展示风向数据的原理:
1.将netcdf、grib2数据转换为json格式。
2.然后加载json数据。
3.解析json得到一个类似栅格的数据。
4.在地球上根据栅格上的方向和速度,随机生成大量的线。生成的线就是风流动的展示效果线条。
5.给这个线渲染一个点流动的样式。就可以达到效果图上的效果。
注意:
1.数据量:因为想展示到以上效果,线的数量将在七八千以上。
2.展示方式:在cesium上通过Primitive生成线去加载的话,前端优化太差,无法完成。如果要达到这种效果,只能使用shader或者在canvas上直接绘制。
3.前端数据只支持这种类似于栅格数据的数据格式展示。在气象数据中还有多种数据记载方式,比如:
记载地球上大量散列的点的数据。就像在一张白纸上去随机的绘制点,当点的数量足够多的时候,一样可以得到一张图。
四、数据转换:
1.简单数据转换
例子:
将世界地图以一度为步长,分为横向360格,纵向181格。每个格子存储UV两个风力向量。
这种数据格式可以直接在前端展示。我们需要做的就是将得到的数据转换为json格式。
注意:json格式最好只存储一份数据。如果同时存储多个时刻或者多个高度的数据的话会因为文件过大影响加载。
netcdf数据转json:
netcdf数据(.nc格式)本身是一个相当复杂的格式,目前网上也没有找到合适的转换工具(据说存在,但相当不友好)。所以建议手动解析netcdf数据。
手动解析教程后续博客更新。
grib2数据转json:
有一个基于java开发的工具:grib2json。可以通过明亮行直接将grib2数据转换为json。
2.其他数据转换
工作中我们收到了这样格式的一份数据:
其记载了地球范围内散列的68万点个的数据多个24小时、45个海拔高度的netcdf数据,文件本身6G大小。
由于所有点都是随机的,而且数据量过大,所以需要对其进行抽稀,并转换为前端展示用的json格式数据。
再次记录一下转换原理:
1.读取netcdf数据。(netcdf数据读取在java、python、javascript中都有对应的包可以直接读取。由于我获取到的netcdf数据本身有6G大小,公司本身后端主要为java,所以使用java去处理)
2.创建栅格数组。将地球分为横向360格,纵向181格的栅格数组。在每个格子的位置再创建一个数组。
3.循环68万散列点U向的数据,判断其经纬度在哪个格子里面,将U的值放到对应的格子里面。
4.将栅格数组里面每个格子得到的值做平均。
5.同理获取V向数据在栅格当中的值。
6.计算并编制json格式中的header的配置,将得到的UV值放入对应data内。
7.导出json
注意:因为源数据维度较多,这个6G的源数据一共导出了24*45=1080个json文件。
相关链接:
气象数据之风向数据json格式解析(https://www.cnblogs.com/s313139232/p/15146568.html)
气象数据之grib2转json(https://www.cnblogs.com/s313139232/p/15094801.html)
钻研不易,转载请注明出处。。。。。。