

Location.distanceTo()はWGS84楕円体上の近似距離を計算する
この記事は、構成と文章の整理に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())と組み合わせて異常値をフィルタする
実機での閾値の最適値は環境依存なので未確認。実運用で調整しながら決める部分になりそう。