一个基于实时计算的扇区流量统计模型设计
2019-04-26吴龙波
文/吴龙波
1 背景
管制扇区是空中交通管理里的专业名词,它是指一块划定容积的扇形立体空域。管制扇区通常设置在某一高空管制单位或进近管制单位内,每个扇区投影到平面上是一个多边形区域,由特定的多个扇区边界点和边界点两两连线组成。管制扇区是一个立体区域,即每个扇区除了平面区域限制还有高度范围限制,通过两者限制即可组成扇区的立体空间。每一扇形区间有一名或一组空中交通管制员负有管制职责,通过扇区航班流量的计算能真实反馈管制员的工作负荷,因此扇区流量统计得到各管制单位的高度关注。但受限于扇区形状的空间复杂性以及大量航迹的计算难度,目前的传统框架的统计结果往往延迟较大且存在较大误差。
为了管制扇区流量统计的准确性和实时性,本文结合主流的分布式实时计算框架Flink 和自动化航迹数据,提出一种基于实时计算的管制扇区流量统计模型。自动化航迹数据是典型的流式数据,并且数据量庞大,适合用实时计算框架进行处理。它是飞机在飞行过程中每4 秒发出的四维时空信息,包括发送时刻、经度、纬度和高度,而经纬度和高度是判断飞机通过某一扇区的重要依据。ApacheFlink 是目前大数据领域中广泛使用的分布式实时计算框架,相比Apache Storm 和SparkStreaming,Flink 以高吞吐、低延迟、高可靠和精确计算等特性备受关注。
2 实时统计模型设计
基于实时计算Flink 的统计模型设计如图1所示,包括航迹发送、消息队列、实时计算、数据库等组件。
航迹发送:模拟自动化航迹数据发送。
图1:实时统计模型图
图2:过扇区算法图解
消息队列:将接收到的航迹数据缓存在消息队列里并做持久化,持久化时间设定为7 天。
实时计算Flink:从消息队列中实时获取航迹数据,对每一个航迹数据判断是否通过扇区,并将相同航班的记录汇总成一条记录。
分析数据库:数据库中,假设过扇区记录保存在FlySector 表,其字段组成包括:航班号(CALLSIGN)、二次代码(SSRCODE)、起飞机场(ADES)、扇区代码(SECTORCODE)、进扇区时间(ENTRYTIME)、出扇区时间(EXITTIME)。通过分析数据库的快速查询性能,能够迅速获取特定时间段内每个扇区的流量。
3 详细算法设计
本模型的难点在于实时计算Flink 中实现扇区统计算法,其中主要包括过扇区的判断算法和相同航班判断算法。
3.1 过扇区判断算法
给定一个航班的某个航迹数据,过扇区判断算法负责判断该时刻该航班是否处于某个扇区中。为便于说明,本文将扇区简化为平面多边形,同时把航迹和扇区边界点的经纬度转换为XY 坐标。判断是否在扇区内可以使用引射线法:在测试航迹点的Y(或X)坐标画一条直线,会得到一个测试点所在的行与扇区多边形边的交点的列表。在图2的这个例子中有2条边与测试点所在的行相交。如果测试航迹点在X 坐标两边点的个数都是奇数则该测试点在扇区内,否则在扇区外。下图中测试点的左边各有奇数(1)个交点,所以航迹点在扇区内。过扇区判断算法伪代码如下:
3.2 相同航班判断法
通过3.1 的过扇区判断算法,我们可以把航迹数据转为中间数据记录,每条中间记录保存的字段信息有:航班号(CALLSIGN)、二次代码(SSRCODE)、起飞机场(ADES)、扇区代码(SECTORCODE)、航迹时间(ATO)。如航迹无法匹配上一个扇区,则该航迹数据丢弃。中间数据记录是图1中实时计算Flink1 的计算结果,根据此结果,在实时计算Flink2 中用相同航班判断法对相同航班的数据进行融合更新,并将合并的单一记录插入分析型数据库。
同一个航班的中间记录可以使用FlinkSQL 中的窗口函数进行融合判断,通过窗口函数,我们可以把当前中间记录的前后特定时间内的同一航班记录数据找出来并按照航迹时间进行排序,示例如表1所示。
表1
表2
表3
在实时计算Flink2 中对以上记录进行整合,即可计算出航班CSN001 过扇区ZGGGACC01 的结果记录,如表2所示。
3.3 扇区架次计算
通过时间段重合算法即可在分析型数据库获取扇区流量统计结果,假设需要查询时刻T1 到T2 扇区ZGGGACC01 的流量,查询语句示例如表3。
4 结语
本文研究了一个基于实时计算框架和航迹数据的管制扇区流量计算模型,相比传统模型,该模型算法通过大数据技术中的Flink 集群实现了航迹数据分布式实时处理和计算。通过Flink 集群和分析型数据库的配合,实现了在航班经过扇区后实时计算出通过扇区的航班架次,同时把延时时间降低到秒级。本模型的应用能大大改善空管系统中扇区架次统计的短板,对管制员工作负荷的分析有重要的促进意义,对管制一线生产工作有良好的辅助作用。