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


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 %lfn", x);
    y = cos(phi1) * sin(phi2) - sin(phi1) * cos(phi2) * cos(lam2-lam1);
    printf("Y is %lfn", y);
    return atan2(x,y)*180/PI;
}

我正在使用上述函数来确定两个地理坐标之间从北方的真实方位角。

我目前正在开发一个小型导航小部件,它使用来自Android传感器的GPS数据。该微件有一个面向远离设备当前位置的点的箭头。箭头的方向会随着设备的当前位置和方位角而变化,以始终面向远处的点。

下面是一个场景:

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

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

有几种方法可以解决这个问题。 第一个,也就是你看起来正在做的事情,假设地球是球形的。 相对方位角使用哈弗辛公式计算,用于大圆导航。 给定起点和终点,这个公式找到穿过这两个点的大圆。 由此可以计算出初始方位。 这条大圆路线是两点之间最短的路线,但存在一个问题,即方位通常不会沿路线恒定。 此外,除了一些非常特殊的情况外,反向方位角的行为与您似乎预期的那样,如果您想大致确定它,则必须执行另一次计算来反转起点和终点。

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

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

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

更新:

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

为了查找LCD,您必须将纬度、经度、高度 (LLA( 坐标转换为以地球为中心、固定地球 (ECEF( 坐标。

相关内容

  • 没有找到相关文章

最新更新