我想计算两个GPS位置之间的方位,我为我的算法提出了this page建议:
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;
}
我有以下测试样本:
但是,我获得了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; }
}
答案 0 :(得分:2)
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
。
答案 1 :(得分:0)
看起来您的纬度和经度变量是浮点数(单精度)。如果是这种情况,那么您将面临精确错误。