文/吳龍波
管制扇區是空中交通管理里的專業名詞,它是指一塊劃定容積的扇形立體空域。管制扇區通常設置在某一高空管制單位或進近管制單位內,每個扇區投影到平面上是一個多邊形區域,由特定的多個扇區邊界點和邊界點兩兩連線組成。管制扇區是一個立體區域,即每個扇區除了平面區域限制還有高度范圍限制,通過兩者限制即可組成扇區的立體空間。每一扇形區間有一名或一組空中交通管制員負有管制職責,通過扇區航班流量的計算能真實反饋管制員的工作負荷,因此扇區流量統計得到各管制單位的高度關注。但受限于扇區形狀的空間復雜性以及大量航跡的計算難度,目前的傳統框架的統計結果往往延遲較大且存在較大誤差。
為了管制扇區流量統計的準確性和實時性,本文結合主流的分布式實時計算框架Flink 和自動化航跡數據,提出一種基于實時計算的管制扇區流量統計模型。自動化航跡數據是典型的流式數據,并且數據量龐大,適合用實時計算框架進行處理。它是飛機在飛行過程中每4 秒發出的四維時空信息,包括發送時刻、經度、緯度和高度,而經緯度和高度是判斷飛機通過某一扇區的重要依據。ApacheFlink 是目前大數據領域中廣泛使用的分布式實時計算框架,相比Apache Storm 和SparkStreaming,Flink 以高吞吐、低延遲、高可靠和精確計算等特性備受關注。
基于實時計算Flink 的統計模型設計如圖1所示,包括航跡發送、消息隊列、實時計算、數據庫等組件。
航跡發送:模擬自動化航跡數據發送。

圖1:實時統計模型圖

圖2:過扇區算法圖解
消息隊列:將接收到的航跡數據緩存在消息隊列里并做持久化,持久化時間設定為7 天。
實時計算Flink:從消息隊列中實時獲取航跡數據,對每一個航跡數據判斷是否通過扇區,并將相同航班的記錄匯總成一條記錄。
分析數據庫:數據庫中,假設過扇區記錄保存在FlySector 表,其字段組成包括:航班號(CALLSIGN)、二次代碼(SSRCODE)、起飛機場(ADES)、扇區代碼(SECTORCODE)、進扇區時間(ENTRYTIME)、出扇區時間(EXITTIME)。通過分析數據庫的快速查詢性能,能夠迅速獲取特定時間段內每個扇區的流量。
本模型的難點在于實時計算Flink 中實現扇區統計算法,其中主要包括過扇區的判斷算法和相同航班判斷算法。
給定一個航班的某個航跡數據,過扇區判斷算法負責判斷該時刻該航班是否處于某個扇區中。為便于說明,本文將扇區簡化為平面多邊形,同時把航跡和扇區邊界點的經緯度轉換為XY 坐標。判斷是否在扇區內可以使用引射線法:在測試航跡點的Y(或X)坐標畫一條直線,會得到一個測試點所在的行與扇區多邊形邊的交點的列表。在圖2的這個例子中有2條邊與測試點所在的行相交。如果測試航跡點在X 坐標兩邊點的個數都是奇數則該測試點在扇區內,否則在扇區外。下圖中測試點的左邊各有奇數(1)個交點,所以航跡點在扇區內。過扇區判斷算法偽代碼如下:

通過3.1 的過扇區判斷算法,我們可以把航跡數據轉為中間數據記錄,每條中間記錄保存的字段信息有:航班號(CALLSIGN)、二次代碼(SSRCODE)、起飛機場(ADES)、扇區代碼(SECTORCODE)、航跡時間(ATO)。如航跡無法匹配上一個扇區,則該航跡數據丟棄。中間數據記錄是圖1中實時計算Flink1 的計算結果,根據此結果,在實時計算Flink2 中用相同航班判斷法對相同航班的數據進行融合更新,并將合并的單一記錄插入分析型數據庫。
同一個航班的中間記錄可以使用FlinkSQL 中的窗口函數進行融合判斷,通過窗口函數,我們可以把當前中間記錄的前后特定時間內的同一航班記錄數據找出來并按照航跡時間進行排序,示例如表1所示。

表1

表2

表3
在實時計算Flink2 中對以上記錄進行整合,即可計算出航班CSN001 過扇區ZGGGACC01 的結果記錄,如表2所示。
通過時間段重合算法即可在分析型數據庫獲取扇區流量統計結果,假設需要查詢時刻T1 到T2 扇區ZGGGACC01 的流量,查詢語句示例如表3。
本文研究了一個基于實時計算框架和航跡數據的管制扇區流量計算模型,相比傳統模型,該模型算法通過大數據技術中的Flink 集群實現了航跡數據分布式實時處理和計算。通過Flink 集群和分析型數據庫的配合,實現了在航班經過扇區后實時計算出通過扇區的航班架次,同時把延時時間降低到秒級。本模型的應用能大大改善空管系統中扇區架次統計的短板,對管制員工作負荷的分析有重要的促進意義,對管制一線生產工作有良好的輔助作用。