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の赤い円盤は平行の方向の接触円です:両方ディスクには、この時点で「下」方向が含まれています。この図は、地球の平坦化を2桁誇張しています。
曲率半径は度の長さを決定します:円の半径がRの場合、長さ2 pi Rの円周は360度をカバーし、1度の長さはpi * R / 180 です。RをMおよびrに置き換える- -つまり、Mとrにpi / 180を掛けると、次数の長さの単純で正確な公式が得られます。
これらの式は、与えられたaとfの値(多くの場所にあります)と回転楕円体としての回転楕円体の記述にのみ基づいていますが、質問の計算で0.6パーツ以内に同意します100万(数センチ)は、問題の最小係数とほぼ同じ大きさであり、それらが一致することを示しています。(近似値は常に少し低くなります。)プロットでは、緯度の長さの相対誤差は黒で、経度の相対誤差は赤で破線になっています。
したがって、質問の計算は、上記の式の近似(切り捨てられた三角級数による)であると理解できます。
係数は、緯度の関数として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
式の入力方法は推測できます。)コード内のパラメーターに対するこれらの値の近さは、この解釈の正確さを証明します。この改善された近似値は、あらゆる場所で10億分の1をはるかに上回る精度です。
この答えをテスト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、Map Projections-リファレンスマニュアル。 テイラー&フランシス、1995年(付録2および付録4)
JP Snyder、Map Projections--A Working Manual。 USGS Professional Paper 1395、1987。(第3章)