2. 坐标系与地理基础:WGS-84、经纬度与地球模型
做航线规划,第一件事不是写代码,而是搞清楚飞机到底在哪儿。
你可能觉得这很简单——不就是经纬度吗?我刚开始也这么想。直到有一次,我拿到的地图数据和无人机飞控用的坐标系不一样,结果规划的航线偏出去好几百米。嗯,从那以后,我再也不敢小看坐标系这回事了。
2.1 WGS-84 坐标系:全球通用的“尺子”
WGS-84,全称 World Geodetic System 1984。说白了,它就是一把全世界通用的尺子。GPS 卫星用的就是这套坐标系,我们手机里的定位芯片输出的也是 WGS-84 坐标。
为什么需要统一坐标系?你想想看,如果北京用一套坐标系,上海用另一套,那飞机从北京飞到上海,航线根本接不上。WGS-84 解决了这个问题——它把整个地球用一个数学模型固定下来,任何地点都有唯一的经纬度值。
核心要点:WGS-84 是一个地心地固坐标系(ECEF),原点在地球质心,Z 轴指向北极,X 轴指向本初子午线与赤道的交点。所有 GPS 设备输出的经纬度,默认都是 WGS-84。
我个人习惯,在项目一开始就确认数据源是 WGS-84 还是其他坐标系。如果是国内的一些测绘数据,很可能是 CGCS2000 或北京 54,需要做坐标转换。我曾经踩过这个坑——直接把 CGCS2000 的坐标当 WGS-84 用,航线偏了 200 多米。
2.2 经纬度与高度:三维空间的定位
经纬度确定的是平面位置,高度确定的是垂直位置。三者合起来,才能完整描述一个三维空间点。
- 纬度(Latitude):范围 -90° 到 +90°,赤道为 0°,北正南负。
- 经度(Longitude):范围 -180° 到 +180°,本初子午线为 0°,东正西负。
- 高度(Altitude):通常指海拔高度(MSL),也有用椭球高度的。
注意:高度有两种常见基准:
- 海拔高度(MSL):相对于平均海平面。飞控里常用的高度。
- 椭球高度:相对于 WGS-84 椭球面。GPS 直接输出的是椭球高度。
两者之间有个差值,叫大地水准面差距(Geoid Undulation)。我建议你在做航线规划时,搞清楚飞控用的是哪种高度,否则高度偏差可能达到几十米。
2.3 地球模型:椭球体不是正球体
地球其实不是完美的球体。它两极稍扁,赤道略鼓。WGS-84 用一个椭球体来近似地球形状,参数如下:
| 参数 | 值 | 说明 |
|---|---|---|
| 长半轴 a | 6,378,137.0 m | 赤道半径 |
| 短半轴 b | 6,356,752.3142 m | 极半径 |
| 扁率 f | 1 / 298.257223563 | (a - b) / a |
| 偏心率 e² | 0.00669437999014 | 用于计算 |
为什么要在意这个?因为航线规划里很多计算——比如两点之间的距离、航向角——都需要用到椭球模型。如果简单地把地球当球体算,误差在赤道附近可能不大,但在高纬度地区,误差会显著增加。
我记得有一次做极地航线规划,用球体模型算出来的距离和实际差了将近 5%。后来改用 Vincenty 算法(基于椭球体),误差才降到可接受范围。
实用建议:在代码里计算距离时,直接用 geopy 或 pyproj 这类库,它们已经封装好了椭球模型。别自己手写球面距离公式,除非你很清楚误差范围。
2.4 地理围栏:虚拟的“电子栅栏”
地理围栏(Geofence)就是在地图上画一个虚拟边界。飞机进入或离开这个边界时,系统会触发相应动作——比如报警、悬停、返航。
常见的围栏形状:
- 圆形:指定圆心和半径。最简单,适合禁飞区。
- 多边形:指定一系列顶点。适合不规则区域,比如机场净空区。
- 走廊:沿航线两侧扩展。适合航道保护。
判断点是否在围栏内,常用的算法:
- 射线法(Ray Casting):从目标点发出一条射线,统计与多边形边的交点数。奇数在内,偶数在外。
- 绕数法(Winding Number):计算多边形绕目标点的圈数。非零则在内。
避坑指南:我曾经遇到过一个问题——用射线法判断点是否在多边形内时,如果射线正好穿过顶点,结果会出错。解决方案是加一个微小偏移量,或者用绕数法替代。另外,经纬度坐标不能直接用平面几何算法,需要先投影到平面坐标系(如 UTM)。
2.5 知识体系总览
下面这张图把本章的核心概念串起来了。你可以把它当作一个思维导图来理解。
2.6 本章小结
这一章的内容,说白了就是回答三个问题:
- 飞机在哪儿?——用 WGS-84 经纬度和高度来描述。
- 地球长什么样?——一个椭球体,不是正球体。
- 怎么限制飞机活动范围?——用地理围栏。
我个人觉得,坐标系和地理基础是航线规划里最容易被忽视、但出错代价最高的部分。你花 10 分钟搞清楚这些概念,可能省下后面 10 小时的调试时间。
实用工具推荐:
pyproj:Python 坐标转换库,支持 WGS-84、CGCS2000 等。geopy:距离计算、地理编码。shapely:几何操作,包括地理围栏的包含判断。