-1

Haversine formula ウィキペディアで与えられたこの実装を試しに使用しようとしていますが、この式は期待される結果をもたらしません。

public class Haversine {
    public static final double R = 6372.8; // In kilometers
    public static double haversine(double lat1, double lon1, double lat2, double lon2) {
        double dLat = Math.toRadians(lat2 - lat1);
        double dLon = Math.toRadians(lon2 - lon1);
        lat1 = Math.toRadians(lat1);
        lat2 = Math.toRadians(lat2);

        double a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + Math.sin(dLon / 2) * Math.sin(dLon / 2) * Math.cos(lat1) * Math.cos(lat2);
        double c = 2 * Math.asin(Math.sqrt(a));
        return R * c;
    }
    public static void main(String[] args) {
        System.out.println(haversine(36.12, -86.67, 33.94, -118.40));
    }
}

Input GPS latitude format  : ddmm.mmmm
Input GPS longitude format : dddmm.mmmm

上記の緯度経度の形式は、要件ドキュメントで指定されています。

サンプル入力座標は次のとおりです。

lat1 = 3359.64868, lon1 = 8356.178
lat2 = 3359.649,   lon2 = 8356.178

これらの値を Haversine メソッドに渡す前に、これらの値を度形式に変換しています。この手順が必要ない場合は、修正してください。

以下の式を使用して、度分形式から10進数形式に変換しています。

Decimal Degree = degree + (minute / 60)

新しい座標は

lat1 = 33 + (59.64868 / 60) = 33.994144666666664
lon1 = 83 + (56.178 / 60) = 83.9363

lat2 = 33 + (59.649 / 60) = 33.99415
lon2 = 83 + (56.178 / 60) = 83.9363

haversine メソッドの呼び出しは次のようになります

haversine(33.994144666666664, 83.9363, 33.99415, 83.9363)

これは値を返します5.932071604620887E-4

値を検証するために、この Web サイト(33.994144666666664, 83.9363, 33.99415, 83.9363)にあるコンバーターに同じ入力を提供しましたが、結果はkm で表示されます。0.001

10 進数に変換せずに入力値を提供しようとしましたが、2 つのメソッドからの出力も一致しません。

私がここでやっている間違いを教えてください。

4

1 に答える 1

5

得られる結果5.932071604620887E-4は の表現であり5.932071604620887 * 10^(-4)、これは5.932071604620887 / 10000 = 0.0005932071604620887です。

ウェブサイトが を返した場合0.001、私の提案は、小数点以下 3 桁に丸めることです。したがって、あなたの計算は正しいです。

于 2014-05-21T08:04:01.223 に答える