c# hasrsine implementation 给出了与 googlemaps/movable-type.co.uk 不同的答案

Posted

技术标签:

【中文标题】c# hasrsine implementation 给出了与 googlemaps/movable-type.co.uk 不同的答案【英文标题】:c# haversine implementation gives different answer than googlemaps/movable-type.co.uk 【发布时间】:2014-07-26 14:13:03 【问题描述】:

我需要计算两点之间的距离(给定纬度和经度)。我在 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:我的程序以米为单位计算距离。

【问题讨论】:

【参考方案1】:

我正在快速查看它,这应该很容易解决。如何更改以下内容:

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

...进入:

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

注意到 pos1/pos2 错字了吗? :)

【讨论】:

【参考方案2】:

我建议更改您的实现以使用 GeoCoordinate 上提供的内置 dotnet

这可能比你的实现测试得更好。

【讨论】:

以上是关于c# hasrsine implementation 给出了与 googlemaps/movable-type.co.uk 不同的答案的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Eloquent - hasrsine 公式和分页

从 pandas 数据框到元组(对于 hasrsine 模块)

我无法在 python 中的数据系列中创建新列,以便对 hasrsine 公式进行赋值

如何在 NamedQuery 中编写 NamedQuery hasrsine 公式?

与在线工具和谷歌地图相比,为啥我的 Python hasrsine 距离计算错误?

Advanced Simulation Library(ASL)&& An adaptive and distributed-memory parallel implementatio