基于Bezier曲线的航班可视化系统设计

2019-09-25 04:16耿倩陶礼
微型电脑应用 2019年9期
关键词:爬虫航线航班

耿倩, 陶礼

(1.陕西工业职业技术学院 信息工程学院, 咸阳 712000; 2.西北工业大学 机电学院, 西安 710072; 3.陕西省机电传动与控制工程实验室 传动中心, 西安 710072)

0 引言

在大数据时代,我们身边充斥着各类信息,各种数据,人们的时间被打碎,注意力被分散,更多的人喜欢看图片而非文字,喜欢看图表而非数据。数据可视化就是利用电脑图形的理论和电脑图像的处理手段, 把一些图标、地图、网页等以及其他种类的能够使数据的内容变得更容易理解的一种表达方式来表达数据, 这样就能使得数据更容易被接受[1]。传统的图表统计工具存在交互性差、扩展性低、操作复杂、性能受限、可展示的图表种类不够丰富等问题。相比于传统图表与数据仪表盘,如今的数据可视化致力于用更生动、友好的形式,即时呈现隐藏在瞬息万变且庞杂数据背后的业务洞察。通过专门的努力, 研究人员、学者和实践者已经开发出可视化的理论、技术、软件工具和应用程序, 它们可以用于各种各样的目的, 并且可以以一种引人注目的方式面向目标受众[2]。本论文所描述的航班数据可视化系统可以让非专业人员便捷、直观、高效的统计分析出所需的航班数据。

1 航班可视化系统的总体设计

三次工业革命给人们的出行方式带来了极大的改变,诞生于第一次工业革命中的飞机在后来的机械工业和现代计算机技术的加持下,已经成为当前世界上最安全的交通工具。但是,由于飞机出行受天气影响较大,或中国目前民航可用空域较少,部分航线过于繁忙;导致航班时常晚点或延误甚至取消。航班统计应完善数据收集方法, 加强信息化建设,尽量客观准确快速的反应航班整体运行情况, 为改进提供强力的支持, 为我国航班保障与管理助力[3-4]。本系统通过抓取全球航班在过去3个月的航行记录,编程实现航班/航线可视化,并通过交互实现点选,实现筛选、高亮等功能,例如高亮所有国内航班/航线、高亮所有中美航班/航线、高亮某一天上午从北京出发的所有延误或取消的航班等。结合机场的地理信息,还可以机场、城市、省、地区、国家等粒度进行聚合。进一步的,可以分析展示航线繁忙程度、航班准点率等。

开发航班可视化系统的目的是为用户提供一个数据查询与分析平台,因此,系统的最基本的功能是能够按照用户的条件查询出航班,然后计算出该航线的延误率、准点率、平均延误时间等,进一步的,可以分析展示航线繁忙程度。根据以上分析,本项目需要具备的功能如图1所示。

图1 功能需求分析图

具体如下:(1)航班查询:根据用户的选择模糊或精确的查询所需航班并绘制其航线在地图上。

(2)航班筛选:根据用户的筛选模式和筛选条件进行高亮/显示/隐藏所要展示的航班航线。

(3)航班信息展示:当用户在地图上点击某个航班航线之后,显示该航班的详细信息:包括起飞机场/城市/国家、经停机场/城市/国家、目标机场/城市/国家、计划起飞时间、计划到达时间。

(4)航班历史信息展示:该航班过去3个月的历史信息与状态。

(5)出入港信息统计:某城市或机场的出入港统计。

2 航班可视化系统中的数据采集与清理

网络爬虫,是一种通过既定规则,自动地抓取网页信息的计算机程序。爬虫的目的在于将目网页数据下载到本地,以便进行后续的数据分析与处理[5]。爬虫系统的兴起源于海量的网络数据的可用性,通过爬虫技术,能够较为容易的获取网络数据,并通过数据的处理,得出有价值的数据,通过数据分析,得到有价值的结论[6]。

2.1 数据源网站分析

随着Internet技术的不断发展,互联网已经成为人们获取信息的主要途径,搜索引擎从互联网中靶向性筛选出有用的信息[7],而网络爬虫又是搜索引擎的基本构件之一。为了完成航班可视化系统,笔者爬取了FlightAware网站上的相关信息。

FlightAware是全世界最大的航班跟踪数据公司,为超过10 000家飞机运营商和服务商以及超过12 000 000名乘客提供全球航班跟踪解决方案。FlightAware使用来自超过55个国家的空中交通管制系统、分布于超过175个国家的FlightAware ADS-B地面站网络以及Aireon天基全球ADS-B的数据,支持各大供应商的全球数据链路(卫星/VHF),包括ARINC、SITA、Satcom Direct、Garmin、Honeywell GDC和UVdatalink。

为了实现相关的功能,需要爬取历史航班信息来实现航班可视化,可以有效的帮助用户及时了解每个航班的信息,服务人群,使之出行选择权更广泛,节省不必要的时间浪费。

2.2 爬虫程序设计与实现

首先利用谷歌浏览器自带的开发者工具中的Network解析器工具来解析网页的文本信息,分析网页HTML文本信息和页面规则后,编写python程序来完成以下步骤来实现抓取目标数据[8]。

(1)通过分析得出相应的规则,并使用正则表达式来实现获取数据。

(2)将获取的数据利用for循环得到相应的排版。

(3)将整理后的数据通过read_csv函数存放到指定文件夹下。

在对航班数据处理时用到了python中的数据分析包pandas中的read_csv、read_excel、to_datatime、pd函数以及数据分析包time和数据分析包os。在拿到大量的原始数据的时候,因为有少量的文件不支持批量等操作,因此需要做一些简单的去空、去除操作[9]。再将筛选后的数据文件保存在一个文件夹中,利用python程序批量处理文件。最终数据处理后的样式非常的美观,即方便数据的调用与数据的存储。处理后的数据片段如图2所示。

图2 数据处理结束后的样式

3 航班可视化系统的技术实现

3.1 航班可视化系统的总体设计

动态交互式可视化技术越来越受到广大研究者和用户的关注。动态交互可视化通过用户、界面和网络的交互过程,弥补了静态可视化的灵活性不足、视觉分析薄弱、视图呈现不完整等不足[10]。数据可视化工具很多,如Datawrapper等工具,这类工具实现了系统平台内已有的可视化效果,缺乏扩展性;还有一些是为数据可视化提供库函数的开发工具,如Raphael、Echarts等可视化函数库,这类工具为用户提供了各种可视化实现接口,但是需要用户搭建可视化平台,缺乏易用性。D3.js是基于SVG语言开发的库文件,全名是Data-Driver-Document,换句话说就是一种基于数据驱动的文档,拥有高拓展性和高兼容性,是一个可操作的DOM节点[11],能将数据转换成图形的可视化工具,D3将强大的可视化,动态交互和基于数据驱动的DOM操作方法完美地结合在一起[12],可以使用D3设计效果更好,交互性更好的可视化界面。

本系统采用MVC架构,每次从index.php作为程序入口,通过参数c和参数a,执行对应的的控制器和对应的方法,如图3所示。

图3 请求流程图

本系统的交互逻辑简洁明了,如图4所示。

图4 交互逻辑图

当用户进入首页后,系统自动绘制底图以及世界主要的城市坐标,然后用户可以根据条件或快速查询出所需航班,并且系统会在底图上绘制航线。如果需要进一步筛选,用户可通过筛选实现高亮显示或只显示符合要求的数据,进一步的可以查看该航班的详细信息,如准点率、延误率、机场/城市出入港统计、机型统计、航班信息、经停信息、航空公司等。

3.2 航班可视化系统的详细设计

数据可视化系统中的航线采用曲线连接,直线连接虽然简单,但是从客观上违背了航线的物理轨迹;并且当两个目地址之间有多个航班时,使用直线直接连接必然会造成多个航线重叠,影响作品的交互性[13];于是,本作品中采用生成较为平滑的Bezier曲线连接两个目的地,形成大致航线;这样虽然不能精确的表示出航线的实际轨迹,但是遵从了航线不是直线的客观事实;更重要的是,当出现两个目的地之间有多个航班时,使用曲线可以很好的避免重叠的问题,增强交互性能。

首先,系统中大量用到的直连式曲线,是通过d3.js将始发地机场经纬坐标和目的机场经纬坐标映射成svg画布的坐标,因为svg坐标的坐标原点在页面左上角,不利于坐标之间的计算,于是系统中将svg坐标转换成以页面左下角为坐标原点,类似于数学中的坐标系。转换方法也很简单,svg和数学中的坐标x坐标是一样的,因此只需要转换y轴坐标就可以了,同样也可以逆向转换,如图5所示。

图5 坐标转换代码

系统中采用二次Bezier曲线来绘制航线曲线,二次Bezier曲线简单的来说主要有由三个点构成,一个起始点、一个结束点、还有一个控制点[14];因此,本算法的关键在于计算出该曲线的控制点即可,如图6所示。

详细计算方法如下。

(1)坐标转换完成之后,就可以使用数学中的坐标公司进行相应的计算了[15],先假设始发地机场经纬坐标通过d3.js地图映射后转换成svg的坐标,再转换成以页面左下角为坐标原点的坐标为A(x1,y1) 目的地机场为B(x2,y2)。

(2)计算A,B两点连线的直线斜率k,以及直线偏移量b,直线方程为y1=k1*x+b

图6 曲线控制点计算示意图

(3)计算A,B两点连线的两个三等分点坐标M(xm1,xm2),N(xn1,xn2)点M距离A点较近,点N距离B点较近。

(4)随机生成一个数Px (xm1< Px < xn1),因为点在线上,所以Py = k1*Px+b ,则P(px,py)。

(5)设与直线y1垂直的直线为y2,则y2=k2*x+b. 直线y2过P点

(6)在直线y2上与P点距离为L的点有两个分别为C1(cx1,cy1),C2(cx2,cy2)

(7)最后,求出以P为圆心,L为半径的圆的一般方程,该圆一定与直线y2有两个交点,本作品随即取用其中一个作为曲线控制点

(8)L值的确定使用d3.js的尺度函数,根据A,B两点之间的距离,生成L,两点之间的距离越大,L越大;两点之间的距离越小,L就越小。

航班数据可视化系统中航班统计是指当鼠标点击航线时,通过ajax将航班号发送到php后端,php调取数据库中该航班的所有历史信息,分别计算出航班出发和到达时的延误率、准点率、提前率。以及起飞时平均延误时长、降落时平均延误时长和平均飞行时长以及机型统计,计算完成后将结果以json的形式返回,json格式如图7所示。

解析json数据后,页面底部弹出统计面板通过d3.js的饼图生成器,生成饼图显示航班的延误率、准点率、机型统计图,如图8所示。

图7 查询某航班详情与统计信息

图8 查询航班详情

4 总结

本文先从网络爬虫获取航班信息,然后使用MVC架构详细设计了航班可视化系统,其中数据的可视化效果使用二次Bezier曲线绘制航线曲线,使用D3.JS技术来进行航班具体数据的信息绘制。运用大数据技术来实现航班数据的展示,具有一定的应用价值。

猜你喜欢
爬虫航线航班
利用网络爬虫技术验证房地产灰犀牛之说
山航红色定制航班
山航红色定制航班
山航红色定制航班
山航红色定制航班
基于Python的网络爬虫和反爬虫技术研究
(21)新航线
基于Django 的分布式爬虫框架设计与实现*
谁抢走了低价机票
太空新航线