可视化之Earth NullSchool

简介:

转自fu*k原文 可视化之Earth NullSchool

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

earth

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

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

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

1

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

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

2

3

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

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

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

5

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

7

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

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

8

      对风场向量的插值过程是在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”~

没有整理与归纳的知识,一文不值!高度概括与梳理的知识,才是自己真正的知识与技能。 永远不要让自己的自由、好奇、充满创造力的想法被现实的框架所束缚,让创造力自由成长吧! 多花时间,关心他(她)人,正如别人所关心你的。理想的腾飞与实现,没有别人的支持与帮助,是万万不能的。
 
 
 



    本文转自wenglabs博客园博客,原文链接:http://www.cnblogs.com/arxive/p/7445984.html ,如需转载请自行联系原作者

相关文章
|
设计模式 人工智能 安全
疯狂科学家!DARPA 颅内芯片研究项目即将启动
吴航,加拿大多伦多大学Humanistic Intelligence Lab研究员,师从可穿戴计算之父Steve Mann ;专注于神经工程学,脑力提升(Intelligence Augmentation)领域。机器之心PSI北美区特约前沿科技观察员。
439 0
疯狂科学家!DARPA 颅内芯片研究项目即将启动
|
4天前
|
搜索推荐 编译器 Linux
一个可用于企业开发及通用跨平台的Makefile文件
一款适用于企业级开发的通用跨平台Makefile,支持C/C++混合编译、多目标输出(可执行文件、静态/动态库)、Release/Debug版本管理。配置简洁,仅需修改带`MF_CONFIGURE_`前缀的变量,支持脚本化配置与子Makefile管理,具备完善日志、错误提示和跨平台兼容性,附详细文档与示例,便于学习与集成。
293 116
|
19天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~
|
7天前
|
数据采集 人工智能 自然语言处理
Meta SAM3开源:让图像分割,听懂你的话
Meta发布并开源SAM 3,首个支持文本或视觉提示的统一图像视频分割模型,可精准分割“红色条纹伞”等开放词汇概念,覆盖400万独特概念,性能达人类水平75%–80%,推动视觉分割新突破。
451 44
Meta SAM3开源:让图像分割,听懂你的话
|
13天前
|
安全 Java Android开发
深度解析 Android 崩溃捕获原理及从崩溃到归因的闭环实践
崩溃堆栈全是 a.b.c?Native 错误查不到行号?本文详解 Android 崩溃采集全链路原理,教你如何把“天书”变“说明书”。RUM SDK 已支持一键接入。
684 222
|
1天前
|
Windows
dll错误修复 ,可指定下载dll,regsvr32等
dll错误修复 ,可指定下载dll,regsvr32等
133 95
|
11天前
|
人工智能 移动开发 自然语言处理
2025最新HTML静态网页制作工具推荐:10款免费在线生成器小白也能5分钟上手
晓猛团队精选2025年10款真正免费、无需编程的在线HTML建站工具,涵盖AI生成、拖拽编辑、设计稿转代码等多种类型,均支持浏览器直接使用、快速出图与文件导出,特别适合零基础用户快速搭建个人网站、落地页或企业官网。
1677 158