double computeHeading(double latitude1, double longitude1, double latitude2, double longitude2)
{
double degToRad = PI / 180.0;
double phi1 = latitude1*degToRad;
double phi2 = latitude2*degToRad;
double lam1 = longitude1*degToRad;
double lam2 = longitude2*degToRad;
double x,y;
x = cos(phi2) * sin(lam2-lam1);
printf("X is %lf\n", x);
y = cos(phi1) * sin(phi2) - sin(phi1) * cos(phi2) * cos(lam2-lam1);
printf("Y is %lf\n", y);
return atan2(x,y)*180/PI;
}
所以,在研究找到轴承公式时,我一直在使用上述函数来获得两个纬度和经度点之间的真实方位(基于北方)。
我目前正在开发一个小型导航小部件,它使用Android中的GPS数据,当我移动并改变我的方向时,箭头指向A点(如果我在B点)。
所以我们假设一个场景:
我在B点,朝北,A点对我来说是300度(有点西北)。如果我面向南方,没有移动,我的B点与A点的相对位置应该是120度? (300-180)...
有人可以告诉我有关这些的正确计算。
TIA。
答案 0 :(得分:1)
有几种方法可以解决这个问题。第一个是你看起来正在做的事情,假设地球是球形的。相对轴承使用Haversine配方计算,用于大圆导航。给定起点和终点,这个公式找到了通过这两点的大圆。由此可以计算出初始轴承。这条大圆路线是两点之间的最短路线,但是一般来说,轴承在路线上不会是恒定的。此外,除了在一些非常具体的情况下,反向轴承的行为并不像您期望的那样,如果您想要一般地确定它,您将不得不执行另一个计算来反转起点和终点。
您可以使用的另一种方法是Rhumb系列配方。在这种情况下,起点和终点之间的方位是恒定的,如果您愿意,可以使用您对反向路线的关系。由于这通常与大圆距离不同,因此遵循Rhumb线不会导致两点之间的最短路径,但它确实通过保持路线不变来简化导航。
Calculate distance, bearing and more between Latitude/Longitude points
详细介绍了这两种方法另一种用于大圆导航的公式,它使用更精确的地球形状表示,一种扁椭球,一种特殊类型的椭圆体,归因于Vincenty,Karney提供了额外的增强功能。 {3}}。在这些情况下,配方相当复杂,对于大多数应用来说可能有点过分,而且性能比上面的Haversine配方差很多。但如果您需要,这些配方可提供更好的准确度。
<强>更新强>
根据下面的评论,主要问题是弄清楚要走多远。这将只是包含当前航向的大圆的平面法线与所需航向之间的角度。要获得当前航向上飞机的法线,您需要当前位置L
以及当前航向C
上距离一定距离的点。法线只是V = L×C
。要计算沿着所需航向的包含大圆的平面的法线,您只需要知道所需路线上的一个点,您已经以目标点的形式获得了该点,我们称之为D
。然后,您可以按U = L×D
找到正常值。它们之间的角度由θ = acos((U∙V)/(|U||V|))
给出。
要查找L
,C
和D
,您必须转换Latitude, Longitude, Altitude (LLA) coordinates into Earth Centered, Earth Fixed (ECEF) coordinates。