地図上の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つの方法がありますが、アプリによりどちらが使いやすいか検討してください。