Основний радіус сфероїда 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 градусах північної широти синій диск радіуса М - це коливальне («цілуюче») коло в напрямку меридіана, а червоний диск радіуса N - коливальне коло в напрямку паралелі: обидва диски містять напрямок "вниз" в цій точці. Цей показник перебільшує сплющення землі на два порядки.
Радіуси кривизни визначають довжину градусів: коли коло має радіус R , його периметр довжиною 2 pi R охоплює 360 градусів, звідки довжина одного градуса pi * R / 180. Підставляючи M і 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
Список літератури
Л. М. Бугаєвський та JP JP Snyder, Картографічні проекції - Довідковий посібник. Taylor & Francis, 1995. (Додаток 2 та Додаток 4)
JP Snyder, Проекції карт - робочий посібник. Професійний документ USGS 1395, 1987. (Розділ 3)