🔖

地図上の2地点の距離を簡単な計算で出したい時

2021/05/05に公開

地図上の2地点の座標(緯度・経度)から距離を計算したい時に、どの様な式で求めることが出来るのかメモしておく。
※ Wikipediaをちょろっと見ただけなので間違ってたらすみません

地球は丸い

地図上の2地点の座標を元に距離を出そうと思った時に、地球は平面ではなく球体である事を考慮する必要があるらしい。また、実は地球は楕円らしく、正確に計算しようと思うと色々と面倒くさいらしい。

で、そういった事情もあって距離を求める計算式には幾つか種類があるらしい。

今回は簡単に計算できるものが良いので、Haversine formula の計算式を使って計算してみる。

地図上の2地点の座標を元に距離を出す

https://en.wikipedia.org/wiki/Haversine_formula

計算式はWikipediaに書いてあるとおりで、Dartで実装してみるとこんな感じ。

import 'dart:math';

void main() {
  // 402143.3596289952 (402km)
  print(distanceBetween(
    // 東京駅
    35.6812362,
    139.7649361,
    // 新大阪駅
    34.7334702,
    135.4980607,
  ));
}

double distanceBetween(
  double latitude1,
  double longitude1,
  double latitude2,
  double longitude2,
) {
  final toRadians = (double degree) => degree * pi / 180;
  final double r = 6378137.0; // 地球の半径
  final double f1 = toRadians(latitude1);
  final double f2 = toRadians(latitude2);
  final double l1 = toRadians(longitude1);
  final double l2 = toRadians(longitude2);
  final num a = pow(sin((f2 - f1) / 2), 2);
  final double b = cos(f1) * cos(f2) * pow(sin((l2 - l1) / 2), 2);
  final double d = 2 * r * asin(sqrt(a + b));
  return d;
}

東京・大阪間の距離を試しに出してみたところ402kmと出たので、たぶんあってそう。

最後に

最近は、OSSが沢山あって実現したいことの多くはライブラリ化されていると思う。しかし、それらに頼りすぎてライブラリは使えるけど中身の仕組みは良くわかりません状態に陥ると、結構危ない感じがする。
流石に全てを把握するのは無理だが、気になったものは中身の仕組みをちょっと調べてみる癖を付けると良いかもしれない。

作って学ぶ、FlutterとFirebaseを使ったアプリ開発

FlutterとFirebaseを使ったアプリ開発に関して書籍にまとめました。

Flutterで始めるアプリ開発

https://www.flutter-study.dev/

Discussion