你如何找到两点之间的相对影响?

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。

有几种方法可以解决这个问题。 第一个是你看起来正在做的事情,假设地球是球形的。 相对轴承使用Haversine配方计算,用于大圆导航。 给定起点和终点,这个公式找到了通过这两点的大圆。 由此可以计算出初始轴承。 这条大圆路线是两点之间的最短路线,但是一般来说,轴承在路线上不会是恒定的。 此外,除了一些非常具体的情况外,反向轴承的行为并不像您期望的那样,如果您想要一般地确定它,您将不得不执行另一个计算来反转起点和终点。

您可以使用的另一种方法是Rhumb线配方。 在这种情况下,起点和终点之间的方位是恒定的,如果您愿意,可以使用您对反向路线的关系。 由于这通常与大圆距离不同,因此遵循Rhumb线不会导致两点之间的最短路径,但它确实通过保持路线不变来简化导航。

在纬度/经度点之间的计算距离,方位和更多内容中详细描述了这两种方法

另一种用于大圆导航的公式,使用更精确的地球形状表示,一种扁椭球,这是一种特殊类型的椭圆体,归功于Vincenty以及Karney提供的额外增强function。 在这些情况下,配方相当复杂,对于大多数应用来说可能有点过分,而且性能比上面的Haversine配方差很多。 但是,如果您需要,这些配方可提供更好的准确性。

更新:

根据下面的评论,主要问题是弄清楚要走多远。 这将只是包含当前航向的大圆的平面法线与所需航向之间的角度。 要获得当前航向上飞机的法线,您需要当前位置L和当前航向上距离一定距离的点C 法线只是V = L×C 。 要计算包含沿所需航向的大圆的平面的法线,您只需要知道沿着所需路线的一个点,您已经以目标点的forms获得了该点,我们称之为D 然后,您可以通过U = L×D找到法线。 它们之间的角度由θ = acos((U∙V)/(|U||V|))

为了找到LCD您必须将纬度,经度,海拔高度(LLA)坐标转换为地球中心,地球固定(ECEF)坐标 。