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 知识体系总览

下面这张图把本章的核心概念串起来了。你可以把它当作一个思维导图来理解。

坐标系与地理基础知识体系 坐标系与地理基础 — 知识体系 地理基础 WGS-84 坐标系 经纬度 & 高度 地球模型(椭球体) 地理围栏 地心地固 GPS 输出 纬度 经度 长半轴 扁率 圆形 多边形 走廊 提示:所有航线规划系统都依赖这些基础概念。理解它们,才能避免“坐标打架”的问题。 建议在项目初期就统一坐标系基准,并明确高度类型。

2.6 本章小结

这一章的内容,说白了就是回答三个问题:

  1. 飞机在哪儿?——用 WGS-84 经纬度和高度来描述。
  2. 地球长什么样?——一个椭球体,不是正球体。
  3. 怎么限制飞机活动范围?——用地理围栏。

我个人觉得,坐标系和地理基础是航线规划里最容易被忽视、但出错代价最高的部分。你花 10 分钟搞清楚这些概念,可能省下后面 10 小时的调试时间。

实用工具推荐:

  • pyproj:Python 坐标转换库,支持 WGS-84、CGCS2000 等。
  • geopy:距离计算、地理编码。
  • shapely:几何操作,包括地理围栏的包含判断。