WGS84椭球体的主半径为a = 6378137米,其反展平度为f = 298.257223563,因此平方偏心率为
e2 = (2 - 1/f)/f = 0.0066943799901413165.
纬度phi的子午线曲率半径为
M = a(1 - e2) / (1 - e2 sin(phi)^2)^(3/2)
沿平行线的曲率半径为
N = a / (1 - e2 sin(phi)^2)^(1/2)
此外,平行线的半径为
r = N cos(phi)
这些是对M和N的球面值的乘法校正,它们都等于球面半径a,这是当e2 = 0时它们减小的值。
在北纬45度的黄点处,半径M的蓝色圆盘是子午线方向上的振荡(“亲吻”)圆,半径N的红色圆盘是在平行方向上的振荡圆(两个)光盘此时包含“向下”方向。这个数字夸大了地球的平坦度两个数量级。
曲率半径确定的程度的长度:当一个圆具有的半径- [R ,其长度为2 PIř盖360度的周界,从那里一个程度的长度为圆周率* R / 180代中号和- [R为- [R - -将M和r乘以pi / 180-给出度数长度的简单精确公式。
这些公式-仅基于给定的a和f值(可以在许多地方找到)以及将椭球体描述为旋转椭圆体-与问题中的计算结果相符,每分之0.6百万(几厘米),大约等于问题中最小系数的数量级,表示它们同意。(近似值总是有点低。)在图中,纬度长度的相对误差为黑色,而经度的相对误差为红色虚线:
因此,我们可以将问题中的计算理解为与上述公式近似(通过截断的三角级数)。
可以从M和r的傅立叶余弦级数计算出系数,作为纬度的函数。它们是根据e2 的椭圆函数给出的,在这里很难复制。对于WGS84球体,我的计算得出
m1 = 111132.95255
m2 = -559.84957
m3 = 1.17514
m4 = -0.00230
p1 = 111412.87733
p2 = -93.50412
p3 = 0.11774
p4 = -0.000165
(您可能会猜想如何p4
输入公式。:)这些值与代码中的参数的接近程度证明了这种解释的正确性。这种改进的近似精确度要好于世界各地十亿分之一。
为了测试这个答案,我执行了R
代码来执行两种计算:
#
# Radii of meridians and parallels on a spheroid. Defaults to WGS84 meters.
# Input is latitude (in degrees).
#
radii <- function(phi, a=6378137, e2=0.0066943799901413165) {
u <- 1 - e2 * sin(phi)^2
return(cbind(M=(1-e2)/u, r=cos(phi)) * (a / sqrt(u)))
}
#
# Approximate calculation. Same interface (but no options).
#
m.per.deg <- function(lat) {
m1 = 111132.92; # latitude calculation term 1
m2 = -559.82; # latitude calculation term 2
m3 = 1.175; # latitude calculation term 3
m4 = -0.0023; # latitude calculation term 4
p1 = 111412.84; # longitude calculation term 1
p2 = -93.5; # longitude calculation term 2
p3 = 0.118; # longitude calculation term 3
latlen = m1 + m2 * cos(2 * lat) + m3 * cos(4 * lat) + m4 * cos(6 * lat);
longlen = p1 * cos(lat) + p2 * cos(3 * lat) + p3 * cos(5 * lat);
return(cbind(M.approx=latlen, r.approx=longlen))
}
#
# Compute the error of the approximation `m.per.deg` compared to the
# correct formula and plot it as a function of latitude.
#
phi <- pi / 180 * seq(0, 90, 10)
names(phi) <- phi * 180 / pi
matplot(phi * 180 / pi, 10^6 * ((m.per.deg(phi) - radii(phi) * pi / 180) /
(radii(phi) * pi / 180)),
xlab="Latitude (degrees)", ylab="Relative error * 10^6",lwd=2, type="l")
的精确计算radii
可用于打印度长表,如
zapsmall(radii(phi) * pi / 180)
输出以米为单位,看起来像这样(删除了一些行):
M r
0 110574.3 111319.49
10 110607.8 109639.36
20 110704.3 104647.09
...
80 111659.9 19393.49
90 111694.0 0.00
参考文献
LM Bugayevskiy和JP Snyder,《地图投影-参考手册》。 Taylor&Francis,1995年。(附录2和附录4)
JP Snyder,《地图投影-工作手册》。 USGS专业论文1395,1987年。(第3章)