【问题标题】:Figuring out distance and course between two coordinates计算两个坐标之间的距离和路线
【发布时间】:2011-06-19 19:32:55
【问题描述】:

我有 2 个坐标,想做一些看似简单的事情。我想弄清楚,给定:

1) 坐标 A 2) Core Location提供的课程 3) 坐标B

以下内容:

1) A 和 B 之间的距离(目前可以使用 distanceFromLocation 完成),所以可以。 2) 从 A 到 B 应该走的路线(与当前行驶的路线不同)

有没有一种简单的方法来完成这个,任何第三方或内置 API?

Apple 似乎没有提供此功能,但我可能错了。

谢谢, ~阿拉什

编辑:

感谢您的快速响应,我相信可能有些混乱,我正在寻找课程(从 a 点到 b 点的度数,因此 0 度 = 北,90 度 = 东,类似于CLLocation 返回的课程值。不尝试按转弯方向计算实际转弯。

【问题讨论】:

    标签: iphone coordinates distance


    【解决方案1】:

    我在 github 上有一些代码可以做到这一点。看看headingInRadians here。它基于余弦的球面定律。我从this page上的算法推导出了代码。

    /*-------------------------------------------------------------------------
    * Given two lat/lon points on earth, calculates the heading
    * from lat1/lon1 to lat2/lon2.
    *
    * lat/lon params in radians
    * result in radians
    *-------------------------------------------------------------------------*/
    double headingInRadians(double lat1, double lon1, double lat2, double lon2)
    {
        //-------------------------------------------------------------------------
        // Algorithm found at http://www.movable-type.co.uk/scripts/latlong.html
        //
        // Spherical Law of Cosines
        //
        // Formula: θ = atan2( sin(Δlong) * cos(lat2),
        // cos(lat1) * sin(lat2) − sin(lat1) * cos(lat2) * cos(Δlong) )
        // JavaScript:
        //
        // var y = Math.sin(dLon) * Math.cos(lat2);
        // var x = Math.cos(lat1) * Math.sin(lat2) - Math.sin(lat1) * Math.cos(lat2) * Math.cos(dLon);
        // var brng = Math.atan2(y, x).toDeg();
        //-------------------------------------------------------------------------
        double dLon = lon2 - lon1;
        double y = sin(dLon) * cos(lat2);
        double x = cos(lat1) * sin(lat2) - sin(lat1) * cos(lat2) * cos(dLon);
    
        return atan2(y, x);
    }
    

    【讨论】:

    • 谢谢 progrmr,我现在正在检查这个!
    • double headingInRadians(double lat1, double lon1, double lat2, double lon2) 这是我尝试过的方法,并提供以下作为输入给我的结果是 -0.343130 弧度,我将其转换为度数并得到340.340088。你能验证我这样做是否正确吗?传递以下坐标: lat1 = 36.868148 long1 = -76.046454 lat2 = 39.174231 long2 = -77.111107 在使用以下等式进入公式之前,所有这些都转换为弧度:(值 / 180)* M_PI 任何帮助表示赞赏,再次感谢!
    • 您可以使用在线计算器自行检查,例如here
    【解决方案2】:

    【讨论】:

    • 使用这种方法,我得到 335.218658 度,这里发布的示例:movable-type.co.uk/scripts/latlong.html 给出的初始方位角为 159.*,最终方位角为 160.* 这是正确的还是正确的?
    • 看起来这个答案是使用带有等角投影的毕达哥拉斯定理,它不如我的答案使用的球面余弦定律算法准确,但它使用的三角函数较少,因此可能更快。阅读this page 了解不同算法的比较。
    • 似乎 159.~ 是正确的初始方位,如果您要反向行驶,那么从 b 点到 a 点的初始方位应该是 340,所以我认为我已经正确实施了并且我的最终方位告诉我从 b 点到 a 点的方位(相反的行进方向),但仍然是一个很好的方位数。想法?
    【解决方案3】:

    根据您想在这方面投入多少工作,我建议您查看Tree Traversal Algorithms(检查右侧的列),例如A* alpha star,您可以使用它们从某一点找到您的发现到另一个,即使中间有障碍。

    【讨论】:

      【解决方案4】:

      如果我理解正确,您拥有当前位置,并且拥有其他位置。您想找到两点之间的距离(如乌鸦飞翔),并找到两点之间的步行路径。

      要回答您的第一个问题,distanceFromLocation 将找到 2 点之间穿过地球表面的距离,即它遵循地球的曲率,但它会为您提供乌鸦飞行的距离。所以我认为你是对的。

      第二个问题要难得多。你想做的是一种叫做寻路的事情。路径查找,不仅需要一种搜索​​算法来决定路径,而且您还需要有关可能路径的数据。也就是说,如果你想找到一条穿过街道的路径,计算机必须知道街道是如何相互连接的。此外,如果您尝试制作一个考虑到流量和采用两条不同可能路径之间的时间差异的路径查找器,您将需要更多数据。正是出于这个原因,我们通常将这类任务留给拥有大量资源的大公司,例如 Google 和 Yahoo。

      但是,如果您仍然有兴趣这样做,请查看 http://www.youtube.com/watch?v=DoamZwkEDK0

      【讨论】:

      • 请参阅编辑后的帖子,我指的不是到达那里的路径,而是以度数为单位的方位角,例如北纬 90 度为 0 度,东等...
      猜你喜欢
      • 1970-01-01
      • 2020-02-12
      • 2018-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-12
      • 2016-07-16
      相关资源
      最近更新 更多