0

インドでうまく機能するコードがあります。このコードは、2 つの場所の間のおおよその距離を計算します。以下のコードを使用しました。しかし、この同じコードを米国で実行すると。次に、場所の更新ごとに異なる距離が計算されます。出発地と目的地の緯度と経度をこの関数に渡しました。このアプリはインドでうまく機能します。しかし、米国では機能しません。同じ場所で、異なる計算が表示されます。よろしくお願いします。

public static double distanceKm(double lat1, double lon1, double lat2, double lon2) {
        double lat1Rad = Math.toRadians(lat1);
        double lat2Rad = Math.toRadians(lat2);
        double deltaLonRad = Math.toRadians(lon2 - lon1);
        return Math.acos(Math.sin(lat1Rad) * Math.sin(lat2Rad) + Math.cos(lat1Rad) * Math.cos(lat2Rad)
                * Math.cos(deltaLonRad))
                * 6371;
    }  
4

2 に答える 2

0

式は大円式です。
短い距離ではうまく機能しないことはよく知られています。
その理由は次の部分です。

Math.cos(deltaRad).  

これは非常に小さな値の余弦であり、数値的に「悪条件」です。これらはコンピューターではうまく機能しません。(最近では、倍精度では効果が目立たなくなります) したがって、距離が短い場合は、harsine 式の方が適しています。

ヘイバーシン距離式にまだ問題がある場合は、明らかに入力データに問題があります。(たとえば、適切な事前フィルタリングなしで GPS から読み取った場合)

より大きな円のバリアントを使用しても正しい結果が得られる可能性が高くなります。あなたが主張した「正しい距離」が間違っている可能性が高いです。

于 2013-11-13T18:17:12.273 に答える
-1

私は非常によく似た式を使用していますが、苦情はありませんでした. 私の数式の主な違いは、次のように計算する deltaLonRad です。

double deltaLonRad = Math.toRadians(lon2) - Math.toRadians(lon1);
于 2013-11-13T14:08:33.777 に答える