基于OpenFlight数据查询特定机场的直飞、一/两次中转航线
如何用OpenFlight数据查询特定机场的直飞、一次中转及两次中转航线
数据说明
所用routes文件包含以下字段:
- Airline:航空公司的2位(IATA)或3位(ICAO)代码
- Airline ID:航空公司的唯一OpenFlight标识符(关联Airline表)
- Source airport:出发机场的3位(IATA)或4位(ICAO)代码
- Source airport ID:出发机场的唯一OpenFlight标识符(关联Airport表)
- Destination airport:到达机场的3位(IATA)或4位(ICAO)代码
- Destination airport ID:到达机场的唯一OpenFlight标识符(关联Airport表)
- Codeshare:代码共享航班标记("Y"表示代码共享,否则为空)
- Stops:航班经停次数("0"为直飞)
- Equipment:航班常用机型的3位代码(空格分隔)
以下以LEX机场为例,基于Pandas实现各类航线查询:
1. 直飞航线查询
先筛选出从LEX出发、无经停(Stops=0)的航线:
import pandas as pd # 读取数据文件 routes = pd.read_csv('routes.csv') airports = pd.read_csv('airports.csv') # 用于后续地图可视化 # 获取LEX的直飞航线 lex_direct_routes = routes[(routes['Source airport'] == 'LEX') & (routes['Stops'] == 0)] # 获取所有直飞目的地机场 lex_direct_destinations = lex_direct_routes['Destination airport'].unique()
2. 一次中转航线查询
逻辑:先找到LEX直飞可达的中转机场,再筛选这些机场出发的航线,排除返回LEX的无效航线:
# 第一步:获取LEX直飞的中转机场列表 lex_transfer_hubs = lex_direct_routes['Destination airport'].unique() # 第二步:筛选所有从中转机场出发的航线 one_transfer_routes = routes[routes['Source airport'].isin(lex_transfer_hubs)] # 过滤掉返回LEX的航线,避免循环 one_transfer_routes = one_transfer_routes[one_transfer_routes['Destination airport'] != 'LEX'] # 关联Airports表获取目的地经纬度,用于folium绘图 one_transfer_routes_with_loc = pd.merge( one_transfer_routes, airports, left_on='Destination airport ID', right_on='id', how='left', suffixes=['_route', '_airport'] )
这类航线对应路径:LEX → 中转机场 → 最终目的地
3. 两次中转航线查询
逻辑:基于一次中转的目的地作为第二次中转起点,筛选其出发航线,排除回到LEX及首次中转机场的循环航线:
# 第一步:获取一次中转的所有目的地(即第二次中转的起点机场) second_transfer_hubs = one_transfer_routes['Destination airport'].unique() # 第二步:筛选所有从第二次中转起点出发的航线 two_transfer_routes = routes[routes['Source airport'].isin(second_transfer_hubs)] # 过滤掉回到LEX或首次中转机场的无效航线 excluded_airports = ['LEX'] + list(lex_transfer_hubs) two_transfer_routes = two_transfer_routes[~two_transfer_routes['Destination airport'].isin(excluded_airports)] # 关联Airports表获取经纬度 two_transfer_routes_with_loc = pd.merge( two_transfer_routes, airports, left_on='Destination airport ID', right_on='id', how='left', suffixes=['_route', '_airport'] )
这类航线对应路径:LEX → 中转机场1 → 中转机场2 → 最终目的地
内容的提问来源于stack exchange,提问作者Irene
相关产品推荐
相关产品推荐

