上一篇和大家分享了《可视化之Berkeley Earth》,这次看一看下面这个网站---aqicn.org。先做一个提示:文末有惊喜~

该网站在中国有一定的权威性,PM2.5数据有一点敏感,它竟能提供全球级别,实时的,详尽的AQI数据,以及每个站点的经纬度(精度在十米内),它的口号“provide information as clean as the air one wish to have”——提供的每一份数据,如同每个人所期望的空气那样干净。

但该网站又有一点神秘感,没有过多的自我介绍,服务器IP来自美国,团队成员主要在北京,能够获取全球这么详细的数据,总感觉背后有很多不能说的秘密,网上只找到一篇《MY FAVORITE POLLUTION WEBSITE: AQICN.ORG》,感兴趣的可以读一下。

去年底抓取它的PM25实时数据,但觉得这是老外的良心网站,如果把URL和网站名称曝光,有被墙的隐患,所以没有透露。最近发现它竟然推出了json api的服务,生意越做越大,那今天老夫就“好事做到底”,揭底该网站四个未公开的,却是最重量级的服务。

1AQI Map

这是bounds查询的url:

https://api.waqi.info/mapq/bounds/?bounds={RECTANGLE}&inc=placeholders&k={KEY}&_={DATE}

官网API里仅开发了经纬度的点查询,但它自己使用是bounds面查询,另一个比较坑的是DATE参数,我自己验证是无效的,所以该API无法做到对历史数据的查询,当然,这也可以理解,毕竟每个站点数据更新时间不一,比如中亚可能好几个月才更新一次。因为之前的PM文章详细介绍过这部分,不再重复。

2AQI Forecast

如上是城市的天气预报服务,对应的数据url如下:

https://api.waqi.info/api/feed/@{cityid}/obs.en.json

其中@参数是City编码,比如北京对应的id是1451。返回JSON对象如下:

不难理解,简单说一下框选的内容,city是该城市的内容,nearest是该城市范围内的气象站点,都有geo属性,提供对应的经纬度,误差在百米内。Iaqi留到下面说,先说相对简单的—forecast属性。顾名思义,也就是气象预报的内容,包括aqi和wind两部分。

先看上图对应表格中的AQI数值,每一项对应该时间点AQI的最大最小值。再看下图wind属性:

这个就不那么直观了,大家能看出对应关系吗?我看了一个多小时,没看出来,只好调试源码:三小时(采用UTC时间)为一时间段,对应三组数据,如上图,c是气温,获取气温的最大值和最小值,w[0],w[1]对应当前时段风速的最小最大值,w[2]是以正南为起始点,顺时针方向的旋转角度,表示风向,蓝色是风速的柱状图效果。这样看上去就很明白了吧。事后让同事看对应关系,他竟然很快就“蒙“对了。

3AQI Current

实时天气数据和forecast都在一个json对象中,对应iaqi属性,如下图所示,正好有11项,分别对应PM25,PM10等十一个指标。

对应的PM25属性如下:

p标志该指标名称为pm2.5,v中保存的是最近48小时内的极值和当前值,i是该数据的提供方。iaqi[0].h[2]下面的一堆乱码是什么,猜测应该是每个小时的PM25数值,用于显示左侧柱状图,可肉眼看不出其中的数值映射关系,这时候就需要用心眼了---调试,原来Decode代码如下:

我很好奇这段代码的出处,因为之前看高德地图中矢量瓦片中也采用了类似的解密方式,有了解的请告诉我,再次感谢。最终该函数将乱码decode为48个PM值。

4Forecast Map

当你在网页上看到该动态图时,假设你要实现这个效果,所需要的数据格式,用Canvas 2D还是WebGL,以及流畅度和交互式操作?

首先,每一个城市有自己的配置文件,应该是JSP动态网页来获取的,比如New York的配置信息如下:

如上请求的是pm25数据,model是ncep-aqm。根据这些参数,我们能够获取如下的url

https://forecast.waqi.info/forecast/aqi/ncep-aqm/best/pm25/conf.json

其对应的json信息如下:

如上也比较容易理解,其中size指该区域的像素宽高,bounds为经纬度范围,其中在usepa字段下有8.png(图片)和jsmap(二进制)这两种形式,可以简单的认为是PM25的范围分段。两者思路相同,网站使用的是jsmap这种形式。

如上,从lut可知pm25值分为17份,范围是0~500。将lut的17个区间归类到domain中,domain[i]对应range[i]份。无论是jsmap还是png,规范都一致(png更精细一些)。不同的是files,png对应的是图片的相对路径,效果如下。而jsmap是二进制流形式

代码中会给出一个色带"#ffffff", "#5ec569", "#b2d744","#f2c500", "#fe8d00", "#fa0067"],等分为17份,形成渐变色,然后根据jsmap对应的lut构造出一个level-color的分段映射表。保存在this.stream.colors.lut属性中。

创建好了颜色表,接着就会请求对应时段的数据,url如下:

https://forecast.waqi.info/forecast/aqi/ncep-aqm/best/pm25/jsmap/stream.jsmap

对该数据进行解码后参与canvas的渲染,解码的算法和上面的decode相似,最终会解析为一个点串points,里面有v,x,y,n四个分量,分别是pm25值对应颜色表中的value值,xy是对应该区域的像素偏移量,n标识该值连续的次数。这样,建立了最终的value-level-color的完整映射关系,通过canvas 2d完整动态渲染的整个过程。

5其他

在技术角度,把AQICN分解的差不多了,不知道大家有什么收获,因为篇幅太长,所以本篇就到此结束吧。如果有不对的地方或疑问,不妨留言交流。

下一篇会介绍earth.nullschool这个可视化效果很棒的网站,然后会再来一篇个人对这三个网站的对比和分析,把一些个人的想法拿出来和大家分享。

今天就写到这,在公众号中回复“AQICN”,不区分大小写,可以获取本文的Demo。

可视化之AQICN的更多相关文章

  1. 可视化之Berkeley Earth

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

  2. 可视化之Earth NullSchool

    上两篇我们分别介绍了<Berkeley Earth>和<AQICN>两个网站,今天来看一下Earth NullSchool. 这个网站的特色是风向图,之前有一篇可视化之风向图, ...

  3. iOS可视化动态绘制连通图

    上篇博客<iOS可视化动态绘制八种排序过程>可视化了一下一些排序的过程,本篇博客就来聊聊图的东西.在之前的博客中详细的讲过图的相关内容,比如<图的物理存储结构与深搜.广搜>.当 ...

  4. 发布:.NET开发人员必备的可视化调试工具(你值的拥有)

    1:如何使用 1:点击下载:.NET可视化调试工具 (更新于2016-12-29 19:11:00) (终于彻底兼容了部分VS环境下无法使用的问题) 2:解压RAR后执行:CYQ.VisualierS ...

  5. Webstorm+Webpack+echarts构建个性化定制的数据可视化图表&&两个echarts详细教程(柱状图,南丁格尔图)

    Webstorm+Webpack+echarts   ECharts 特性介绍 ECharts,一个纯 Javascript 的图表库,可以流畅的运行在 PC 和移动设备上,兼容当前绝大部分浏览器(I ...

  6. iOS可视化动态绘制八种排序过程

    前面几篇博客都是关于排序的,在之前陆陆续续发布的博客中,我们先后介绍了冒泡排序.选择排序.插入排序.希尔排序.堆排序.归并排序以及快速排序.俗话说的好,做事儿要善始善终,本篇博客就算是对之前那几篇博客 ...

  7. 基于fis3的组件可视化道路

    首先说明一下,即使不熟悉fis3,阅读文本应该也会有所收获. 本文以fis-parser-imweb-tplv2插件为模板插件,目的不在于使用哪个模板,而是组件可视化的实现思路,不必担心. 先说说模板 ...

  8. 自定义可视化调试工具(Microsoft.VisualStudio.DebuggerVisualizers)

    前言: 最近飞机失联的太多,明天要飞北京处理服务器双机热备的问题,航空保险已买,单号是:TF10122913. 至于我的银行卡密码,在我枕头下面的字条里,要是我之后没再更新文章,请通知我家人,哈哈哈哈 ...

  9. 开源发布:VS代码段快捷方式及可视化调试快速部署工具

    前言: 很久前,我发过两篇文章,分别介绍自定义代码版和可视化调试: 1:Visual Studio 小技巧:自定义代码片断 2:自定义可视化调试工具(Microsoft.VisualStudio.De ...

随机推荐

  1. 【转载】stm32的GPIO八种工作模式

    一.推挽输出:可以输出高.低电平,连接数字器件:推挽结构一般是指两个三极管分别受两个互补信号的控制,总是在一个三极管导通的时候另一个截止.高低电平由IC的电源决定.         推挽电路是两个参数 ...

  2. 树莓派安装ubuntu-server,配置镜像,安装python/mysql/samba记录

    目标: 1/在raspberrypi 3B上安装ubuntu-server 2/配置好python/mysql/samba等服务,实现爬虫稳定运行我的硬件准备: 1/raspberrypi 3B 2/ ...

  3. 【2017-04--28】Winform中ListView控件

    ListView 1.先设置列,设置视图属性选择Details. 添加列,修改列名. 2.编辑项(添加行数据) 添加一个ListViewItem对象,该对象的Text对应着是第一列的数据, 在该对象的 ...

  4. bzoj1834 [ZJOI2010]网络扩容

    Description 给定一张有向图,每条边都有一个容量C和一个扩容费用W.这里扩容费用是指将容量扩大1所需的费用.求: 1. 在不扩容的情况下,1到N的最大流: 2. 将1到N的最大流增加K所需的 ...

  5. web.xml 中配置了error-page但不起作用问题

    问题: 在web.xml 中配置了 error-page,但是好像不起作用,就是跳转不到指定的页面. 配置信息如下: <!-- 400错误 --> <error-page> & ...

  6. log4j的Appenders配置

    因为是刚开始使用log4j,很多配置方面的东西都不懂,记录下. 下面是我用STS(Spring Tool Suite)新建Spring MVC项目的时候,帮我自动生成的一个log4j.xml配置文件. ...

  7. CSS3弹性伸缩布局(下)——flex布局

    新版本 新版本的flex布局模型是2012年9月提出的工作草案,这个草案是由W3C推出的最新语法,这个版本立志于指定标准,让新式的浏览器全面兼容,在未来的浏览器更新换代中实现统一. 目前几乎大部分的浏 ...

  8. 纯css实现翻牌特效

    大家有没有看到过网上很炫的翻牌效果,牌正面对着我们,然后点击一下,牌就被翻过来了,效果很酷炫,是不是很想知道是怎么实现的么,代码很简单,跟着小编往下走. 先给大家介绍一下翻牌的原理: 1.父容器设置设 ...

  9. TP5学习基础一:增删改查小demo

    ①TP5--增删改查简单的demo 我先吐槽一下:因为工作需要研究tp5,去官网看了一下哎呦,资源挺多挺全啊!然后下载唯一免费的官方教程,我曹pdf打开533页.讲的很细但是开发能等看完才做吗?看到精 ...

  10. Linux系统管理10——进程和计划任务管理

    Linux系统管理10——进程和计划任务管理 一.程序和进程的关系 1.程序 ·保存在硬盘.光盘等介质中的可执行代码和数据 ·静态保存的代码 2.进程 ·在CPU及内存中运行的程序代码 ·动态执行的代 ...