【问题标题】:Google Maps: Given a point, how to find all points at a given road distance?谷歌地图:给定一个点,如何找到给定道路距离的所有点?
【发布时间】:2015-08-25 19:03:59
【问题描述】:

在我的应用中,GPS 会选择车辆的位置。然后应该在车辆向任何方向行驶 1 公里时可能出现的所有点放置标记(请注意,在他的 1 公里范围内,道路可能会分叉很多次)。

有人可以建议我怎么做吗?提前致谢。

【问题讨论】:

  • 您是否正在寻找一种不允许“双退”的解决方案,这样您就不能两次翻越道路,或者最终回到您开始的地方?在市中心的情况下,您可以反复绕街区行驶 1 公里!
  • 是的,没有双重支持。实际上,这就像在说...如果您还剩下 1 公里的储备燃料,那么所有加油站都在您的范围内。
  • 如果您正在寻找一个加油站/加油站,那么在一个半径范围内找到所有此类位置然后检查每个候选目的地的行车路线距离不是更快吗?
  • @Jason:好点。我也会先探索这个选项。
  • 值得一看(源代码中的javascript):freemaptools.com/how-far-can-i-travel.htm

标签: algorithm google-maps


【解决方案1】:

这是使用 Google Maps API 解决的一个非常棘手的问题。以下是您可能要考虑的一种方法:

  1. 您可以轻松计算出围绕您的 GPS 点 1 公里的边界圆,也可以轻松计算落在该圆圆周上的任意角度的点。这个距离将是“作为乌鸦文件”而不是实际的道路距离,但您可能需要查看以下 Stack Overflow 帖子以了解具体实现:

    How to calculate the latlng of a point a certain distance away from another?

    在半径为 1 公里的边界圆上以 20 度间隔标记的屏幕截图:

删除了死掉的 ImageShack 链接 - 如何计算距离另一个点一定距离的点的纬度?

  1. 还有一个技巧可以将这些点捕捉到最近的街道。您可以查看 Mike Williams' Snap point to street examples 以获得良好的实现。

    可以使用 Google Maps API 的方向服务来计算从您的 GPS 点到每个捕捉到的道路点的道路距离。请注意,这仅适用于支持谷歌地图方向的国家,但更重要的是,道路距离几乎总是大于 1 公里,因为我们的边界圈“如乌鸦飞翔”的半径为 1 公里。但是,如果您可以使用近似信息,这可能已经是一种可能的解决方案。

  2. 你也可以考虑从上面的解决方案开始(1km包围圈,计算圆周上的x点,然后捕捉到最近的道路),然后计算每条路径的道路距离(从你的GPS点到每个捕捉点),然后您可以对每条路径递归地重复此操作,每次使用较小的边界圆,直到达到接近 1 公里的道路距离。您可以根据误差幅度减小每次递归中的边界圆,以提高算法的效率。


更新:

我发现了一个非常简洁的实现,它似乎使用了与我上面描述的方法类似的方法:

请注意如何从顶部更改度数间隔。如果间隔较宽,您将获得快速的结果,但您很容易错过一些路线。

截图:

删除了无效的 ImageShack 链接 - 行驶半径

【讨论】:

  • 您能否链接到有关您如何创建第一张图像的某种解释? (带有圆周上点坐标的边界圆)谢谢!
  • 我想通了。我是这样做的:jsfiddle.net/bradleygriffith/eh4NJ 很大程度上基于 ConroyP 提供的功能:stackoverflow.com/questions/3552334/…
  • 不错!在使用它之前,您应该将边界圆设为一个圆(它实际上是代码中的一个椭圆(只需检查更高的纬度,例如 70 度或)。不过,这可以通过适当的数学轻松解决。
  • 给定链接 maps.forum.nu/gm_driving_radius.html 已损坏,请尽可能提供新链接。
【解决方案2】:

自然蛮力算法是建立一个所有可能节点的列表,考虑到每个十字路口的每个可能决策。

我怀疑在 1 公里内你平均会得到超过 10 个十字路口,假设在一个十字路口平均有 3 个选择,你最终会得到 3^10 - 大约 59,049 个末端节点(请注意,你需要在每个十字路口有 10 个十字路口)支路达到全数)。

实际上这个数字会下降,我认为通过不同的路线到达同一个节点并不少见,尤其是在城市中。

这种方法会给你一个准确的答案(假设你有好的街道地图作为输入)。这是潜在的时间,但 n 似乎没有那么高,所以它可能是实用的。

可能会进一步改进和优化,具体取决于您需要这些节点做什么(或者您认为哪种场景足够相似以修剪它们)。

【讨论】:

  • 各位,非常感谢您的回复。显然这不是一个容易解决的问题。我目前正在暂停工作……但当我回到它时,一定会通知你们所有人。非常感谢所有这一切。我会将丹尼尔的答案标记为正确答案,因为 SO 不允许我标记多个正确答案。
【解决方案3】:

在上面详细说明 Daniel 的方法时,您首先要找到从原点开始的直线半径内的所有点。那是您的起始节点集。现在在您的起始集中包括与这些节点和其他节点相关的所有边。现在检查节点是否已连接,并且没有任何节点漂浮在您无法到达的地方。现在从您的车辆节点开始创建一个“shortest path tree”。

树将为您提供从起始节点到所有其他节点的最短路径。请注意,如果您从在最远节点创建路径开始,则任何子路径也是沿途到这些节点的最短路径。确保在继续时在子路径上标记这些节点,这样您就不需要计算它们。在最坏的情况下,您需要为所有节点开发一条最短路径,但实际上这应该花费更少的时间。

【讨论】:

    【解决方案4】:
    1. 列出所有可能的节点,考虑每个十字路口的每个可能的决定 (但是如何自动完成呢?
    2. 使用 Dijkstra 算法查找到所有点的闭合路线。
    3. 可视化数据。 (这有点棘手,因为在可到达区域内可能存在无法到达的区域。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-06
      相关资源
      最近更新 更多