Python GIS实例编程之航班跟踪

我们平常所见,洁净蓝天,浩瀚万里。实际上时时刻刻,天空中也和地面的马路一样繁忙,处处充满了飞机航班。如果你看见过空管调度的屏幕就知道机场附近天空基本上也是没有一块空闲的空域,处处也都是车水马龙。本文虫虫通过实例给大家讲述Python GIS编程,通过Python抓取开源航班经纬度等数据,并以OSM为底图绘制一个飞机航班分布图,并且实现简单的航班跟踪。

获取飞行数据

实例中,最重要是获取有关航班的信息,实际上开放地互联网早就有很多接口免费提供这些数据。本实例中,我们使用的是ADS-B Exchange(大家如果有更好数据源,可以回复)。ADS-B Exchange是世界上最大的原始飞行数据联合组织。它免费提供世界各地由全球社区提供的航班数据。

执行环境和基本库

在本是实例中,需要用到一些python基本类库,主要有urllib,json,matplotlib和cartopy。请事先安装这些库包。本实例使用Python 3.6环境。import的包主要有以下:

注意各种库中cartopy这个GIS信息库不好安装,直接用pip安装不上,需要下载二进制whl包,下载地址:

然后pip install Cartopy-0.17.0-cp37-cp37m-win32.whl 安装。其他包随pip要随安装。

设置绘图跟踪图

运行代码,你会看到下面有蓝点的地图,那么一切都很好。

爬虫调用接口获取飞行数据

这一步我们利用爬虫调用ADS-B Exchange API服务请求航班数据。该接口会返回JSON格式发回包含可用航班数据。截些JSON然后就可以在地图上绘制数据。

如上所述,我们将跟踪距离中心点几公里范围内的所有航班。例如,距离北京首都国际机场50公里范围。调用的接口是:

在查询接口中URL我们可以看到一些参数,如lat,lng和fDst。

lat是地图的纬度;lng是地图经度;fDst是以km为单位的距离。它将会返回一个距离范围。然后L和U是Lower和Upper条件的后缀字符,更多接口请查询官方网站。

在请求查询之前,我们需要使用build_opener方法和urllib.request库的addheaders方法定义请求和http头。发送查询后,获取数据,设定数据格式为JSON。然后关闭请求。

查询的响应如下所示:

解析JSON

得到json数据后,下一步是解析,获取一些必需的数据。最主要是经纬度坐标,后面会用它来在OSM地图绘制飞机的位置。获取方法是使用Lat和Long键从JSON中提取坐标。其他航班信息包括Call 航班编号,Op飞行航空公司;Spd节速度(1节knot,1.852公里);Mdl:机型(比如空客A320);Man:飞机的制造商。

为提取每架飞机的经度和纬度,对 JSON列表循环查找来实现。首先创建一个空的纬度和经度列表,用存储纬度和经度。然后将他们在OSM上绘制出飞机的位置。

刷新飞机位置

为了更新飞机的位置,我们的实例每秒发送一次请求,每一秒我们都会得到新的接口数据,解析数据并更新位置。该操作使用matplotlib中的animation类来完成。相关代码如下:

代码运行后,你应该获得以红点表示实时航班跟踪图,地图图上显示了有5架航班在空域(注意为了显示效果,我们对地图显示坐标范围做了加大)。

给飞机添加航班编号

在地图上只看到飞机点实际意义不大。让我们来为他们添加一些标签:比如航班编号数据。要获取航班编号的数据,查询数据中的"Call"键对应的信息。下面的代码中,我们在地图上添加了航班编号信息。

好了,最后看一下成品的展示截图。

当然你可以对整个显示做更多的美化(比如用小图标来显示飞机,航空公司等),还可以修改使得增加更多的信息数据,这就作为本文一个作业,留给大家了。

欢迎关注虫虫,实时获得虫虫撰写的实例文章。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181205A1AMYE00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动