【问题标题】:How do I check if a point is behind another point relative to its location and course?如何检查一个点相对于它的位置和路线是否落后于另一个点?
【发布时间】:2015-07-09 04:41:45
【问题描述】:

我正在开发一个高度依赖地理位置和基于它的计算的应用程序。其中一个视图是列表视图,它提供了用户位置后面的移动 POI 列表。

+---------------------------+
+------  .            ------+
+-----    .            -----+
+----      .  [POI1]    ----+
+---        .     /      ---+
+--          .   /        --+
+-            . /          -+
+           [ME]            +
+-              .          -+
+--              .        --+
+---              .      ---+
+----  [POI2]      .    ----+
+-----              .  -----+
+------              .------+
+---------------------------+
/ = user course
..= perpendicular line
[POI1] = in front
[POI2] = Behind

到目前为止,我已经制定了以下步骤:

  1. 获取用户位置
  2. 检索半径 5 公里内的 POI
  3. 以更高的速度和相同的航向(自身航向的 +/- 45 度)过滤所有 POI

下一步是确定哪些 POI 在用户前面,哪些在后面。我想出的方法是创建一条垂直于用户路线的无限线(矢量)。 (例如,在东北方向的 45 度航道上,该线将是西北-东南)。然后我需要弄清楚每个 poi 的经纬度是在这条线的前面还是后面,以便知道它是在用户前面还是后面。

所有这些都是在 javascript 中使用纬度和经度完成的。所以我可能需要某种公式或函数来比较两个 latlng 点,相对于第一个点的过程。

到目前为止,Google 的帮助并不大,所以我真的希望有人能解决这个问题!与此同时,我会因为在数学课上没有足够的注意力而感到羞耻。

【问题讨论】:

    标签: javascript math geolocation geometry geo


    【解决方案1】:

    在上述情况下,首先计算 [ME] 和 [POI1] 之间连线的斜率。通常,您想要计算用户和他们正在前往的点之间的斜率(即他们的路线的斜率),在这种情况下是 POI1。为此,请使用点斜率形式获得直线斜率 y1 - y2 = m * (x1 - x2),其中 [ME] 的坐标为 (x1,y1),[POI1] 的坐标为 (x2,y2)并求解 m。现在让 z = -1/m。这是垂线的斜率。

    回到点斜率形式,垂直于用户和POI1的线的一般方程为y - y1 = z * (x-x1)。然后做代数,将方程的形式改为y = z * x + b,对于一些b。更改表格后,为 x 插入 x2。如果 y2 > z * x2 + b,那么我们的不等式将使用“”符号。 WLOG,说我们需要使用“>”符号。那么,对于每个坐标为(k,j)的POI,如果j > z * k + b,那么这个点就在用户的后面。

    我知道这不是特别清楚,特别是如果你有一段时间没有做过这样的几何,所以这里有一个例子。让 [ME] 有坐标 (1,1) 并假设它们朝向点 (3,2) 的方向。然后,垂直线的斜率由 1 - 2 = m * (1 - 3) 给出,这意味着 m = 1/2。因此,垂直线的斜率 z = -1/(1/2) = -2。现在垂直线的方程由 y - 1 = -2 * (x - 1) 给出,在求解 y 后得到 y = -2x + 3。观察到 2 > -2*3 + 3。所以,我们的最终不等式需要使用“

    希望这会有所帮助。另外,计算 m 时要小心,因为如果 x1 - x2 = 0,m 将是未定义的。这仅仅意味着斜率是直上直下,因此垂直斜率将为 0。同样,如果 m = 0,z 将直上直下。

    【讨论】:

    • 感谢您出色的回答!然而,我的解决方案最终变得更加简单。
    【解决方案2】:

    我有几个非常好的和有趣的方法来解决这个问题。 最简单有效的方法是使用库来计算 2 个 LatLon 点之间的方位。

    我使用GeoDesy's latlon-spherical.js 及其.bearing() 方法来获取从我到我的POI 相对于真北的方位。

    1. Get bearing to POI relative to true north
    2. Subtract my own bearing to get bearing relative to me
    3. Normalize bearing (e.g. add 360 to negative values)
    4. Check if bearing is between 90 and 270 (this means going backwards)
    

    在我的代码中是这样的:

    function filterShipFromBehind(ship)
    {
        // Get our and the ships latlon
        var shipLatLon = new LatLon(ship.location.latitude, ship.location.longitude);
        var myLatLon = new LatLon(myShip.location.latitude, myShip.location.longitude);
    
        // Calculate the bearing from us to the ship (relative to true north)
        var bearing = myLatLon.bearingTo(shipLatLon);
    
        // Calculate the relative bearing by subtracting our own bearing
        var difference = Ships.normalizeAngle(bearing - myShip.courseOverGround);
    
        // Finally check if the relative bearing is between 90 and 270 degrees
        // indicating it is behind us
        if(difference > 90 && difference < 270)
        {
            filterShipNearing(ship);
        }
    }
    

    我希望这有助于下一个想要解决这个问题的人!

    【讨论】:

      猜你喜欢
      • 2012-08-08
      • 2011-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-26
      • 1970-01-01
      • 2021-03-14
      • 1970-01-01
      相关资源
      最近更新 更多