使用纬度和经度查找路径最近点的算法

时间:2017-11-04 10:11:08

标签: algorithm performance google-maps

大家好,
我需要一种方法来解决以下问题。

输入:

  • 数据库中的(纬度,经度)表示的很多点
  • 作为(纬度,经度)数组的给定路径,路径由使用两个后续点形成的所有段的总和组成。

输出

  • 更接近路径的点。为清楚起见:该点与构成路径的一个段之间的距离必须小于或等于所有点与所有段之间的所有其他距离。

这是我到目前为止所能想到的:

  • 以较小路径分解路径
  • 为每个新路径计算相关区域的范围。
  • 对每条路径区域内的所有点进行数据库查询。
  • 计算所有结果点与相对区域中的线段之间的距离
  • 选择较小的

n.b。显然,我将在一个单独的线程上计算每个新路径。

n.b.b。这只是"基本思想",在这个解决方案中存在很多问题,我没有表现出希望简化它,例如,边界需要具有适当的大小一定要包括所有候选人的观点。

由于有很多要点,我想以最有效的方式进行搜索,我想听听你的一些建议,以改善我的解决方案,或者用更好的东西彻底改变它。 / p>

感谢您的时间,如果您想要澄清,请发表评论。

1 个答案:

答案 0 :(得分:0)

由于似乎没有人解决(或者可能理解XD)我的问题,我会写下我自己刚刚完成的事情。

基本上我使用了我在问题上发布的相同解决方案,但在这个答案中,我将解释我在实施过程中发现的一些问题,希望有一天会有人发现这个问题很有用。

所以,算法是这样的:

  • 在较小的数组中分解路径数组。每个阵列都有一个总距离,我试着保持不到4公里。如果两个后续点距离超过4公里,则它们将仅在阵列中。要计算使用Location.distanceBetween库的2个LatLng点之间的距离。

  • 对于每个新路径,计算相关区域的边界。要计算边界,表示为SouthOvest边界和NorthEast边界,我只需要检查数组中的所有点并保存纬度和经度的最低点和最大值。要包括路径附近但超出界限的点数,我只需将500米减去SouthOvest纬度和经度,并向NorthEast纬度和经度增加500米,有关如何执行此操作的更多信息here

  • 对每个路径区域中的所有点进行数据库查询。因为我选择运行所有"小路径"在不同的线程上我使用SQLite时遇到了一些麻烦,没什么太难的,你只需要了解getReadableDatabase是如何工作的,更多信息here

  • 计算所有结果点与之间的距离 相对领域的细分市场。没有什么困难,需要计算每个点和小路径的每个段的距离点段。有关如何使用LatLng点here

  • 执行此操作的更多信息
  • 选择较小的一个。当线程停止时,主线程获取所有结果,删除任何副本(只是为了解决问题中提到的交叉区域的可能性)。