2
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度。

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

4

1 回答 1

2

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

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

这两种方法都在计算纬度/经度点之间的距离、方位角等详细描述

大圆导航的另一种公式,它使用更准确的地球形状表示,扁球体,它是一种特殊类型的椭球,归因于文森蒂,并由Karney提供了额外的增强。在这些情况下,公式要复杂得多,并且对于大多数应用程序来说可能是多余的,并且性能比上面的 Haversine 公式要差得多。但是,如果您需要,这些公式可以提供更好的准确性。

更新:

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

为了找到L,您必须将纬度C经度、高度 (LLA) 坐标转换为以地球为中心的地球固定 (ECEF) 坐标D

于 2015-11-30T06:26:46.503 回答