2. 数学基础
做定位算法这些年,我见过太多人栽在坐标系和时间系统上。代码写得再漂亮,坐标系选错了,结果就是一堆废数据。今天咱们就把这几个最常用的坐标系和时间系统彻底捋清楚。
为什么坐标系这么重要?
说白了,坐标系就是给地球上的点贴标签。你报一个经纬度,别人得知道这个数字对应的是地球上的哪个位置。如果坐标系不统一,你报的坐标和我理解的坐标可能差了几百米。
我记得刚入行那会儿,有个项目要把GPS数据和北斗数据融合处理。我天真地以为经纬度就是经纬度,直接拿来用。结果定位结果飘得离谱,查了两天才发现——GPS用的是WGS84,北斗用的是CGCS2000,两个坐标系虽然很接近,但确实有差异。
核心结论:坐标系是定位的基准,基准错了,后面全白干。
WGS84:全球通用的坐标系
WGS84(World Geodetic System 1984)是目前最广泛使用的全球坐标系。GPS卫星发下来的信号,默认就是WGS84坐标系下的位置。
它的核心参数:
- 地球长半轴:6378137.0 米
- 地球扁率:1/298.257223563
- 地心坐标系,原点在地球质心
你手机里那些地图App,绝大多数底层用的都是WGS84。为什么?因为GPS覆盖全球,WGS84跟着GPS一起普及了。
我的习惯:做全球性项目时,我默认用WGS84。除非客户明确要求用其他坐标系,否则别给自己找麻烦。
CGCS2000:中国的国家坐标系
CGCS2000(China Geodetic Coordinate System 2000)是中国在2008年正式启用的地心坐标系。它和WGS84非常接近,但并不是完全一样。
两者的差异有多大?
| 参数 | WGS84 | CGCS2000 |
|---|---|---|
| 长半轴 (m) | 6378137.0 | 6378137.0 |
| 扁率分母 | 298.257223563 | 298.257222101 |
| 原点 | 地球质心 | 地球质心 |
看到没?扁率差了那么一丁点。实际应用中,两个坐标系在平面位置上的差异通常在1米以内。但别小看这1米——在某些高精度场景下,这1米就是能不能用的分界线。
我曾经做过一个国土测绘项目,客户要求必须用CGCS2000。我一开始偷懒用了WGS84,想着差1米无所谓。结果验收时被打回来了——国家规定必须用CGCS2000,没得商量。
避坑指南:在中国境内做测绘、国土、规划类项目,必须使用CGCS2000。这不是技术问题,是合规问题。
时间系统:UTC和GPST
坐标系搞定了,时间系统同样不能马虎。定位本质上是在解算信号传播时间,时间不准,位置就不准。
UTC:世界协调时
UTC(Coordinated Universal Time)是我们日常生活中使用的时间标准。它基于原子时,但会通过闰秒来调整,让它和地球自转保持同步。
- 原子时:稳定、均匀,由原子钟维持
- 地球自转:不稳定,会逐渐变慢
- 闰秒:为了让两者对齐,UTC会不定期插入闰秒
从1972年到现在,已经加了27个闰秒。最近一次是2016年12月31日。
GPST:GPS系统时间
GPST(GPS Time)是GPS系统内部使用的时间系统。它从1980年1月6日0时开始计时,不插入闰秒。
所以GPST和UTC之间有一个固定的偏移:
GPST = UTC + 闰秒数
截至2024年,这个偏移量是18秒。也就是说,GPST比UTC快了18秒。
关键点:GPS卫星发下来的时间戳是GPST,如果你要用它和UTC时间做对比,必须加上闰秒修正。
坐标系和时间系统的关系
你可能觉得坐标系和时间系统是两回事。但在定位算法里,它们经常一起出现。
举个例子:你要融合GPS和北斗的数据。
- GPS输出:WGS84坐标 + GPST时间
- 北斗输出:CGCS2000坐标 + BDT时间(北斗时)
如果你不做坐标系转换和时间对齐,直接拿过来用,结果就是——位置差几米,时间差几十秒,定位精度一塌糊涂。
我当年踩过这个坑。那次项目赶得急,我直接把两套数据扔进卡尔曼滤波器,结果滤波器直接发散。查了两天,发现是时间没对齐。从那以后,我养成了一个习惯:任何多系统融合项目,第一步先把所有数据统一到同一个坐标系和时间系统下。
我的工作流:
- 确认输入数据的坐标系和时间系统
- 统一转换到目标坐标系(通常是WGS84)
- 统一转换到目标时间系统(通常是UTC)
- 再做后续处理
坐标系转换实战
这里给一个简单的WGS84到CGCS2000的转换思路。实际项目中,我建议用成熟的库(如PROJ),但理解原理很重要。
// 伪代码:WGS84到CGCS2000的七参数转换
// 实际参数需要根据区域获取
function wgs84_to_cgcs2000(x, y, z) {
// 七参数:三个平移、三个旋转、一个尺度
dx = 0.0; // 米
dy = 0.0; // 米
dz = 0.0; // 米
rx = 0.0; // 弧度
ry = 0.0; // 弧度
rz = 0.0; // 弧度
scale = 0.0; // ppm
// 应用转换
x2 = x + dx + (rz * y - ry * z) + scale * x;
y2 = y + dy + (-rz * x + rx * z) + scale * y;
z2 = z + dz + (ry * x - rx * y) + scale * z;
return [x2, y2, z2];
}
注意:上面这个代码只是示意。实际参数需要从国家测绘部门获取,不同区域的参数可能不同。
本章知识体系
下面这张图帮你理清坐标系和时间系统的关系:
总结一下
坐标系和时间系统是定位算法的地基。地基不稳,上面盖的楼再漂亮也没用。
- WGS84:全球通用,GPS默认
- CGCS2000:中国国家坐标系,测绘合规必备
- UTC:民用时间标准,有闰秒
- GPST:GPS内部时间,无闰秒,比UTC快18秒(2024年)
做项目时,我建议你先把这些基础打牢。坐标系转换和时间对齐的代码,提前封装好,别每次都现写。这样后面做定位算法时,才能把精力集中在真正核心的问题上。