Location.distanceTo()はWGS84楕円体上の近似距離を計算する

  • Android
  • GPS
  • Kotlin

この記事は、構成と文章の整理にAIを使っています。
あくまで読みやすくするための補助で、内容そのものをAIにすべて任せて書いているわけではありませんが、ところどころ相談しながら整えています。

GNSSで取得した2点間の移動距離を出すのにLocation.distanceTo()を使うことが多い。これはWGS84楕円体をベースにした近似距離を返すメソッドで、地球の丸みを考慮した計算になっている。

コード例

import android.location.Location
fun calculateDistance(
startLatitude: Double, startLongitude: Double,
endLatitude: Double, endLongitude: Double
): Float {
val startLocation = Location("start").apply {
latitude = startLatitude
longitude = startLongitude
}
val endLocation = Location("end").apply {
latitude = endLatitude
longitude = endLongitude
}
// 距離をメートルで取得
return startLocation.distanceTo(endLocation)
}

使い方はシンプルで、2点の緯度経度を渡すとメートル単位の距離が返ってくる。定期的に位置情報を取得して、前回位置との距離を都度合計していけば総移動距離になる。

計算方法について

Android公式リファレンスではdistanceTo()について“Distance is defined using the WGS84 ellipsoid”と説明されている。つまり平面上の直線距離ではなく、楕円体上の距離を近似的に求めている。

高度差は考慮されないので、標高差込みの3次元距離が必要な場合はLocation.getAltitude()を使って自前で計算する必要がある。

実務上の注意点

コード自体はこれで問題ないけど、そのまま距離を合計していく実装だと、停止中でもGPSの誤差(ドリフト)で数メートル単位の移動が検出され続け、総移動距離が水増しされやすい。

対策としてよくあるのは以下:

  • 一定距離未満(例: 5m未満)の移動は無視する閾値を設ける
  • Location.getAccuracy()で精度が悪いポイントを除外する
  • 速度(Location.getSpeed())と組み合わせて異常値をフィルタする

実機での閾値の最適値は環境依存なので未確認。実運用で調整しながら決める部分になりそう。