两个坐标计算之间的轴承奇怪输出

时间:2010-10-21 04:15:33

标签: c# trigonometry gis

我有一种方法可以计算两个地理坐标之间的方位(40.7486,-73.9864示例格式)。

但是,我有一个问题,它计算的标题与我使用经过试验和测试的应用程序计算的标题不同。

例如,以下几点之间的初始方位是074度,但我的方法返回047。
40.7486, -73.9864
40.9486, -72.9866

这是代码的相关信息。

        /// <summary>
    /// Calculate the inital bearing between two Locations
    /// </summary>
    /// <param name="pointA"></param>
    /// <param name="pointB"></param>
    /// <param name="headingType"></param>
    /// <returns></returns>
    public static double BearingToLocation(Location pointA, Location pointB)
    {
        // Convert both locations from degrees to radians
        pointA = LocationToRad(pointA);
        pointB = LocationToRad(pointB);

        double partOne = exMath.Sin(pointB.Longitude - pointA.Longitude) * exMath.Cos(pointB.Latitude);
        double partTwo = exMath.Cos(pointA.Latitude) * exMath.Sin(pointB.Latitude) - exMath.Sin(pointA.Latitude) * exMath.Cos(pointB.Latitude) * exMath.Cos(pointB.Longitude - pointA.Longitude);
        double heading = AdditionalMath.ToDeg(exMath.Atan2(partOne, partTwo) % 2 * exMath.PI);

        // Solve for compass wrap around
        if (heading < 0)
            heading += 360;

        return heading;
    }

    /// <summary>
    /// Return a new location in radians
    /// </summary>
    /// <param name="pointA"></param>
    /// <returns></returns>
    public static Location LocationToRad(Location pointA)
    {
        return new Location(AdditionalMath.ToRad(pointA.Latitude), AdditionalMath.ToRad(pointA.Longitude), pointA.Altitude);
    }

}

/// <summary>
/// Misc. math functions not available in Elze Kool's lib
/// </summary>
public static class AdditionalMath
{
    /// <summary>
    /// Degrees to radians
    /// </summary>
    /// <param name="x"></param>
    /// <returns></returns>
    public static double ToRad(double x)
    {
        return exMath.PI * x / 180.00F;
    }

    /// <summary>
    /// Radians to degrees
    /// </summary>
    /// <param name="x"></param>
    /// <returns></returns>
    public static double ToDeg(double x)
    {
        return x * 180.00F / exMath.PI;
    }
}

有人能看到这个问题吗?我看了一遍,找不到问题。

1 个答案:

答案 0 :(得分:1)

%在这一行看起来很可疑:

    double heading = AdditionalMath.ToDeg(exMath.Atan2(partOne, partTwo) % 2 * exMath.PI);