Ride with GPSの距離計算式と精度の評価
Ride with GPS(RWGPS)が測地線長の計算に使う式と使用しているパラメータを調べ、その誤差評価を行った。
※以下すべて2023年5月18日時点での情報です
Ride with GPSが使用している計算式とパラメータ
調査したところ、Ride with GPSはHaversine Formula(大円距離 - Wikipedia)を使っていることが判明した。
これは簡易的な計算式で、地球を回転楕円体ではなく球として扱うために誤差が生じる。1
また、Ride with GPSでは地球の半径を$6378100 \mathrm{m}$として計算している。 GPSで使われるWGS84では
- 長半径: $a = 6378137 \mathrm{m}$ (定義)
- 短半径: $b = (1 - f)a = 6356752.31496 \mathrm{m}$
- Arithmetic mean radius: $(2a + b) / 3 = 6371008.77165 \mathrm{m}$
- 体積が等しい球の半径: $(a^2b)^{1/3} = 6371000.79025 \mathrm{m}$
なので、いずれにも一致しない(GRS80もほぼ同じ値)。
Ride with GPSが$6378100 \mathrm{m}$を採用した理由は不明である。2
ただし、$6378137$と$6378100$の間の相対誤差は$5.8 \times 10^{-6}$であるため、以下の誤差の議論に与える影響はほとんど無視できる。
Ride with GPSの距離計算の誤差
ここではRide with GPSを使用してルートを作成した際に、どの程度の誤差が生じうるのか調べる。
ある緯度経度の地点を出発地点とし、その出発地点から進行方向を決めて$100 \mathrm{m}$進んだ到着地点の緯度経度を正確に(今回はMathematicaを用いて)計算し、 逆に出発地点と到着地点の緯度経度をRide with GPSの計算式に与えることで、Ride with GPSの計算式の精度評価を行う。
精度の高い測地線距離計算式を用いれば、この当然計算結果は$100 \mathrm{m}$となる。
方位による誤差の変化
出発地点の緯度を北緯35度に固定し、方位を0度から359度まで変化させた際のRide with GPS計算式の距離計算結果を調べたところ、下図のようになった。
Ride with GPS計算式では東西方向で$-0.11\%$、南北方向で$+0.34 \%$の誤差が生じる結果となった。
緯度による誤差の変化
次に出発点の緯度を0度から北緯89度まで変化させ、Ride with GPSの距離計算式で距離を計算した際の距離の最大値(南北方向)と最小値(東西方向)、およびこの平均を調べたところ、下図となった。
この結果から、Ride with GPSの計算式は高緯度になるほど実際よりも小さい値を出すことがわかった。
より細かく見ると、赤道付近ではほぼ常に実際よりも距離を大きく計算し、その誤差は最大で$+0.7\%$近くになる。
一方で高緯度になると距離は実際よりも小さく計算され、北緯55度以北では常に実際の距離よりも小さく計算されてしまう。
小さく計算される場合の誤差は$-0.3\%$程度になる。
また、出発地点に戻ってくる周回ルートを作った場合、方位があらゆる方向にバラついて平均すると上図のMean程度の誤差が生じることが期待される。
日本の緯度帯(北緯30度~北緯45度)では平均的に実際よりも大きく計算されやすく、ラフに$+0.1\%$程度大きめの値が表示されている、と思っておくと良いと言える。3
まとめ
以上の結果から、Ride with GPSの距離計算式についてまとめると以下となる。
- 回転楕円体ではなく球として計算する簡易的なHaversine Formulaを使っているため、$-0.3\%$から$+0.7\%$程度の誤差が生じうる。
- 日本の緯度帯では東西方向で実際よりも小さく、南北方向で実際よりも距離が大きく計算される。
- 平均すると実際の距離よりも大きく計算されていることが多く、$+0.1\%$程度を見積もっておくとよい。
実際に2022年の日本縦断2700kmでは$+3.5 \mathrm{km}$ほどのずれが生じたので、注意が必要である。
-
参考までに、Garmin ConnectはVincentyの式を使って距離計算をしている。この式は反復計算を含むため計算速度は遅いが、幅広い距離で11桁程度の精度が出せる。
c.f. 測地線距離計算式・計算ライブラリの精度評価 ↩︎ -
同様にHaversine Formulaを使うGoogle Maps JavaScript APIではWGS84の長半径である$6378137 \mathrm{m}$を採用している。
c.f. Geometry Library | Maps JavaScript API | Google for Developers ↩︎ -
出発地点と到着地点が同じでも、ルートが円状から直線状に近づくにつれて特定の方位に集中するため上記の議論に当てはまらないことは留意。 ↩︎