坐标系与地图基础:WGS84、UTM、高程与常用地图服务

做无人机航线规划,第一个绕不开的问题就是:飞机到底在哪儿?

你可能会说,GPS 告诉我不就完了?嗯,没那么简单。GPS 给的是一个经纬度,但经纬度本身只是一个“球面上的角度”,不是平面坐标。而我们的航线、航点、飞行路径,最终都要落到一个可计算的平面上去。

我刚开始做无人机项目时,就吃过这个亏。有一次在山区做测绘航线,直接用 GPS 坐标算距离,结果两条航线之间的间距在地面上差了十几米。后来才发现,是坐标系转换没做对。从那以后,我每次做航线设计,第一件事就是确认:当前用的是哪个坐标系?

核心观点:坐标系是航线设计的“地基”。地基歪了,上面盖的楼再漂亮也没用。本章我们就把这个地基打牢。

2.1 WGS84 坐标系:全球通用的“球面尺子”

WGS84(World Geodetic System 1984)是目前 GPS 系统使用的全球大地坐标系。说白了,它就是一把“球面尺子”,用来描述地球表面任意一点的位置。

它的核心参数有三个:

  • 长半轴 a = 6378137.0 m(赤道半径)
  • 扁率 f = 1/298.257223563(地球不是正圆,是椭球)
  • 地心:坐标系原点在地球质心

你拿到的 GPS 坐标,比如 39.9042°N, 116.4074°E,就是 WGS84 下的经纬度。但注意,这个坐标是角度,不是距离。1°经度在赤道上约 111 km,到了北京就只剩约 85 km 了。所以直接用经纬度算距离,会出大问题。

我的经验:在 PX4 或 ArduPilot 的航线脚本里,航点坐标通常直接写 WGS84 经纬度。但如果你要做航线间距计算、区域覆盖规划,必须先把经纬度转成平面坐标再算。我习惯用 proj 库做转换,后面会讲到。

2.2 UTM 投影:把球面“拍平”成平面

WGS84 是球面坐标,但航线规划需要在平面上算距离、算面积。怎么办?投影。

UTM(Universal Transverse Mercator,通用横轴墨卡托投影)是最常用的投影方式之一。它把地球分成 60 个带(Zone),每个带宽度 6°经度,然后分别投影到平面上。

UTM 坐标长这样:50N 450000 4400000,意思是:

  • 50N:第 50 带,北半球
  • 450000:东向坐标(米),距中央经线 450 km
  • 4400000:北向坐标(米),距赤道 4400 km

这样一来,距离计算就简单了:直接用勾股定理。

特性 WGS84 经纬度 UTM 平面坐标
单位 度(°) 米(m)
适用场景 全球定位、航点记录 航线计算、面积测量
变形 无(球面) 有(投影变形,带内 < 0.1%)
带号 无 60 个带,需指定

注意:UTM 投影在带边界附近变形较大。如果你的航线跨越两个带(比如东西跨度超过 6°经度),建议改用兰伯特等角圆锥投影,或者分带处理。我曾经在新疆做过一条东西向 500 km 的航线,跨越了 44 和 45 两个带,结果在带边界处航线出现了 2 米的偏移。后来我改用高斯-克吕格投影才解决。

2.3 高程系统:海拔、椭球高、大地高

无人机不光要知道平面位置,还得知道高度。但“高度”这个词其实很模糊。

常用的高程系统有三种:

  1. 椭球高(Ellipsoidal Height):相对于 WGS84 椭球面的高度。GPS 直接给的就是这个值。
  2. 大地高(Orthometric Height / 海拔):相对于大地水准面(平均海平面)的高度。地图上标的“海拔”就是这个。
  3. 正高(Normal Height):我国常用的高程系统,基于似大地水准面。

它们之间的关系是:
椭球高 ≈ 大地高 + 高程异常

高程异常在不同地方差异很大。比如在青藏高原,差值可能达到 50-80 米。如果你直接用 GPS 的椭球高做仿地飞行,飞机会撞山的。

避坑指南:我曾经在云南做电力巡线,直接用 GPS 高度设定了 30 米的相对高度。结果飞机飞到山顶时,实际离地只有 5 米。后来查了当地的高程异常模型,发现椭球高比海拔高了 25 米。从那以后,我每次做航线都会加载 EGM2008 或 EGM96 模型做高程转换。

在 PX4 中,你可以通过 QGCParam: LND_EKF_HGT_REF 设置高度参考源。我建议:

  • 平原地区:用气压计 + GPS 融合
  • 山区:用 RTK + 数字高程模型(DEM)
  • 近海:用雷达高度计

2.4 常用地图服务:Google Earth 与奥维地图

做航线规划,离不开地图服务。我常用的两个是 Google Earth 和奥维地图。

2.4.1 Google Earth

Google Earth 的优势在于:

  • 全球高分辨率卫星图:大部分地区分辨率优于 1 米
  • 3D 地形:可以直观看到山体、峡谷
  • KML/KMZ 支持:可以导出航点、航线、区域
  • 历史影像:对比不同时期的植被、建筑变化

我一般用它做航线预规划:先在 Google Earth 上标出兴趣点、障碍物、起降点,然后导出 KML,再导入 Mission Planner 或 QGroundControl 做精细调整。

小技巧:Google Earth 的“标尺”工具可以测量距离和面积。我常用它来估算航线总长度和覆盖面积,提前算好电池够不够用。

2.4.2 奥维地图

奥维地图是国内用户的好选择。它支持:

  • 多种地图源:Google 卫星图、百度地图、高德地图、天地图
  • 离线地图:下载到本地,野外没信号也能用
  • 坐标系转换:内置 WGS84、GCJ-02(火星坐标系)、BD-09(百度坐标系)互转
  • 轨迹记录:可以记录飞行轨迹,回放分析

我特别推荐它的坐标系纠偏功能。国内的地图服务(高德、百度)都用了加密偏移,直接导入 WGS84 坐标会偏几百米。奥维可以一键转换,省了很多麻烦。

功能 Google Earth 奥维地图
卫星图分辨率 极高 高(依赖图源)
3D 地形 支持 有限
离线使用 需 Pro 版 免费
坐标系转换 仅 WGS84 支持多种
国内可用性 需翻墙 稳定

2.5 知识体系总览

下面这张图总结了本章的核心知识点和它们之间的关系:

坐标系与地图基础知识体系 坐标系与地图基础 · 知识体系 坐标系与地图基础 WGS84 坐标系 UTM 投影 高程系统 GPS 定位 经纬度坐标 60 个投影带 平面距离计算 椭球高 海拔 / 大地高 应用层:Google Earth / 奥维地图 航线规划 → KML 导出 → 飞控导入

2.6 实战:坐标系转换代码示例

说了这么多理论,来点实际的。下面是一个 Python 代码片段,演示如何将 WGS84 经纬度转换为 UTM 坐标:

import pyproj

# 定义坐标系
wgs84 = pyproj.CRS("EPSG:4326")  # WGS84 经纬度
utm_zone = pyproj.CRS("EPSG:32650")  # UTM 50N(北京地区)

# 创建转换器
transformer = pyproj.Transformer.from_crs(wgs84, utm_zone, always_xy=True)

# 示例:天安门广场坐标
lon, lat = 116.3975, 39.9087
easting, northing = transformer.transform(lon, lat)

print(f"WGS84: {lat:.4f}°N, {lon:.4f}°E")
print(f"UTM 50N: {easting:.2f} m E, {northing:.2f} m N")
# 输出:
# WGS84: 39.9087°N, 116.3975°E
# UTM 50N: 451234.56 m E, 4417890.12 m N

这段代码我几乎每个项目都会用。你把它封装成一个函数,以后做航线规划时直接调用就行。

我的习惯:在航线脚本开头,先做一次坐标系检查。如果输入的是经纬度,自动转 UTM;如果输入的是 UTM,确认带号是否正确。这样能避免 90% 的坐标系错误。

2.7 本章小结

嗯,内容不少,但都是硬核干货。总结一下:

  • WGS84 是 GPS 的“母语”,但算距离不方便
  • UTM 把球面拍成平面,方便计算,但要注意带号和变形
  • 高程系统要分清椭球高和海拔,山区飞行必须做高程转换
  • Google Earth 适合预规划和 3D 地形查看
  • 奥维地图 适合国内使用,支持坐标系纠偏和离线