你如何找到两点之间的相对方位?

How do you find relative bearing between two points?

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 数据。小部件有一个箭头指向远离设备当前位置的点。箭头方向随设备当前位置和方位角变化,始终朝向远方。

这是一个场景:

我在一个位置,朝北,另一个位置方位角为 300 度(在我的西北方向)。如果我面向南方,不动,我与远方的相对方位应该是120度。

如何找到考虑朝向(方位角)的相对方位角?

有几种方法可以解决这个问题。第一个,也就是你似乎在做的,假设地球是球形的。相对方位是使用 Haversine 公式计算的,用于大圆导航。给定起点和终点,这个公式找到穿过这两点的大圆。由此可以计算出初始方位。这条大圆路线是两点之间的最短路线,但存在方位问题,一般来说,沿路线不会保持恒定。此外,除了在某些非常特殊的情况下,反向轴承的行为并不像您预期​​的那样,如果您想要确定它的一般性,您将不得不执行另一次颠倒起点和终点的计算。

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

Calculate distance, bearing and more between Latitude/Longitude points

中详细描述了这两种方法

大圆导航的另一种公式使用更准确的地球形状表示,扁球体是一种特殊的椭球体,归功于 Vincenty with additional enhancements provided by Karney。在这些情况下,公式要复杂得多,对于大多数应用程序来说可能有点矫枉过正,而且性能比上面的 Haversine 公式差很多。但如果您需要,这些公式可以提供更好的准确性。

更新:

根据下面的评论,主要问题之一是确定要转多远。这将只是包含当前航向和所需航向的大圆的平面法线之间的角度。要在当前航向上获取飞机的法线,您需要当前位置 L 和当前航向 C 上一定距离外的一个点。正常就是V = L×C。要计算包含沿所需航向的大圆的平面的法线,您只需要知道沿所需路线的一个点,您已经以目的地点的形式拥有该点,我们称之为 D。然后你可以通过U = L×D找到法线。它们之间的角度由 θ = acos((U∙V)/(|U||V|)).

给出

为了找到 LCD,您必须转换 Latitude, Longitude, Altitude (LLA) coordinates into Earth Centered, Earth Fixed (ECEF) coordinates.