首先说下地图风场的实现方式:
下载全球GFS数据
https://nomads.ncep.noaa.gov/cgi-bin/filter_gfs_0p25.pl
GFS风场数据解析
https://github.com/cambecc/grib2json
GFS风场展示
https://github.com/Esri/wind-js
效果如下
如果用全球风场是没有问题的,但是如果是下载的是区域GFS数据,风场显示的时候就会乱掉,比如下载的是中国区域的GFS,整个风场效果就变乱掉:
不仅坐标和中国区域没对上,仔细看风的方向也是正好相反的。
仔细看Grib2JSON转换后的json文件,发现scanMode
这个参数全球和区域是不一样的,全球时是0,表示从北到南,从东到西;区域时是64,表示从南到北,从东到西。
再看windy.js中buildGrid方法中也只是考虑到了Scan mode为0的情况:
var buildGrid = function(data, callback) {
var builder = createBuilder(data); var header = builder.header; var λ0 = header.lo1, φ0 = header.la1; // the grid's origin (e.g., 0.0E, 90.0N) var Δλ = header.dx, Δφ = header.dy; // distance between grid points (e.g., 2.5 deg lon, 2.5 deg lat) var ni = header.nx, nj = header.ny; // number of grid points W-E and N-S (e.g., 144 x 73) var date = new Date(header.refTime); date.setHours(date.getHours() + header.forecastTime); // Scan mode 0 assumed. Longitude increases from λ0, and latitude decreases from φ0. // http://www.nco.ncep.noaa.gov/pmb/docs/grib2/grib2_table3-4.shtml var grid = [], p = 0; var isContinuous = Math.floor(ni * Δλ) >= 360; for (var j = 0; j < nj; j++) {
var row = []; for (var i = 0; i < ni; i++, p++) {
row[i] = builder.data(p); } if (isContinuous) {
// For wrapped grids, duplicate first column as last column to simplify interpolation logic row.push(row[0]); } grid[j] = row; }
知道了以上的原因,其实将windy.js稍微改动下即可
var λ0 = header.lo1, φ0 = header.scanMode == 0 ? header.la1 : header.la2;
if (header.scanMode == 0) {
grid[j] = row; } else {
grid[nj - j] = row; }
效果:
如果不知道怎么用Grib2Json的,可以查看另外一篇博客:
JAVA在线调用Grib2Json
wgrib2: wgrib for GRIB-2
GRIB tools examples
NCEP WMO GRIB2 Documentation
Scripting grib_filter on NCEP’s nomads server