1

我想计算 2 个 GPS 位置之间的方位,我为我的算法愚弄了这个页面建议:

    public static double Bearing(IPointGps pt1, IPointGps pt2)
    {
        double x = Math.Cos(pt1.Latitude) * Math.Sin(pt2.Latitude) - Math.Sin(pt1.Latitude) * Math.Cos(pt2.Latitude) * Math.Cos(pt2.Longitude - pt1.Longitude);
        double y = Math.Sin(pt2.Longitude - pt1.Longitude) * Math.Cos(pt2.Latitude);

        // Math.Atan2 can return negative value, 0 <= output value < 2*PI expected 
        return (Math.Atan2(y, x) + Math.PI * 2)%(Math.PI * 2);
    }

然后我使用这种方法将我的值转换为度数

    public static double RadiansToDegrees(double angle)
    {
        return (angle * 180.0) / Math.PI;
    }

我有以下测试样本:

  • Point1 (lat, long) = 43.6373638888888888888888888888889, 1.3576222222222222222222222222222
  • Point2(纬度,经度)= 43.6156444444444444444444444444444,1.380225
  • 预期方位角 = 323°

但是,我获得了 315.5°(5.5062235835910762 rad)的方位角。如果我计算预期的弧度值,我会得到 5.637413,这毫无疑问是我的问题在于我的方位方法。

我已经使用 .Net Math 包(包括 Cos、Sin、Tan 和 ATan 方法)实现了其他计算方法,并且我的单元测试以 1e-12 精度通过。我错过了什么?

PS:我还尝试重新实现 Atan2 方法,以防它缺乏精度。我得到了同样的结果

编辑:根据以下界面,我的纬度和经度是双倍的

public interface IPointGps
{
    double Latitude { get; }
    double Longitude { get; }
}
4

2 回答 2

3

Math.Sin()并且所有类似的方法都期望以弧度表示参数,但是您的纬度和经度以度为单位。在计算方位角或修改方位角计算之前,您必须将 IPointGps 转换为弧度,例如:

public static double Bearing(IPointGps pt1, IPointGps pt2)
{
    double x = Math.Cos(DegreesToRadians(pt1.Latitude)) * Math.Sin(DegreesToRadians(pt2.Latitude)) - Math.Sin(DegreesToRadians(pt1.Latitude)) * Math.Cos(DegreesToRadians(pt2.Latitude)) * Math.Cos(DegreesToRadians(pt2.Longitude - pt1.Longitude));
    double y = Math.Sin(DegreesToRadians(pt2.Longitude - pt1.Longitude)) * Math.Cos(DegreesToRadians(pt2.Latitude));

    // Math.Atan2 can return negative value, 0 <= output value < 2*PI expected 
    return (Math.Atan2(y, x) + Math.PI * 2) % (Math.PI * 2);
}

public static double DegreesToRadians(double angle)
{
    return angle * Math.PI / 180.0d;
}

返回轴承5.637716736134105

于 2018-04-15T08:13:14.953 回答
0

看起来您的纬度和经度变量是浮点数(单精度)。如果是这种情况,那么您将面临精度错误。

于 2018-04-15T07:22:52.347 回答