【Android・Java】地図 2点間距離を測定する方法

More than 3 years have passed since last update.

地図上の2点間で距離を測定する方法があります。

Androidアプリを作成している際、距離を測定する方法が2つあったので忘れないうちに投稿します。


Location.distanceBetweenメソッドを使用する方法

AndroidにはLocationクラスがデフォルトでインポートされています。

このLocationクラスにある#distanceBetweenメソッドで2点間距離を測定できます。


実装方法


LocationToolSample

public class LocationToolSample extends Activity {

double latitude1 = [拠点1の緯度]
double longitude1 = [拠点1の経度]
double latitude2 = [拠点2の緯度]
double longitude2 = [拠点2の経度]

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

float[] distance =
getDistance(latitude1, longitude1, latitude2, longitude2);

distance[0] = [2点間の距離]
distance[1] = [始点から見た方位角]
distance[2] = [終点から見た方位角]
}

/*
* 2点間の距離(メートル)、方位角(始点、終点)を取得
* ※配列で返す[距離、始点から見た方位角、終点から見た方位角]
*/

public float[] getDistance(double x, double y, double x2, double y2) {
// 結果を格納するための配列を生成
float[] results = new float[3];

// 距離計算
Location.distanceBetween(x, y, x2, y2, results);

return results;
}
}


getDistanceの返り値で[距離]、[始点から見た方位角]、[終点から見た方位角]が取得できます。


距離測の計算方法を使用する方法

distanceBetweenと同じく、2点間の緯度経度を使用した方法ですが、距離を測る演算を行う方法です。


実装方法


LocationToolSample

public class LocationToolSample extends Activity {

double latitude1 = [拠点1の緯度]
double longitude1 = [拠点1の経度]
double latitude2 = [拠点2の緯度]
double longitude2 = [拠点2の経度]

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

double distance =
getDistance(latitude1, longitude1, latitude2, longitude2, "K");

distance = [2点間の距離]

}

/*
* 2点間の距離を取得
* 第五引数に設定するキー(unit)で単位別で取得できる
*/

private double getDistance(double lat1, double lon1, double lat2, double lon2, char unit) {
double theta = lon1 - lon2;
double dist = Math.sin(deg2rad(lat1)) * Math.sin(deg2rad(lat2)) + Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) * Math.cos(deg2rad(theta));
dist = Math.acos(dist);
dist = rad2deg(dist);
double miles = dist * 60 * 1.1515;
switch (unit) {
case 'K': // キロメートル
return (miles * 1.609344);
case 'N': // ノット
return (miles * 0.8684);
case 'M': // マイル
default:
return miles;
}
}

private double rad2deg(double radian) {
return radian * (180f / Math.PI);
}

public double deg2rad(double degrees) {
return degrees * (Math.PI / 180f);
}
}



#参考にしたサイト



まとめ

2つの方法がありますが、アプリによりどちらが使いやすいか検討してください。