1

緯度と経度を使用した距離式があります。

distance = EARTH_MILES_RADIUS
    * Math.acos(Math.sin(lat1 / RADIAN_CONV)
    * Math.sin(lat2 / RADIAN_CONV)
    + Math.cos(lat1 / RADIAN_CONV)
    * Math.cos(lat2 / RADIAN_CONV)
    * Math.cos((lng2 - lng1) / RADIAN_CONV));

lat1、lng1、lat2、lng2はダブルプリミティブです。それらはダブルプリミティブとして私に来て、それについて私ができることは何もありません。

問題は、同じ経度または緯度のペアがある場合、数式がNaNを返すことがあることです。これは、1よりわずかに大きい数のアークコサインを取得しているためだと思いますが、実際には正確に1である必要があります。ポイントが対蹠的である場合は、おそらく問題が発生します。 1.1。

この問題を解決するにはどうすればよいですか?

4

3 に答える 3

1

コード内の2つの非常に近い(理想的には等しい)値を確認します。例えば:

boolean doubleApproxEqual(double a, double b) {
    double PRECISION = 0.000001;
    if (Math.abs(a-b) < PRECISION) //not sure what the name of the function is
                                   //cannot be bothered to check
        return true;
    return false;
}

Trueを取得した場合は、cos(1.0)などを実行します

于 2011-04-20T03:16:55.247 に答える
1

私が思うように、実際に大円距離を計算している場合は、現在の式ではなく、Vincenty式を使用する必要があります。

http://en.wikipedia.org/wiki/Great-circle_distance

于 2011-04-20T03:21:24.670 に答える
0

私の問題を解決するには、平等をチェックするだけで十分でした。

if (lat1 == lat2 && lng1 == lng2) ...
于 2011-08-11T00:22:21.340 に答える