上两篇我们分别介绍了《Berkeley Earth》和《AQICN》两个网站,今天来看一下Earth NullSchool。

这个网站的特色是风向图,之前有一篇可视化之风向图,曾经提到过这个网站,也详细介绍了风向图的技术实现原理。今天针对这个网站,再详细的介绍一下。同样,在公众号中回复“worldwind”,会提供该网站的源码Demo。

如上是该网站的一个动图效果,有兴趣的可以访问网站了解一个大概。作者在github上公布了自己的源码(和网站代码略有不同),气象数据来自NCEP,记得上周介绍的AQICN美国数据也是来自该网站,查了一下,该组织应该算是美国的国家气象局:National Centers for Environmental Prediction。

吸取上一篇的教训,直入主题。当然,想要了解风图原理的,可以看看之前写的可视化之风向图,需要对风图的数据和思路有一定了解,不然本文在理解上可能会有点吃力。

如上是具体数据列表,Mode里显示支持Air(风图),Ocean(洋流),Chem(化学物),Particulates(颗粒物),Height指向不同高度,Overlay表示叠加图层,比如风图+温度,洋流+浪高等,Control为时间轴控件,比如历史数据。点击查看不同的数据效果,不难找到对应数据的url的规范。

气象数据采用的是epak格式,二进制流,代码中提供了数据规范。如下是数据规范和对应的JSON属性:

从converter属性,该数据来自netcdf,而这个格式在之前的Berkeley Earth中也提到过,而原始数据是grib形式,以我的理解,里面应该有一个grib2netcdf2epak的过程,都提供了对应的转换工具。至于为何绕圈,我搜索了一下大概,知道一个大概优劣,但貌似都不绝对,在此就不妄论了。

对我个人而言,花时间最久的是如何以localhost方式获取该数据,因为它是HTTPS服务,做了Referer限制,对于我这个Java小白,绝对算得上是一个难题,不过反过来想,这不就是上天给我一个机会,让我学JavaWeb吗。花了不少时间,也请教了研发两位牛人,终于在Jetty+Servlet下实现了一个Java版的Proxy,是本次最有收获的地方,代码一并奉上,见笑。

有了本地代理服务,对源码进行简单的修改,让其走代理,就实现了localhost的部署,两个参数:url和type。

在地图初始化的时候,先构建了全球格网,是一个2:1的矩形,下面是经过投影后的球状格网效果,主要用于后续获取任意点在地球上的位置,进而获取对应的风速(X,Y),该方法提供了临近插值和双线性插值两种方式,该过程封装在rectangularGrid函数中。

接着,开始请求气象数据数据,解析过程封装在decodeEpak函数中:获取对应的JSON属性,全球风图是720*360大小,精度为0.5℃,每个点有X和Y两个分量,在X和Y方向的向量,米单位。

万事俱备只欠东风——起风。这里有两点,第一,平移缩放时没有任何效果的,这是因为当bounds变化时,需要根据更新后的区域重新插值,计算量比较大,而插值的价值是精度上有保证,清晰,所以这是一个取舍。第二,不仅有一个风图,还有一个栅格底图,下图蓝绿色效果图,仔细看,和风的走势是吻合的,同时鼠标点击时,能获取对应位置的属性值。

对风场向量的插值过程是在interpolateField方式中实现的,这里逻辑如下:1:创建当前窗口对应的掩膜,如上图,全部区域都是黑色(0,0,0,0),只有地球对应的区域颜色为(255, 0, 0, 1) ;2随机生成风粒子,每一个粒子有五个属性,位置(XY),风速(UV)和生命周期(t);3类似一条扫描线,遍历可视区域的每一像素点,通过掩膜判断是否在有效范围内,如果该点有效,则获取其对应的经纬度;4以全球网格为索引,获取该点对应的风场Field,保存到对应的向量场wind field,用于后面的风图效果;5根据风场的强度,对应颜色表设置当前点的颜色强度,保存到mask掩膜中,这样mask在更新时用来判断区域是否可见,更新后则用于显示地图效果,也算是一图两用。如上是初始化的核心部分,里面有很多小的细节,比如风向,在平面上,XY两个向量是直线,而在球面上,要调整为对应的经纬度,是曲线(distortion函数)。

接着,每一帧根据风图的原理,实时更新:风粒子的当前位置,根据当前位置的风速获取下一帧的位置,数据更新(createField::field.move)后则开始渲染(animate.draw),这部分在风向图原理里面有很清楚的介绍,思路完全一致,这里只是把关键点和对应函数实现对应起来,关键还是要思路,如果有意愿不妨自己调试,便一目了然。

至于鼠标点击显示当前状态,代码我没有看,不过上述过程中已经提供了位置转换,数据存储,很容易获取映射关系。

技术内容介绍完毕。

下一篇会抛开技术,从产品,数据,以及可视化效果等非技术层面上,和大家分享一下我对这三个网站的对比和想法。想要源码的同学请回复“worldwind”~

可视化之Earth NullSchool的更多相关文章

  1. 可视化之Berkeley Earth

    去年冬天雾霾严重的那几天,写了两篇关于空气质量的文章,<可视化之PM2.5>和<谈谈我对雾霾的认识>.坦白说,环境问题是一个无法逃避又无能为力的话题.最近因为工作中有一些数据可 ...

  2. 可视化之AQICN

    上一篇和大家分享了<可视化之Berkeley Earth>,这次看一看下面这个网站---aqicn.org.先做一个提示:文末有惊喜~ 该网站在中国有一定的权威性,PM2.5数据有一点敏感 ...

  3. PoPo数据可视化周刊第2期

    羡辙在bilibili开课啦 就在这个月,不知道是不是受了 @Jannchie见齐 的影响,羡辙竟然在bilibili开授Echarts课程,目前已开课两节. [滚城一团]的 ECharts 训练营 ...

  4. Earth Wind 一个查看全球风向的网站

    可以查看整个地球的全貌 ,还能定位你的位置,特别是动画挺有意思 网址:https://earth.nullschool.net/#current/wind/surface/level/orthogra ...

  5. openlayers素材网站

    1.教程网站 http://weilin.me/ol3-primer/ch05/05-03.html 2.特效气象图 https://earth.nullschool.net/zh-cn/#curre ...

  6. 全球PM25实时可视化

    星期一的早上,我在办公区鸟瞰窗外,目光所到之处,用顾城的那首"你看天时很近,看我时很远"倒是格外的应景.作为一名父亲,看着工位上3M的口罩,想想此刻还在熟睡的孩子,多少有些无奈-- ...

  7. Google earth

    装了Google earth之后,需要联网,才能放缩看不同精细程度的场景,除非你之前看过,在你自己的缓存中有存储. Google earth有自己的server,我们交互化的时候,server传数据给 ...

  8. 10个TWaver 网页3D可视化精彩案例

    以下网页3D案例均为TWaver原创出品,推荐使用Chrome, FireFox, Safari等对WebGL支持良好的浏览器运行.案例排名不分先后,如需Demo,可直接申请试用.   1. 化学元素 ...

  9. osgearth介绍(转载)-feature_labels.earth

    初识osg OSG的诞生 在 1997 年时,Don Burns 由于喜欢滑翔机运动且对计算机图形学非常熟悉,在 LINUX 上写了一个控制滑翔机的小引擎,这便是 OSG 的最初雏形.后来在 1998 ...

随机推荐

  1. bootstrap快速入门笔记(二)-栅格系统,响应式类

    一,栅格系统大致有以下: 1,行row必须包含在 .container (固定宽度)或 .container-fluid (100% 宽度)中,一行有12列 2.“列(column)”在水平方向创建一 ...

  2. Angular2.js——主从结构

    学习这一篇的内容,还回到我们快速起步的应用上来. 主从结构,我们想要做一个英雄的列表,我们希望用户在列表中选中一个英雄,然后这个被选中的英雄出现在详情视图中.主视图是英雄列表,从视图则是被选中英雄的详 ...

  3. 调用startActivityForResult后,onActivityResult为什么立刻响应

    现象      今天在编写代码的时候,涉及到两个Activity通过Intent来传值的问题.具体描述为:activity A调用startActivityForResult()函数启动Activit ...

  4. 最准确的单点登录SSO图示和讲解(有代码范例)|手把手教做单点登录(SSO)系列之二

    写第一篇博客<手把手教做单点登录(SSO)系列之一:概述与示例>,就获得了园子里朋友们热情的评论和推荐,感谢各位. 我那篇文章同时发了CSDN和博客园.对比一下,更感受到博客园童鞋们的技术 ...

  5. c#读取html

    第一部分:读取后,再次存入到源文件中Stream myStream = new FileStream("d:\\hhh.html", FileMode.Open);Encoding ...

  6. ③jQuery生成html元素

    动态生成HTML元素 绑定事件

  7. vs2015c++/MFC入门知识全集/实例规范书籍视频下载孙鑫c++对话框计算器基础控件使用教程系列

    VIP教程可免费看.可免费下载前部分试看教程地址:http://dwz.cn/4PcfPk免费下载地址:http://dwz.cn/mfc888 本课程目录 67章 [MFC项目开发第01天]Wind ...

  8. java环境安装之不能安装exe文件

    经过多年,打算再学下java 从官网下载java8安装包,但因为我的计算机的cd-room被卸载掉了,安装是报错说cab文件损坏之类的错误. 从stackOverflow中找到一篇眼前一亮的解决办法. ...

  9. nginx+tomcat+session共享(转)

    1 起因   最近对新开发的web系统进行了压力测试,发现tomcat默认配置下压到600人的并发登录首页响应速度就有比较严重的影响,一轮出现2000多个的 500和502错误.我把登录的时间统计做了 ...

  10. Lua学习(5)——迭代器与泛型for

    1. 迭代器 2. 泛型for语义 所谓迭代器就是一种可以遍历一种集合中所有元素的机制.在lua中,迭代器通常表示为函数,每调用依次函数就返回集合中的下一个元素.泛型for 内部保存了迭代器函数 实际 ...