QGIS中几乎实时的实时数据可视化(空中交通用例)

2020-09-23 18:53:17

主页:实时数据qgis教程qgis中几乎实时的实时数据可视化(空中交通使用案例)。

当使用像QGIS这样的GIS软件时,我们主要是处理静态数据,如街道、建筑、土地覆盖等,或者可能是具有时间信息的数据,以便我们可以可视化地显示时间变化。将实时数据近乎实时可视化怎么样?我们是否需要GIS服务器、云服务或地图服务?我认为这是一个有趣的话题,我将在这篇文章中结合实际的空中交通数据使用案例来讨论这一问题。

在上一篇文章中,我介绍了如何用Python构建带有开放空中交通数据的航班跟踪应用程序。该应用程序在Web浏览器中运行,航班数据将在指定的时间间隔内更新。在本教程中,我们将在QGIS中做同样的事情。我们会在QGIS地图画布上可视化空中交通实时数据,每隔5秒或10秒就会得到更新数据。在本教程结束时,我们将获得一个几乎实时的飞机在一个区域内的位置,如下面的图1所示。

图2是显示系统如何工作的模式。从模式中可以看出,Python扮演着请求数据、获取响应、处理数据并将数据存储为CSV纯文本的角色。另一方面,QGIS将根据数据绘制飞机位置,并间隔刷新以获取最新信息。要实现这一点,我们不需要任何GIS服务器、云或地图服务。只要机器上安装了Python和QGIS,任何人都可以进行Internet连接。

基于模式,本教程由几个子主题组成,例如:获取数据(发送请求和处理响应)、在QGIS地图画布上绘制数据并在一定时间间隔内呈现数据。让我们开始吧!

本教程的数据来自OpenSky Network,这是一个提供全球空中交通数据的协会。有一些API可用于从OpenskyNetwork检索数据,例如:Python API、Java API和REST API。在本教程中,我们将使用rest API来检索指定边界区域内的数据。

为了检索区域内的空中交通数据,需要在地理坐标系中定义最小坐标和最大坐标。例如,我想获取美国上空的所有飞机,其最小坐标和最大坐标分别为-125.974、30.038和-68.748、52.214。匿名请求数据的REST API查询如下:

匿名请求有10秒的解析,这意味着我们可以每10秒发送一次请求。另一方面,如果你是注册用户,分辨率会更快,大约5秒。要以注册用户身份发出请求,查询中必须包括用户名和密码。则查询将为:

要尝试查询,只需将其复制并粘贴到浏览器中。如果您收到如图3所示的响应,则表示它工作正常,我们准备继续下一步。此外,如果您想更详细地了解OpenSky Network的空中交通数据响应,请访问rest API文档。

在本步骤中,我们将编写Python代码来请求实时空中交通数据并处理响应。完整的代码可以在本节末尾找到。

我们从导入一些库开始,即:Requests、json、CSV和Time。然后用最小坐标和最大坐标定义坐标范围。接下来,在第16行指定将存储响应数据的输出路径,因此请确保与您的路径一起更改。如果您是OpenSky Network的注册用户,请在第19-20行的USER_NAME和PASSWORD变量中提供您的用户名和密码。代码的最后一部分用于使用请求发送查询,获取JSON格式的响应,并将其保存到CSV文件中。此过程将在间隔10秒(对于匿名请求)或5秒(对于注册用户)内循环完成。

Ideagora geomatics实时空中数据流量请求|www.geodose.com|@ideageo';';';#导入库导入请求导入json导入CSV导入时间#面积范围坐标GCSWGS84 lon_min,lat_min=-125.974,30.038 lon_max,lat_max=-68.748,52.214#csv输出路径csv_data=';/home/data.csv';#rest API query user_name=';';Password=';';url_data=';https://';+用户名+';:';+Password+';@opensky-network.org/api/states/all?';+';lamin=';+str(Lat_Min)+';&;lomin=';+str(Lon_Min)+';&;lamax=';+str(Lat_Max)+';&;Lomax=';+str(Lon_Max)ol_name=[';icao 24';,';呼号';,';,';,';时间_位置';,';上次联系';,';长';,';纬度';,';baro_alight';,';在_GROUND';,';SPI';,';TRUE_TRACK';,';垂直速率';,';传感器';,';GEO_ALATION';,';squawk';,';SPI';,';位置_源';]#请求间隔(如果用户名!=';';和密码!=';';:SLEEP_TIME=5 ELSE:SLEEP_TIME=10#获取数据并存储到CSV,而COL_NAME!=';';:使用OPEN(CSV_DATA,';w';)AS CSV_FILE:CSV_WRITER=CSV。编写者(CSV_FILE,DELIMITER=';,';,报价=';&34;';,报价=CSV。QUOTE_ALL)CSV_编写器。Writerow(Colname)Response=REQUESTS。Get(Url_Data)。Json()try:n_response=len(Response[';States';])Exception:Pass Else:For i in Range(N_Response):Info=Response[';States';][i]CSV_Writer。写入者(信息)时间。睡眠(睡眠时间)打印(';获取';,len(响应[';状态';]),';数据';)。

使用Python扩展名(.py)保存代码,并从命令提示符或终端运行它。如果使用python3,则键入python或python3,后跟文件名。代码将如下面的图4所示运行。

不要关闭航站楼,因为它会不断地从OpenSky Network获取最新的空中交通数据,我们将在QGIS中使用它。

我们已经获得了实时数据流,现在让我们通过以下步骤在QGIS中可视化它。

将CSV数据添加到QGIS中。在数据源管理器中,选择左侧菜单中的分隔文本。然后在右侧,选择文件名。在几何图形定义部分中,为X字段选择Long Column,为Y字段选择Lat Column。确保获得正确的样本数据。如果没有,请尝试使用“自定义分隔符”选项更改“文件格式”部分的分隔符属性。

按下数据源管理器中的添加按钮后,飞机在请求区域内的位置将绘制在QGIS地图画布上。要使其在地理空间范围中更有意义,请添加底图。为了添加底图,我使用了Tile+Plugin,它提供了一些流行的底图。对于这种情况,我使用了雄蕊地形底图。图6用雄蕊地形底图显示了所有飞机在美国上空的位置。

到目前为止,我们已经以静态的方式获得了飞机的位置。飞机的位置不会改变,因为它不获取任何更新的数据。因此,在这最后一步中,我们将使其具有动态性。飞机的位置将每隔5秒或10秒更新一次。然后,我们将用飞机图标更改点标记,并将其与轨迹方向分别旋转。

首先让我们把点标记换成飞机图标。右键单击数据层,然后选择属性。在左侧菜单中选择symbology,然后选择Topo Airport图标,如图7所示。

要设置标记的旋转角度,请选择旋转参数右侧的菜单,然后选择字段类型:...。然后选择TRUE_TRACK列(参见图8)。在继续下一步之前,请单击Apply或OK按钮。您应该看到飞机标记,并且它在飞行方向角度上旋转,如图9所示。

最后,让我们在一定的时间间隔内更新数据。选择数据图层,然后再次选择属性。在左侧菜单中,选择渲染。在右侧窗口中选中Refresh layer at interval(秒)选项,并将其设置为5或10,如图10所示。这意味着该层将每5秒或10秒刷新一次。如果在刷新后发生任何数据更改,飞机的位置将被更新,我们将获得几乎实时的空中交通实时数据,这些数据在QGIS中可视化,如图1所示。

这就是本教程中如何在QGIS中可视化几乎实时的实时数据的全部内容。我认为,这种方法可以应用于其他情况,比如可视化来自传感器的数据,这些传感器可以在水位、温度、湿度等领域进行测量。希望这篇文章能启发您,感谢您的阅读!