简介这份全球飞行航线数据以Shapefile格式组织面向GIS开发者、航空交通研究者及数据可视化爱好者可用于航线网络分析、航班流量统计与地理空间可视化。压缩包共15个文件约8.01MB核心为两个.shp几何文件配套.dbf属性表、.prj投影定义、.shx/.sbn/.sbx索引文件以及.xml元数据便于在ArcGIS、QGIS等软件中直接读取和高效查询。已有742人学习下载。数据覆盖全球主要航线包含起止机场坐标、航路点等几何信息并附带.qix快速索引能够支撑航线密度分析、机场间距离测算、高峰时段特征挖掘等场景采用通用投影定义方便与人口、经济等专题数据叠加探索航空交通与区域发展的关联。使用时需确保文件完整并遵守数据许可协议。 之前做了个民航数据可视化的小项目想找一套现成的“全球飞行航线数据shp格式”文件来当底图。网上一搜整理好的shp确实不少但下载下来多多少少有点问题坐标系对不上、字段缺胳膊少腿、打开属性表全是乱码有的干脆就是拿线段瞎画的。后来我干脆自己从OpenFlights的原始CSV数据开始整理一路上把机场表、航线表、格式转换、坐标系这些坑全踩了一遍最后总算在QGIS里渲染出一张像模像样的全球航线网。这篇东西就把整个过程里最值得记录的经验写出来。如果你也需要用shp格式的航线数据做分析或者出图不管你是GIS从业者、数据分析师还是刚接触地理数据的初学者这套流程和踩坑记录应该能帮你省掉不少折腾的时间。1. 航线数据到底是什么样的GIS数据1.1 三类核心数据拼出完整航线网络全球飞行航线数据在GIS里看本质上是一张“有向网络图”。拿到一份比较完整的航线shp通常会包含机场点、航线段两类要素而支撑这些几何的是机场、航空公司、航线三个维度的信息。机场表记录每座机场的IATA三字码、ICAO四字码、城市、国家、经纬度、海拔航空公司表记录航司代码和名称航线表则是核心中的核心每条记录都代表一个航班连接包含起飞机场、降落机场、所属航司、经停次数等字段。如果只是要一张能看的图拿现成的航线shp也能出效果。但如果要做城市连接度分析、航线网络密度统计这类正经分析最好还是自己从原始数据整理。因为很多网上流传的shp在整理时会把双向航线合并成一条无向线段也会丢掉经停信息这对后续的分析影响很大。自己处理一遍至少数据质量是可以保证的。在实际用shp存航线数据时常见的做法是把每条航线存成一条LineString线段起终点坐标直接取机场经纬度。机场数据单独存成一个点要素的shp两者通过机场代码关联。这个结构简单直接也是目前大多数公开航线数据集的通用方案。1.2 shp不是“一个文件”而是一套文件新手最容易栽的跟头就是以为shapefile是一个单独的文件。实际上shp格式是一组文件抱团组成的至少包含三个核心文件缺一不可。.shp主文件存几何图形信息也就是那些点和线.shx形状索引文件帮程序快速定位图形位置.dbf属性表文件存每条要素对应的机场名、航司代码等非空间信息除了这三个还经常能见到.prj坐标参考文件、.cpg字符编码文件、.sbn和.sbx空间索引这些配套文件。很多人从网上下载或者U盘拷文件只拖了后缀是.shp的那个结果拿回来在GIS软件里怎么都打不开报错提示找不到配套文件。这就是没搞清楚shp的“合租模式”造成的。你可以把shp格式理解成一套合租房的钥匙、门牌号、住户清单三个缺一不可。.shp管“房子长什么样”.shx管“哪把钥匙开哪扇门”.dbf管“房子里住着谁”。拷贝的时候把这三个文件放在同一个目录下名字保持一致才算完成了一次完整的文件转移。2. 航线数据从哪里来2.1 主流开源数据源怎么选做全球航线数据绕不开的开源数据源主要有三个OpenFlights、OurAirports以及各类GIS数据社区整理好的现成shp。OpenFlights是我最推的起点。它的机场表airports.dat和航线表routes.dat都是CSV格式字段齐全、更新频率高而且允许非商业用途下载使用。其中routes.dat大概有6万多条航线记录覆盖全球大多数定期航班拿来做可视化绰绰有余。OurAirports则侧重于机场点数据每个机场的几何信息更规范但航线数据不是它家的强项。网上也有很多已经处理好的“全球航线shp”可以直接下载这类数据对只需要快速出图的人来说很方便。但我的建议是下载之后务必先检查三件事坐标系是不是WGS 84、字段含义是否清晰、航线方向有没有被合并。如果这些答案都不确定宁可多花点时间自己整理也别直接拿去交差。2.2 用OpenFlights原始文件自己组装航线shp自己整理没有想象中那么复杂核心思路就是把OpenFlights的CSV航线表和机场表关联起来按起终点经纬度生成线段再导出成shp。整个过程用Python写个脚本就能完成大概三四十行代码。先到OpenFlights官网下载airports.dat和routes.dat两个文件。机场文件里包含机场ID、名称、城市、IATA码、ICAO码、经纬度等字段航线文件里包含航空公司、起飞机场、目的机场、经停次数、航班设备等字段。注意这两个CSV里有一部分字段本身带有逗号比如机场名称所以读取时不要用简单的split(,)要用csv模块或者pandas来处理。下面是我整理时用的脚本逻辑比较直白import geopandas as gpd import pandas as pd from shapely.geometry import LineString # 1. 读取机场表构建 IATA 三字码 - 经纬度 的映射 airports pd.read_csv( airports.dat, headerNone, names[id, name, city, country, iata, icao, lat, lon, alt, tz, dst, tz_db, type, source], enginepython, escapechar\\, ) airport_coord {} for rec in airports.itertuples(): iata str(rec.iata).strip() if iata and iata ! \\N: try: airport_coord[iata] (float(rec.lon), float(rec.lat)) except ValueError: continue # 2. 读取航线表生成 LineString routes pd.read_csv( routes.dat, headerNone, names[airline, airline_id, src, src_id, dst, dst_id, codeshare, stops, equipment], enginepython, ) features [] for rec in routes.itertuples(): # 只保留直达航线经停为0控制数据量 if str(rec.stops).strip() not in (0, 0.0): continue src str(rec.src).strip() dst str(rec.dst).strip() if src not in airport_coord or dst not in airport_coord: continue if src dst: continue line LineString([airport_coord[src], airport_coord[dst]]) features.append({ geometry: line, properties: { airline: rec.airline, src: src, dst: dst, stops: rec.stops, } }) # 3. 生成 GeoJSON中间格式方便预览 gdf gpd.GeoDataFrame.from_features(features, crsEPSG:4326) gdf.to_file(routes.geojson, driverGeoJSON) print(生成航线数量:, len(gdf))脚本跑完会得到一个routes.geojson文件里面有五六万条航线线段。GeoJSON在网页端、QGIS里都能直接打开预览。如果只是自己用这个中间格式完全够如果要求交付shp格式再用命令行转一下就行。注意脚本里我主动过滤了经停不为0的航线因为保留所有中转航线会让数据量暴涨而且很多中转航线的起终点并没有实际连接意义。如果你做的是全量航线网络分析可以删掉这个过滤条件但文件体积和渲染性能要做好心理准备。3. GeoJSON转shp格式三种工具一次讲透GeoJSON转shp算是GIS数据日常里最高频的操作之一尤其现在很多在线数据源默认提供的是GeoJSON格式而传统GIS工具链、老旧的数据库系统、部分外包交付需求还是只认shp。我整理一下三种最常用的转换方式覆盖图形化操作、命令行批量处理、Python脚本三种场景。3.1 QGIS图形界面导出适合一次性操作如果你的数据量不大或者只是偶尔转换一次用QGIS的图形界面最省心。操作路径很直观把GeoJSON文件拖进QGIS右键图层选择“导出”-“要素另存为”然后在格式里选“ESRI Shapefile”文件编码记得选UTF-8坐标系保持原样就行QGIS会自动帮你生成整套shp文件。这里有一个容易忽略的选项在导出对话框里可以设定字段类型和长度。如果GeoJSON里的数字字段被识别成了字符串可以趁导出时手动改成整数型或浮点型避免后续做统计时还得来回转换。图形界面直观是优点但同时也意味着每次转换都要手动点好几下如果一天要转几十个文件效率不太行。3.2 ogr2ogr命令行批量处理适合重复性任务批量转换、要写进发布流程、或者服务器上没有图形界面的情况下ogr2ogr才是正统解法。它是GDAL/OGR工具集里的转换命令几乎所有GIS环境里都有。最基本的转换ogr2ogr -f ESRI Shapefile -lco ENCODINGUTF-8 routes.shp routes.geojson这条命令指定了输出格式为ESRI Shapefile输出文件的编码为UTF-8。如果不加-lco ENCODINGUTF-8有些环境下生成的dbf默认编码可能不是UTF-8在QGIS里打开属性表就会看到中文乱码。如果需要顺带转换坐标系比如从WGS84经纬度转成Web墨卡托ogr2ogr -t_srs EPSG:3857 -f ESRI Shapefile -lco ENCODINGUTF-8 routes_merc.shp routes.geojsonogr2ogr还有一个实用参数是-sql可以在转换的同时做字段筛选、条件过滤相当于在转换环节就把数据清洗掉一部分。比如只想保留某几家航司的航线完全不用先写Python脚本处理直接一条SQL语句搞定。这个命令批量处理几十个文件也就是一个for循环的事建议所有经常和数据打交道的人都把它用熟练。3.3 Python geopandas脚本化适合融入数据管道如果整个数据流程本来就是用Python搭的那直接用geopandas来转最自然。geopandas底层用的就是GDAL所以写起来很简洁import geopandas as gpd gdf gpd.read_file(routes.geojson) # 可以在这里做字段筛选、数据清洗 gdf gdf[[airline, src, dst, stops, geometry]] gdf.to_file(routes.shp, encodingutf-8, driverESRI Shapefile)用geopandas转shp有个好处中间的清洗、字段名调整、坐标系转换可以顺势一起做掉整个数据管道用一份Python代码就管住了。缺点是首先得把geopandas、shapely这些依赖装上如果你只是偶尔转一次文件装这一堆依赖不太划算。三种方式的选择逻辑其实很简单一次性操作用QGIS批量干净利落用ogr2ogr所有流程都是自动化脚本用geopandas。没有一种方式是绝对最好的只看哪个跟你的工作流更匹配。4. 坐标参考、编码和字段这些坑4.1 坐标系WGS84和Web墨卡托别混用全球航线数据的坐标基本都基于WGS 84地理坐标系也就是EPSG:4326单位是经纬度。这个坐标系简单直观但有个麻烦它的单位不是米所以拿它直接算距离、面积会得到错误结果。很多在线地图底图用的是Web墨卡托投影EPSG:3857单位是米。如果你把EPSG:4326的航线shp直接叠加到EPSG:3857的底图上QGIS、ArcGIS这些软件会自动做动态投影显示上没问题但一旦你执行空间连接、缓冲区分析这类计算软件就会弹出坐标系不一致的警告处理不好就出现几十上百公里的位置偏移。我的习惯是底图和分析图层的坐标系必须统一。如果只是出图展示直接用WGS84也够用如果要计算距离或叠加到在线底图先把数据转成EPSG:3857再往下走流程。另一个细节机场点的经纬度在属性表里通常会以“lat”“lon”两个字段存在但shp文件本身的几何信息里也有一份坐标。有的新手会搞混这两种坐标以为改了属性表里的经纬度字段点就会移动实际上几何信息完全没变。在GIS里属性表只是“说明书”几何才是真正的“地图”。4.2 dbf字段和编码的“隐藏规则”shapefile的dbf属性表用的是老式的dBase格式有几个历史遗留的硬性限制不少人在这个上面吃过亏。第一字段名长度最多10个字符。GeoJSON里如果有个字段叫“international_code”转成shp后会被自动截断成“internatio”同时可能因为字段名重复而报错。这个没有太好的解决办法只能尽量把字段名设短一些像airline、src、dst这种长度就合适。第二dbf字段类型对中文支持不友好。虽然可以使用UTF-8编码但有些老式GIS软件只支持GBK甚至Latin-1导致属性表里的中文变乱码。解决方案是在保存shp时统一指定编码。用ogr2ogr转就加-lco ENCODINGUTF-8用QGIS导出就在编码下拉框里选UTF-8geopandas则是encoding参数里写utf-8。第三shp不支持一个文件里混合多种几何类型。如果你生成的GeoJSON里既有LineString又有Point直接转shp会报错就算某个要素几何类型为MultiLineString和普通LineString混在一起也不被接收。所以转格式之前务必检查几何类型是否统一一种类型一个文件。shp本身也有2GB的体积上限而且是非压缩格式航线数据量大、字段又多的时候文件体积增长很快。我的建议是中间处理和预计算阶段优先用GeoPackage格式这个格式支持压缩、没有2GB限制、一个文件打包所有图层只有最终交付或对接外部工具时才转成shp。很多踩坑踩到怀疑人生的项目把格式换成GeoPackage之后问题直接消失。5. 航线数据可视化与典型应用5.1 用QGIS画一张航线网络图有了全球航线shp第一件想做的事肯定是把它画出来看看效果。QGIS里操作很简单把shp直接拖进去调整样式就行。航线数据量大默认的实线样式会糊成一团黑需要手动设置透明度、线宽和颜色。我一般把线路颜色设为浅蓝色透明度调到50%左右线宽设成0.3毫米。这样密集区域能看出高亮的核心走廊稀疏区域也不会变成单一黑线。如果想要表达航线方向可以在符号化的“线”选项卡里选择“简单线”并添加箭头标记箭头会沿着线段方向绘制。不过全球几万条航线全带箭头渲染压力有点大一般只对局部子集开启。渲染完成后能明显看出全球航线网络的基本骨架欧洲、北美东部、东亚、中东以及跨太平洋航线最为密集南美、非洲内部航线相对稀疏大洋洲则呈现出典型的“孤岛-干线”结构。这种直观的视觉信息是任何统计图表都替代不了的。5.2 航线数据的分析延展航线shp不是只能拿来出图它能做的分析非常多。最简单的应用是城市连接度分析以机场点作为节点统计每个机场作为起降点的航线数量就能得到这座城市的航空网络辐射能力。这里要注意的是航线shp里A到B和B到A通常是两条记录做有向网络分析时要保留方向语义做无向连接度统计时则需要先合并双向航线。再往上走可以用NetworkX这类图分析工具把shp里的航线读取为网络的边计算度中心性、介数中心性等指标识别哪些城市是真正的枢纽节点。把航线数据和人口、经济数据叠在一起还能做很多有趣的交叉分析比如“某区域航线密度与GDP的关系”“机场与城市群发展的协同程度”等等。对做交通、旅游、物流方向的人来说全球航线shp是一个基础数据底座很多业务问题的探索都可以从这张网络开始。而对数据可视化爱好者来说把全球航线渲染成一张带流动感的网络图本身就是一件很有成就感的事。6. 常见问题排查与避坑经验6.1 常见问题排查速查表下面这些问题是我在整理数据过程中实际遇到过的也问过身边不少同行整理成了一份速查表遇到类似情况可以对照排查。现象可能原因处理方式打开shp提示缺少文件只拷贝了.shp缺少.shx和.dbf确保三个核心文件同目录同名属性表中文乱码保存时未指定UTF-8编码或打开时编码识别错误用QGIS数据源管理器指定UTF-8或加-lco ENCODINGUTF-8重转图层显示位置明显偏移坐标系或.prj文件丢失原数据不是EPSG:4326确认数据源坐标系用“定义投影”或重投影修复航线全部变成点几何类型不统一LineString被转为Point检查几何类型shp一个文件只支持一种几何转换shp时字段被截断dbf字段名上限10个字符转换前把字段名缩短到10字符以内导出shp后文件特别大字段过多、几何过于复杂、未过直接航线过滤精简字段过滤经停航线或先用GeoPackage保存航线表里有很多重复记录同一航线由不同航空公司执飞属于正常情况按需去重但保留航司维度会丢失部分信息6.2 几条实用的避坑经验最后分享几条经验都是我踩过坑之后总结出来的。第一从网上下载的任何shp拿到手第一件事就是在QGIS里查看坐标参考信息不要直接往下游工具里丢。很多看似正常的shp坐标系是未定义状态后续分析全乱。第二shp属性表的字段名尽量用英文短名不要存中文长文本。虽说技术上支持但不同软件对中文支持的差异极大换一个环境就可能乱码。要做中文映射宁可在后续展示图层时做字段别名也别在shp里硬存中文。第三千万记得保留数据源文件和处理脚本。原始数据、中间GeoJSON、最终shp这三层文件建议都留一份。你当时觉得没有用的中间文件很可能过一个月之后改需求时又要用。我在整理航线数据时就是这样第一次只留了最终的shp后来想加一个机场时区字段发现还得从头处理原始数据教训相当深刻。我个人实际操作下来的体会是全球飞行航线数据这套东西真正难的不是“找到数据”而是“把数据处理成自己能用、还敢用的状态”。如果你只是画一张示意图网上的现成shp可以应付但只要你打算做量化分析或者对数据做任何形式的二次加工那就老老实实从原始CSV开始走一遍。自己整理一遍之后后续出图、分析、交付整个链路都顺很多。本文还有配套的精品资源点击获取