-3

我发现 C# 中的 Haversine 公式有没有比这更好的方法。

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 英里。

话虽如此,Haversine 公式是您最好的选择,除非您计算的是小距离(< ~12 英里),在这种情况下,您可以使用勾股定理,其表示为:

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

显然,X 和 Y 是你的坐标。这要快得多,但准确度要低得多,尤其是随着距离的增加。

Haversine 公式很慢,特别是如果您重复调用它,但我不知道有任何更快的方法可以根据此公式计算距离。

于 2012-07-09T13:18:42.907 回答