-3

C# で Haversine Formula を見つけましたが、これよりも優れた方法は他にありません。

public double HaversineDistance(LatLng pos1, LatLng pos2, DistanceUnit unit)
    {
        double R = (unit == DistanceUnit.Miles) ? 3960 : 6371;
        var lat = (pos2.Latitude - pos1.Latitude).ToRadians();
        var lng = (pos2.Longitude - pos1.Longitude).ToRadians();
        var h1 = Math.Sin(lat / 2) * Math.Sin(lat / 2) +
                      Math.Cos(pos1.Latitude.ToRadians()) * Math.Cos(pos2.Latitude.ToRadians()) *
                      Math.Sin(lng / 2) * Math.Sin(lng / 2);
        var h2 = 2 * Math.Asin(Math.Min(1, Math.Sqrt(h1)));
        return R * h2;
    }
4

1 に答える 1

1

それをどうしたいかの問題だと思います。私の推測では、郵便番号に基づいて距離を計算しようとしていて、pos2 が pos1 の x 距離内にあるかどうかを知りたいと考えています。

最初に理解しておく必要があるのは、(使用する優れた地理空間データがない限り) 通常、すべての計算では特定の領域の標高やその他の地形属性が考慮されないため、計算が正確ではないということです。さらに、これらの計算は「カラスが飛ぶように」、つまり点 x から点 y は直線であることを意味するため、点 y は中心点 x から 25 マイル以内にある可能性がありますが、実際には中心点 x から点 y まで移動するのに 30 マイルかかる場合があります。

つまり、次のように表されるピタゴラスの定理を使用できる短い距離 (< ~ 12 マイル) を計算する場合を除き、Haversine Formula が最善の策です。

d = sqrt((X2 - X1)^2 + (Y2 - Y1)^2)

X と Y は座標です。これははるかに高速ですが、特に距離が長くなると精度が大幅に低下します。

Haversine フォーミュラは、特に繰り返し呼び出すと遅くなりますが、このフォーミュラに基づいて距離を計算するためのより高速な方法は知りません。

于 2012-07-09T13:18:42.907 に答える