Le rayon principal du sphéroïde WGS84 est a = 6378137 mètres et son aplatissement inverse est f = 298,257223563, d'où l'excentricité au carré est
e2 = (2 - 1/f)/f = 0.0066943799901413165.
Le rayon de courbure méridien à la latitude phi est
M = a(1 - e2) / (1 - e2 sin(phi)^2)^(3/2)
et le rayon de courbure le long du parallèle est
N = a / (1 - e2 sin(phi)^2)^(1/2)
De plus, le rayon du parallèle est
r = N cos(phi)
Ce sont des corrections multiplicatives des valeurs sphériques de M et N , toutes deux égales au rayon sphérique a , ce à quoi elles se réduisent lorsque e2 = 0.
Au point jaune à 45 degrés de latitude nord, le disque bleu de rayon M est le cercle osculateur ("baiser") en direction du méridien et le disque rouge de rayon N est le cercle osculateur en direction du parallèle: les deux les disques contiennent la direction "vers le bas" à ce stade. Ce chiffre exagère l'aplatissement de la terre de deux ordres de grandeur.
Les rayons de courbure déterminent les longueurs des degrés: lorsqu'un cercle a un rayon de R , son périmètre de longueur 2 pi R couvre 360 degrés, d'où la longueur d'un degré est pi * R / 180. En substituant M et r pour R - - c'est-à-dire en multipliant M et r par pi / 180 - donne des formules exactes simples pour les longueurs en degrés.
Ces formules - qui sont basées uniquement sur les valeurs données de a et f (qui peuvent être trouvées à de nombreux endroits ) et sur la description du sphéroïde comme ellipsoïde de rotation - correspondent aux calculs de la question à 0,6 partie près. millions (quelques centimètres), ce qui correspond approximativement au même ordre de grandeur que les plus petits coefficients de la question, ce qui indique qu'ils sont d'accord. (L'approximation est toujours un peu faible.) Dans le graphique, l'erreur relative de longueur d'un degré de latitude est noire et celle de longitude est tiretée en rouge:
En conséquence, nous pouvons comprendre que les calculs de la question sont des approximations (via des séries trigonométriques tronquées) des formules données ci-dessus.
Les coefficients peuvent être calculés à partir de la série des cosinus de Fourier pour M et r en fonction de la latitude. Ils sont donnés en termes de fonctions elliptiques de e2, qui seraient trop compliquées à reproduire ici. Pour le sphéroïde WGS84, mes calculs donnent
m1 = 111132.95255
m2 = -559.84957
m3 = 1.17514
m4 = -0.00230
p1 = 111412.87733
p2 = -93.50412
p3 = 0.11774
p4 = -0.000165
(Vous pouvez deviner comment p4
entre la formule. :) La proximité de ces valeurs avec les paramètres du code atteste de l'exactitude de cette interprétation. Cette approximation améliorée est précise à bien meilleure qu'une partie par milliard partout.
Pour tester cette réponse, j'ai exécuté du R
code pour effectuer les deux calculs:
#
# 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")
Le calcul exact avec radii
peut être utilisé pour imprimer des tableaux des longueurs de degrés, comme dans
zapsmall(radii(phi) * pi / 180)
La sortie est en mètres et ressemble à ceci (avec quelques lignes supprimées):
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
Les références
LM Bugayevskiy et JP Snyder, Projections cartographiques - Un manuel de référence. Taylor & Francis, 1995. (Annexe 2 et Annexe 4)
JP Snyder, Projections cartographiques - Un manuel de travail. USGS Professional Paper 1395, 1987. (Chapitre 3)