26
33

More than 5 years have passed since last update.

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

Posted at

地図上の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] = [点間の距離]
        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点間の距離を取得
     * 第五引数に設定するキー(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つの方法がありますが、アプリによりどちらが使いやすいか検討してください。

26
33
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
26
33