ADS-B数据

笔者使用过的ADS-B数据可以在adsbexchange.com网站的历史数据存档中下载。他建议大家每GB捐款10块钱,用来帮助支付带宽成本。数据每天以压缩文件的形式下载。每个压缩文件包含一个带有ADS-B数据的JSON文件。你还可以看到JSON数据的格式

使用json库在Python中加载JSON数据。不幸的是,JSON数据偶尔会出现一些奇怪的现象(比如列表中额外的逗号),因此在json库能够接受所有文件作为有效JSON之前,需要进行一些字符串处理。

由于加载JSON文件的速度非常慢,一旦数据被加载并按地理位置进行文件处理,就会将其保存到一个中间文件中,以便在以后的执行中把它更快的加载出来。

pymap3d库用于坐标转换。在ECEF坐标下计算多普勒频移。使用CartopyOpenStreetMap一起绘制地图。

下图显示了10:00 UTC-12:00 UTC之间所有经过录制信标区域的飞机的航迹。航迹用多普勒频移显示,红色代表正向多普勒频移,蓝色代表反向多普勒频移。地图上出现的大多数飞机都是从巴拉哈斯的36L和36R跑道起飞的,因为巴拉哈斯通常向北飞行(起飞跑道为36L和36R,降落跑道为32L和32R)。

信标的位置用橙色的圆圈显示,而笔者的接收机的位置用红色的圆圈显示。

每架飞机的多普勒频移轨迹现在可以叠加在瀑布图上,以匹配每架飞机的反射。在下面的图片中你就可以看到。每一个多普勒频移轨迹都显示飞机的呼号国际民航组织(ICAO)的十六进制标识。笔者亲自挑选了所有反射2.3GHz信标的飞机,并用橙色标出了它们的航迹。未产生可见反射的飞机航迹用白色标记。

既然笔者已经亲自选择了哪架飞机产生了反射,而哪一架飞机没有反射,我们就可以重新绘制飞机航迹的地图,用红色标记产生反射的飞机,用蓝色标记没有反射的飞机。如下图所示。

我们可以看到,飞机产生反射的可能性在很大程度上取决于飞机飞行的航线。这就促使了我们更详细地研究飞机的航线。

从巴拉哈斯出发的航班

地图上出现的大多数飞机都是从巴拉哈斯(马德里-巴拉哈斯)机场的36L和36R跑道起飞的。这些飞机飞行的航线称为标准仪表离场,或SID。有关于某些机场的SID资料,可在相关的AIP(航空信息资料汇编)中找到。西班牙机场的AIP可在ENAIRE网上找到。

第36L跑道的白天SID如下图所示。它们被标识为最终定位的名称、修订版SID的编号以及指示初始路线的字母。目前为BARDI2K, BARDI2T, CCS1K, CCS1T, NANDO2N, PINAR2N, RBO1N, SIE1K, SIE1T, VTB1K, VTB1T, ZMR1K and ZMR1T。

下图更详细地显示了最初的航线。在K跑道起飞的飞机直接飞向SSY VOR,然后经SSY R-001飞至SSY DME 2.7,然后右转至026°以截获并跟随BRA R-001。在T跑道上起飞的飞机直接飞向SSY VOR,然后左转至291°以截获飞至SSY DME 5.7的SSY R-321(VTB1T为6.8)。然后,视航线而定,左转或右转。在N跑道上起飞的飞机直接飞向SSY VOR,然后经过SSY R-017到达SSY DME 5.6,然后右转截获飞至BRA DME 12的BRA R-005。

第36R跑道的白天SID如下图所示。目前为BARDI5W, CCS4W, NANDO1D, PINAR1D, RBO1D, SIE2W, VTB1D, ZMR2W。

下图显示了最初航线的详细情况。在W跑道上起飞的飞机沿跑道向BRA DME 5飞行,然后经BRA R-001到达BRA DME 7,然后右转进入SSY R-017。经D跑道起飞的飞机航向016°至BRA DME 5.8以截获并跟随RBOR-222的航向。

下一步我们的研究是根据飞行中的SID对其进行分类。该算法简单但有效。对于每个SID,我们选择一个航路点,并分配给该SID的所有飞机,这些飞机都是在一定距离内飞过的。计算飞机航迹与航路点之间距离的算法也很简单:只考虑JSON数据中的位置,而不是考虑它们之间的插值。虽然算法简单,但能够对所有的飞机进行分类,而且没有任何差错。

分类结果如下图所示。每个SID都以不同的颜色显示。没有任何SID飞行的飞机用黑色显示。这些是巡航飞行中的飞机,大多数是沿UN865和UN870高度航线飞行的。不用关心它们,因为它们都没有产生任何可见的反射。我们可以看到,在所有可能的SID中,只有K、T和D跑道在使用。为了保持每条跑道的交通畅通,不使用N和W跑道也在情理之中:飞机从36L跑道飞离使用321º航向或跑道方向;而飞机从36R跑道飞离使用016º航向。