由于在GNSS定位中由多种高度表示,不同的高度概念很容易混淆,中英文对应有时候也容易搞混。因此整理了一下常用的两种高度——椭球高、正高的概念与计算,并且标注了对应的英文,让自己的脑子清醒一点。如果你也感兴趣的话,就请继续看下去吧。
高度相关的几个基本概念
椭球高 (Ellipsodial height):是以参考椭球面(ellipsoid) 为基准面的高程系统,也称大地高。
正高 (Orthometric height):以大地水准面(geoid) 为基准面的高程系统。即地面点到大地水准面的铅垂距离。又称为海拔高(height above mean sea level)。
大地水准面差距(Geoid height): 大地水准面与参考椭球面之间的高程差,英文中也常用Geoid separation, Geoid undulation 或者 Geoid deviation表示。
由上述表述可知: 大地水准面差距(Geoid height) = 椭球高 (Ellipsodial height) – 正高 (Orthometric height)
RTKLIB中高度设置与计算
如下图中RTKPOST的配置页面所示,RTKLIB中支持两种高度输出:
- 默认的ellipsoidal选项就是椭球高 (Ellipsodial height)
- Geodetic选项则是正高 (Orthometric height)
要计算正高 (Orthometric height),首先需要知道大地水准面的模型。根据不同的定义,有不同的大地水准面模型【3】。RTKLIB目前支持EGM96模型,具体模型相关参数位于源码geoid.c中。大地水准面模型包含了大地水准面差距(Geoid height)的网格值。
从上面等式我们知道,正高 (orthometric height) = 椭球高(ellipsoidal height) – 大地水准面差距(Geoid height)。因此可以通过插值的方法计算出不同经纬度下的正高 (Orthometric height)。
- 插值计算Geoid height可以参见位于geoid.c中的“geoidh_emb”函数
- 计算输出正高 (Orthometric height)可参见solution.c中的“outpos”函数,相关代码如下:
/* output solution as the form of lat/lon/height -----------------------------*/
static int outpos(uint8_t *buff, const char *s, const sol_t *sol,
const solopt_t *opt)
{
double pos[3],vel[3],dms1[3],dms2[3],P[9],Q[9];
const char *sep=opt2sep(opt);
char *p=(char *)buff;
trace(3,"outpos :\n");
ecef2pos(sol->rr,pos);
soltocov(sol,P);
covenu(pos,P,Q);
if (opt->height==1) { /* geodetic height */
pos[2]-=geoidh(pos); // 根据经纬度计算Geoid height,再从椭球高 (Ellipsodial height)中减去Geoid height
}
...
}
参考文献
[1]正常高、大地高、海拔高的测绘概念
[2]Ellipsoidal, orthometric and geoid height 101
[3]EGM96 and EGM2008 and Other Geoid Grids
[4]如何区分:大地水准面、似大地水准面、参考椭球面