引子

了解 WebGL 基础之后,接着去看获取解析风场数据的逻辑,又遇到问题。

  • 系统:MacOS

  • 版本:11.6

  • Origin

  • My GitHub

安装 ecCodes

在文章示例源库的说明中,首先要安装 ecCodes ,尝试使用 HomeBrew 但不行。于是就按照 ecCodes 源库的介绍本地进行编译安装。

在进行第 4 步的时候,碰到了问题:

No CMAKE_Fortran_COMPILER could be found.

查询资料说是缺少 gfortran ,可以使用命令查看是否已安装:

which gfortran

有好几种安装方式,我选择下载安装包。

解决这个问题后按照指导继续,编译安装成功,版本是 2.23.0 。

执行脚本

执行脚本的时候,出现了错误提示:

grib_set: command not found grib_dump: command not found

但在前面安装的文件夹的 bin 目录下是找到了 grib_set 的执行文件。推断是没有注册到全局路径中。

查看 ecCodes 安装路径是否注册到全局路径中:

echo $PATH

这里碰到的问题是没有注册到全局路径中,设置方式可参考这里。

修改示例:

vim ./.bash_profile

进入到编辑模式后,添加下面的内容:

export ECCODE_HOME=/xx/xx/xx/xx/eccodesbuild/bin
export PATH=$PATH:$ECCODE_HOME

保存后,使其生效

source ./.bash_profile

想知道是否生效了,试试指令 grib_set -h ,如果发现没有效果,有可能跟使用的 shell 端有关,可参看这里。

数据生成

脚本可以正常执行了,但生成的数据不对:

undefined:1

{“u”:,“v”:}

查看源库的 issues ,里面也有人提这个问题,试了里面的一些方法,发现这个 pull 的修改可以正常的运行。于是就 fork 了一下把这个修改的内容弄过来了,改了些数据,见 XXHolic/webgl-wind 。

数据含义

download.sh 脚本中,获取数据解析后,生成可读文件 tmp.json ,来看看这个文件中主要结构和部分数据:

{"u":{"messages" : [[{"key" : "name","value" : "U component of wind"},{"key" : "Ni","value" : 360},{"key" : "Nj","value" : 181},{"key" : "values","value" : [5.51964, 5.71964, ...]},{"key" : "maximum","value" : 103.02},{"key" : "minimum","value" : -36.0804}]]},"v":{"messages" : [[{"key" : "name","value" : "V component of wind"},{"key" : "getNumberOfValues","value" : 65160},{"key" : "values","value" : [14.9446, 14.8446, ...]},{"key" : "maximum","value" : 80.3446},{"key" : "minimum","value" : -66.4554}]]}
}

看到这些可能会有些疑惑,大气中的气流既有速度也有方向,在数学上可以用一个向量表示。在气象学中,如果知道风的方向和大小,就可以得到表示风的向量,u 分量和 v 分量:

// ws 风力大小 θ 风在数学上的方向描述
u = ws * cos(θ)
v = ws * sin(θ)

更加详细的介绍见 Wind: u and v Components 。

接着在 prepare.js 中使用到风数据中的 key 有:

  • Ni 表示在一条纬线上有多少个点,简单的说就是有多少列。
  • Nj 表示在一条经线上有多少个点,简单的说就是有多少行。
  • values 存放分量所有的值。
  • minimum 表示分量的最小值。
  • maximum 表示分量的最大值。

其中 NiNj 决定了生成图片的宽和高,风速大小映射对应颜色主要逻辑如下:

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 * (u.values[k] - u.minimum)) / (u.maximum - u.minimum));png.data[i + 1] = Math.floor((255 * (v.values[k] - v.minimum)) / (v.maximum - v.minimum));png.data[i + 2] = 0;png.data[i + 3] = 255;}
}
  • i : 使用了 pngjs 插件,颜色使用 RGBA 模式,数组中每连续的 4 个位置存储的是一个点的颜色值,所以 i 变量要是 4 的倍数。
  • k : 用于获取风速大小的索引,先看看 y=0 时,k 的取值变化先从 180 -> 359 递增,然后从 0 -> 179 递增,这样从中间开始取值,猜测是由于这个展示地图是二维的世界地图,返回的数据就是这样的对应规则。
  • 映射方式: 以 maximum - minimum 作为基准,然后计算风速大小相对值 values[k] - minimum ,两个值的比例乘以颜色分量最大值 255 。

参考资料

  • How I built a wind map with WebGL

风场可视化:风场数据相关推荐

  1. Leaflet 可视化--风场、海浪、洋流、气压、温度等

    Leaflet 可视化--风场.海浪.洋流.气压.温度等 实现效果 概述 Demo 视频 参考项目 Demo概述 *关于气象数据* 实现效果 Leaflet 可视化气象数据 概述 基于leaflet. ...

  2. 风场可视化:绘制粒子

    引子 了解风场数据之后,接着去看如何绘制粒子. 源库:webgl-wind Origin My GitHub 绘制地图粒子 查看源库,发现单独有一个 Canvas 绘制地图,获取的世界地图海岸线坐标, ...

  3. 风场可视化与原理剖析

    最近因为项目需要,做风场可视化,也不是什么新鲜的东西了,站在前人的肩膀上鼓捣了两天也算是完成了,特此记录一下. 网上关于风场可视化的文章也挺多,可以拜读以下几位博主文章,在此表示感谢. 数据可视化之风 ...

  4. arcgis js 4 风场可视化

    当我们做洋流或者风场 可视化时候 echart 虽然也能用 但是数据量过大会很卡 数据调用是这个样子 样例数据 链接: https://pan.baidu.com/s/1yQrIMBMJdSPwnnI ...

  5. 浅谈可视化设计-数据时代的“美味烹饪师”(下)

    目录: 1. 什么是大屏数据可视化 2. 设计流程介绍 3. 结合情感打造二维设计美感 4. 构建空间感&二维与三维的融合 5. 小结 结合情感打造二维设计美感 上篇我们讲到了<可视化设 ...

  6. R语言ggplot2可视化:ggplot2可视化时间序列数据并在末尾数据点添加数值标签(number label)

    R语言ggplot2可视化:ggplot2可视化时间序列数据并在末尾数据点添加数值标签(number label) 目录

  7. R语言ggplot2可视化:使用ggfortyify包中的autoplot函数自动可视化时间序列数据(Time Series Plot From a Time Series Object (ts))

    R语言ggplot2可视化:使用ggfortyify包中的autoplot函数自动可视化时间序列数据(Time Series Plot From a Time Series Object (ts)) ...

  8. R语言可视化dataframe数据、并自定义设置坐标轴各个标签使用不同的色彩

    R语言可视化dataframe数据.并自定义设置坐标轴各个标签使用不同的色彩 目录 R语言可视化dataframe数据.并自定义设置坐标轴各个标签使用不同的色彩

  9. R语言ggplot2可视化:使用热力图可视化dataframe数据

    R语言ggplot2可视化:使用热力图可视化dataframe数据 目录 R语言ggplot2可视化:使用热力图可视化dataframe数据

  10. python使用matplotlib可视化间断条形图、使用broken_barh函数可视化间断条形图、可视化定性数据的相同指标在时间维度上的差异

    python使用matplotlib可视化间断条形图.使用broken_barh函数可视化间断条形图.可视化定性数据的相同指标在时间维度上的差异 目录 python使用matplotlib可视化间断条 ...

最新文章

  1. 用dblink能修改_【学习笔记】通过修改基表(link$)让非public dblink变为public
  2. 电商课题I:集群环境下业务限流
  3. 网转 mm IOS 报表
  4. springboot介绍_Spring Boot 主类及目录结构介绍!
  5. [深度学习] 自然语言处理 --- Bert开发实战 (Transformers)
  6. spark RDD iterator中sparkEnv功能 -- (视频笔记)
  7. 【转】刨根究底字符编码之十六——Windows记事本的诡异怪事:微软为什么跟联通有仇?
  8. 使用TensorFlow,GPU和Docker容器进行深度学习
  9. 国内计算机专业最好的大学有哪些
  10. 最邻近规则分类 KNN (K-Nearest Neighbor)算法及python实现
  11. 网易云参数解析(多图)
  12. 拍照怎么搜题?(上)
  13. 原神 - 米游社 每日签到
  14. 一个程序员失败的爱情
  15. ENIAC到EDVAC到Intel的思考
  16. 工业设计公司常对设计有什么要求?
  17. python语言小程序-微信小程序可以用Python语言编写吗?
  18. 光通量发光强度照度亮度关系_有关发光强度、光通量、照度、亮度的简单介绍...
  19. 【uni-app】什么是uni-app?如何进行开发?如何连接微信开发者工具与安卓手机端?
  20. 怎样查看服务器上的文件夹大小写,查看ftp服务器所有文件夹大小写

热门文章

  1. linux系统登陆微信,在Deepin 20系统下实现电脑端登陆两个微信账号的方法
  2. 使用Tableau进行基础图表制作
  3. C/C++入门级小游戏——开发备忘录
  4. 我们来聊聊关于数据分析师的前景
  5. 2021互联网大厂端午礼盒大盘点~
  6. AbMole推荐:人源化单抗动物实验黄金指南 (上)
  7. 3D-LaneNet:端到端三维多车道检测ICCV2019
  8. python国际象棋ai程序_Python开发AI应用-国际象棋应用
  9. 北邮智能车仿真培训(九)—— 室外光电创意组仿真
  10. css制作聊天气泡android,css实现聊天气泡效果