Noah's Blog

EAIPChina航图查看器项目手记

2015-07-27

转载请保留 本文来自 Noah‘sBlog

历时一周,终于完成了破破烂烂的EAIPChina航图查看器项目,最近两天也将开放源代码。

2015-07-28更新
项目已在Github和Git@OSC开源,详见个人项目汇总

这也是我的第一个后端使用Node.js完成的小项目,期间各种知识漏洞让我也是付出了血的代价,这个小玩意至今仍然BUG不断,只能在未来慢慢修补了。

历史

这个项目本来是为模拟飞行助手准备的在线API二期的一部分,但是因为模拟飞行助手在线版(已弃坑,怀念网址在https://2.fsass.sinaapp.com)的失败尝试,在线API部分被整个放弃。

但是航图对模拟飞行爱好者的重要性不言而喻,在我的记忆中,在中国模拟飞行领域中航图的获取有这么一个时间表:

  1. Jeppsen时代

    在这一阶段,我们大多使用Jeppview软件或者它导出的PDF航图。缺点分别是安装复杂且昂贵以及数据版本极老。但是由于当时导航数据的版本也不新,大家对模拟真实度要求也不高,缺点不明显,毕竟使用航图的是少数。

  2. 渠道版CAAC航图时代

    严格来说,这一阶段尚未结束,因为一部分国内模拟飞行组织和个人模拟飞行仍在使用这类航图。这类航图大多为单张的PDF,以英文版为主,中文版大多因存在风险而被私下传播。这类航图的特点是数据时间取决于你的关系有多硬,然而我获取到的大多与当下时间晚一年以上,实用性不强。当时VATPRC提供的英文版CAAC图相对最容易获取,版本也不太遥远,据说来自某航内部,现已不再提供,原因是有了更好的选择。

  3. EAIP时代

    不知道什么时候开始,出现了EAIPChina网站,提供详细的中国AIP数据,涵盖国内所有国际机场,其中也包括,数据更新及时,航图质量高,缺点是目录复杂不好找,移动设备包括Ipad手机等都无法使用,部分桌面浏览器也不能正确输出PDF文件,下载也很麻烦。

正是为了解决EAIP航图的使用难问题,我想到单独制作一个阅读器网页应用,将来再考虑移动端也会方便。但实际并没有我想得那么简单。

EAIP网站分析

eaipchina在AD(机场信息)页面通过在网页中的一个超大变量zNodes存储ztree结构数据,使用jquery.ztree插件完成左侧边栏的加载。

航图的获取通过抓包发现明链在右侧框架内加载PDF文件,这也是用户体验一般的原因之一。地址格式类似于:
https://www.eaipchina.cn/Version/201508/Html/AIP/AD/Chart/ZBYN/ZBYN-7A.pdf
其中有三个变量,分别是”201508”(数据版本),”ZBYN”(机场ICAO代码),“ZBYN-7A”(航图代号)

数据整理

如上,核心问题在于获取目录和PDF文件转换,前者我的做法是手动复制源代码只保留
var zNodes = [{…},{…},…];
然后编写Node.js脚本,eval()之,遍历获得我需要的航图目录,以类似的格式重新整理存成以版本号命名的.json。

此处有坑 Node.js的异步特性有时真的是累赘。
我处理PDF的方式是通过Linux的命令convert(需ImageMgick)将pdf转为png。缺点是不够清晰,但也够用了。
然而,这一命令不能异步重复执行否则会不明原因报错。
无奈只好用Python写了个小脚本来完成下载转换的任务。正所谓人生苦短,我用Python

最后把得到的JSON目录和大量PNG文件上传,由于自己的VPS在国外,我选择了常用的免费存储七牛,这里就不赘述了,有兴趣的话可以研读七牛官方文档,写的很不错,清晰易懂。

图片展示

最初的计划是使用Canvas实现缩放拖动,尝试以后发现效果不佳,很容易导致图片显示位置不正和缩放倍率不一致的问题,考虑到解决起来很费时间,最终使用的还是比较传统的div+img+滚动条方案。

应用的技术

  • jQuery + Bootstarp
  • Node.js + express (首次使用)
  • Docker + Nginx(部署)

    后记

这个小东西未来会投入一点时间维护更新数据,将现在很多临时性的写死部分重新穿起,但是预计会在很长时间以后。
后面主要是开始学习Angular.js以及前端的自动化gulp,bower之类的,正式开始应用Express,后面的计划是同样提供给VATPRC的模拟飞行活动管理系统,那将是一个真正意义的大工程,也会尝试一些新的技术进行突破,预计9月内提供测试。
然而,再过两天我也将和老娘一起到大城市Hong Kong去看看,所有的进度会停顿一段时间。
话说,捉急的录取通知书为毛还没来:joy: