我找到了以纬度为单位的米函数,它在here给出:
111132.954 - 559.822 * cos(2 * phi) + 1.175 * cos(4 * phi) // where phi is geodetic latitude
对于经度函数,我能找到的最好的方程是它下面的方程,即
pi * a * cos(phi) / (180 * sqrt(1 - e^2 * sin^2(phi)))
出现(如此处所示),
e
是椭球体的偏心率,a
是赤道半径。 WGS84 是所讨论的椭球体,我同时拥有 a
和 b
,因此我可以直接计算 e
或被 实事求是地告诉 它是 0.0818192
。现在我的问题很简单:
这是我应该使用的正确方程吗以便与通常获得的 GPS 角度兼容?我的理解是,现在所有的GPS设备(事实上,所有的GPS设备永远)都使用WGS84大地纬度和经度(其中大地纬度的假想角线实际上并不穿过地球中心,但经度的线却穿过地球中心),因此对我来说采用球面近似数学是愚蠢的。
发布这个问题的原因是为了得到这个行业中某人的点头,他们可以为我验证我实际上没有找错树,或者我的假设犯了严重错误。在我迄今为止进行的时间紧迫的研究中,我看到的大多数解决方案都建议简单地使用基于球面经度和纬度的三角表达式。尽管它们可能足以满足我的需求,但当我知道我可以通过大约相同的工作量获得更准确的值时,我拒绝使用它们。
对于米每度,对于几乎所有应用,只需将
cos(latitude)
系数应用于赤道处的米每度就足够了。
(我需要将纬度/经度转换为笛卡尔坐标)
两种方法之间 75° 处的差异为 90m 和 28km,因此对于角度计算或到笛卡尔空间的转换,这几乎没有影响。
如果不超过纬度 80°,这一切都是有效的。在极地地区 > 纬度 80°,您必须将所有计算更改为极坐标变换。 (例如 UPS)
void Radii(double lat)
{
double deg2rad = 3.141592653589793 / 180.0; // PI
double a = 6378.1370; // radius at equator in kilometers
double e2 = 0.0066943799901413165;
double OneMinus_e2 = 1.0 - 0.0066943799901413165;
double deg2radX1000 = (PI/180.0)*1000.0;
lat *= deg2rad;
u = 1.0-e2*sin(lat)*sin(lat);
latmetersperdegree = (OneMinus_e2/u)*(a/sqrt(u))*deg2radX1000;
lonmetersperdegree = cos(lat)*(a/sqrt(u))*deg2radX1000;
}