了解度数长度公式中的术语?


13

诸如http://www.csgnetwork.com/degreelenllavcalc.html(查看页面源代码)之类的在线计算器使用以下公式获取每度的米。我通常了解每度的距离如何随纬度位置而变化,但是我不明白这将如何转换为以下内容。更具体地说,常数,每个公式中的3个“ cos”项以及“ lat”的系数(2、4、6、3和5)从何而来?

    // Set up "Constants"
    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

    // Calculate the length of a degree of latitude and longitude in meters
    latlen = m1 + (m2 * Math.cos(2 * lat)) + (m3 * Math.cos(4 * lat)) +
            (m4 * Math.cos(6 * lat));
    longlen = (p1 * Math.cos(lat)) + (p2 * Math.cos(3 * lat)) +
                (p3 * Math.cos(5 * lat));

3
在一个圆上,m = 0、1、2,...的cos(m * x)形式的项与单项式1,x,x ^ 2,x ^ 3 ...的作用相同系列就行了。当您看到这种扩展时,您可以用相同的方式来思考:每个项都给出函数的高阶近似。通常,这种三角级数是无限的。但是在实际使用中,只要近似误差可以接受,它们就会被截断。每个此类GIS都包含一些此类技术,因为使用此类序列计算了许多球形投影。
ub

这对于计算纬度线之间的距离变化的距离非常有用,如果您使用x,y网格作为叠加层,则也有助于确定墨卡托地图上绘制点的位置

提示:不要忘记使用弧度lat(即使结果变量latlen,并longlen在每度米,没有米每弧度)。如果对度使用度数lat,则甚至可能会得出负值longlen
卢克·哈奇森

Answers:


23

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)

这些是对MN的球面值的乘法校正,它们都等于球面半径a,这是当e2 = 0时它们减小的值。

数字

在北纬45度的黄点处,半径M的蓝色圆盘是子午线方向上的振荡(“亲吻”)圆,半径N的红色圆盘是在平行方向上的振荡圆(两个)光盘此时包含“向下”方向。这个数字夸大了地球的平坦度两个数量级。

曲率半径确定的程度的长度:当一个圆具有的半径- [R ,其长度为2 PIř盖360度的周界,从那里一个程度的长度为圆周率* R / 180代中号- [R- [R - -将Mr乘以pi / 180-给出度数长度的简单精确公式。

这些公式-仅基于给定的af值(可以在许多地方找到)以及将椭球体描述为旋转椭圆体-与问题中的计算结果相符,每分之0.6百万(几厘米),大约等于问题中最小系数的数量级,表示它们同意。(近似值总是有点低。)在图中,纬度长度的相对误差为黑色,而经度的相对误差为红色虚线:

数字

因此,我们可以将问题中的计算理解为与上述公式近似(通过截断的三角级数)。


可以从Mr的傅立叶余弦级数计算出系数,作为纬度的函数。它们是根据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章)


我不知道为什么要对一个简单的公式对使用如此复杂的近似值。
ub

多么彻底的答案!看来是正确的;现在我只需要复习一下这个数学就可以理解它。:)
布伦特

@Brent我添加了一个数字来帮助您理解数学。
Whuber

0

那是Haversine公式,尽管用一种奇怪的方式表达。


显然这不是Haversine的公式!这与用于球体的扰动有关。它甚至没有找到任意点对之间的距离,这就是Haversine公式用于(在球上)的含义。
Whuber

1
换句话说,Haversine公式可计算大圆距离,而该公式是对它的摄动,可计算更精确的椭球距离?
布伦特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.