获取美国gfs风向数据 转换成png与json 记录软件安装环境

获取美国gfs风向数据软件安装指南

  • 基于Ubuntu环境

  • 依赖eccodes环境

    Ubuntu环境就不在这里介绍安装了

eccodes 的依赖

第一步 在linux安装 gcc 和gfortran的环境

第二步 安装 cmake

第三步 下载 对应的eccodes包

安装eccodes文件

1.把下载好的eccodes包上传到 /opt下

tar -xvf eccodes-2.22.1-Source.tar.gz
  1. 安装eccodes库

    mkdir build
    cd build
    #编译
    cmake -DCMAKE_INSTALL_PREFIX=/opt/build/eccodes ../eccodes-2.22.1-Source
    make
    ctest
    make install
    ​

####3.如果有=提示安装工具包必须安装

#最为重要的一步 这个是eccodes的工具类
sudo apt install libeccodes-tools

安装nodejs

sudo apt install nodejs

安装npm

sudo install npm

安装 curl

sudo install curl

这时倒入download.sh prepare.js package.sjon 文件

npm install

npm install pngjs

npm install fs

/opt/webgl-wind-master

#####这个shell代码

#!/bin/bash

GFS_DATE="20210816"
GFS_TIME="06"; # 00, 06, 12, 18
RES="1p00" # 0p25, 0p50 or 1p00
BBOX="leftlon=0&rightlon=360&toplat=90&bottomlat=-90"
LEVEL="lev_10_m_above_ground=on"
GFS_URL="https://nomads.ncep.noaa.gov/cgi-bin/filter_gfs_${RES}.pl?file=gfs.t${GFS_TIME}z.pgrb2.${RES}.f000&${LEVEL}&${BBOX}&dir=%2Fgfs.${GFS_DATE}%2F${GFS_TIME}%2Fatmos"
echo "${GFS_URL}&var_UGRD=on"
curl "${GFS_URL}&var_UGRD=on" -o utmp.grib
curl "${GFS_URL}&var_VGRD=on" -o vtmp.grib

grib_set -r -s packingType=grid_simple utmp.grib utmp.grib
grib_set -r -s packingType=grid_simple vtmp.grib vtmp.grib

printf "{\"u\":`grib_dump -j utmp.grib`,\"v\":`grib_dump -j vtmp.grib`}" > tmp.json

rm utmp.grib vtmp.grib

DIR=`dirname $0`
node ${DIR}/prepare.js ${1}/${GFS_DATE}${GFS_TIME}

rm tmp.json

####这是js代码

const PNG = require('pngjs').PNG;
const fs = require('fs');

const data = JSON.parse(fs.readFileSync('tmp.json'));

const name = '/usr/share/nginx/html'+process.argv[2];
const u = data.u.messages[0];
const v = data.v.messages[0];

var width = 0;
var height = 0;
var umax=0;
var umin=0;
var dataDate;
var dataTime;
var uvs;
for (var i=0;i<u.length;i++){
    jn = u[i];
    if(jn.key=='values'){
        uvs = jn.value;
    }
    if(jn.key=='dataDate'){
        dataDate = jn.value;
    }
    if(jn.key=='dataTime'){
        dataTime = jn.value;
    }
    if(jn.key=='maximum'){
        umax = jn.value;
    }
    if(jn.key=='minimum'){
        umin = jn.value;
    }
    if(jn.key=='Ni'){
        width = jn.value;

    }
    if (jn.key=='Nj'){
        height = jn.value-1;

    }
}
var vmax=0;
var vmin=0;
var vvs;
for(var h=0;h<v.length;h++){
    jv = v[h];
    if(jv.key=='values'){
        vvs = jv.value;
    }
    if(jv.key=='maximum'){
        vmax = jv.value;
    }
    if(jv.key=='minimum'){
        vmin = jv.value;
    }
}
const png = new PNG({
    colorType: 2,
    filterType: 4,
    width: width,
    height: height
});

for (let y = 0; y < height; y++) {
    for (let x = 0; x < width; x++) {
        const i = (y * width + x) * 4;
        const k = y * width + (x + width / 2) % width;
        png.data[i + 0] = Math.floor(255 * (uvs[k] - umin) / (umax - umin));
        png.data[i + 1] = Math.floor(255 * (vvs[k] - vmin) / (vmax - vmin));
        png.data[i + 2] = 0;
        png.data[i + 3] = 255;
    }
}

png.pack().pipe(fs.createWriteStream(name + '.png'));

fs.writeFileSync(name + '.json', JSON.stringify({
    source: 'https://nomads.ncep.noaa.gov',
    date: formatDate(dataDate + '', dataTime),
    width: width,
    height: height,
    uMin: umin,
    uMax: umax,
    vMin: vmin,
    vMax: vmax
}, null, 2) + '\n');

function formatDate(date, time) {
    return date.substr(0, 4) + '-' + date.substr(4, 2) + '-' + date.substr(6, 2) + 'T' +
        (time < 10 ? '0' + time : time) + ':00Z';
}

###这里是package.json 文件

{
  "name": "webgl-wind",
  "version": "0.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "build": "rollup -c",
    "watch": "rollup -c -w",
    "test": "eslint src/*.js demo/index.js data/prepare.js",
    "serve": "st -nc -i index.html",
    "start": "run-p serve watch"
  },
  "keywords": [],
  "author": "Vladimir Agafonkin",
  "license": "ISC",
  "devDependencies": {
    "eslint": "^3.15.0",
    "eslint-config-mourner": "^2.0.1",
    "npm-run-all": "^4.0.1",
    "pngjs": "^3.0.0",
    "rollup": "^0.41.4",
    "rollup-plugin-buble": "^0.15.0",
    "rollup-plugin-string": "^2.0.2",
    "rollup-watch": "^3.2.2",
    "st": "^1.2.0"
  },
  "eslintConfig": {
    "extends": "mourner",
    "parserOptions": {
      "sourceType": "module"
    },
    "globals": {
      "dat": false,
      "WindGL": false
    },
    "rules": {
      "no-var": 2,
      "prefer-const": 2
    }
  }
}

Guess you like

Origin blog.csdn.net/yu1xue1fei/article/details/119914707