c#hasrsine实现提供了与googlemaps / movable-type.co.uk不同的答案

时间:2014-07-26 14:13:04

标签: c# haversine

我需要计算两点之间的距离(给定纬度和经度)。我在C#中实现了标准的半正弦公式

private double toRadian(double val)
{
    return (Math.PI / 180) *    
}

public double Distance(Position pos1, Position pos2,DistanceType type)
{
        double R = (type == DistanceType.Miles) ? 3960 : 6378137; // 6318137 in meters

        double dLat = toRadian(pos2.Latitude - pos1.Latitude);
        double dLon = toRadian(pos2.Longitude - pos2.Longitude);

        double a = Math.Sin(dLat / 2) * Math.Sin(dLat / 2) +
        Math.Cos(this.toRadian(pos1.Latitude)) * Math.Cos(this.toRadian(pos2.Latitude)) *
        Math.Sin(dLon / 2) * Math.Sin(dLon / 2);

        double c = 2 * Math.Atan2(Math.Sqrt(a), Math.Sqrt(1 - a)); 
        double d = R * c;

        return d;   
}

但我从代码和网站http://www.movable-type.co.uk/scripts/latlong.html得到了不同的答案。 例如,对于输入:pos1.Latitude = 12.916822Pos1.Longitude = 77.599816 和pos2.Latitude = 12.917135和Pos2.Longitude = 77.585783 我的程序返回34.843(当我在答案上做Math.Round((dist), 4)时),因为网站给出了1.521公里 任何人都可以指出什么是错的? PS:我的程序以米为单位计算距离。

2 个答案:

答案 0 :(得分:4)

我正在快速查看它,这应该是一个简单的解决方案。如何更改以下内容:

double dLon = toRadian(pos2.Longitude - pos2.Longitude);

...进入:

double dLon = toRadian(pos2.Longitude - pos1.Longitude);

请注意pos1 / pos2错字? :)

答案 1 :(得分:0)

我建议您更改实施以使用GeoCoordinate

上提供的内置dotnet

这可能比您的实施测试更好。