氣象數據之風向數據展示原理
本人並不是氣象專業出身,若有錯誤,歡迎指正。
效果:
本篇博客不講述具體編程,只為記錄對氣象數據的了解。
一、氣象數據簡介:
氣象數據本身包括的門類多種多樣。所以記錄的格式也多種多樣。比如溫度、濕度、風向、洋流。。。等等。
氣象數據的本職其實更像是柵格數據。
初步舉例(溫度):
將世界地圖以一度為步長,分為橫向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)
鑽研不易,轉載請注明出處。。。。。。