跟踪GPS点并找到他们最近的邻居?

时间:2013-06-12 16:05:02

标签: android mysql algorithm gps nearest-neighbor

我在地球上有一个100万(缓慢)移动点的列表(存储为纬度和经度)。每隔一段时间,每个点都会请求100个最近的其他点的列表(如果有帮助,可以配置最大范围)。

不幸的是,SELECT * SORT BY compute_geodetic_distance() LIMIT 100太慢,无法一遍又一遍地完成每个点。所以我的问题是:我该如何有效地处理这个问题?是否有更好的算法/数据结构/ ...为此而闻名?或者这是唯一的方法,我应该考虑分配服务器负载吗?

(注意:这是针对Android应用程序而且点数是用户,因此如果我缺少特定于Android的解决方案,请随时说出来!)

4 个答案:

答案 0 :(得分:1)

为您的任务发明了地理空间数据库 有Oracle Spatial(昂贵)和PostGres(免费) 这些数据库将您的数百万个点存储在地理索引中,即四叉树(Oracle)。 这样的查询几乎不需要时间。

有些人,比如我喜欢离开数据库并建立自己的四叉树。

操作搜索和插入很容易实现。更新/删除可能更复杂。(与实施工作相关的最便宜的是建立一个新的四叉树evry分钟)

使用四叉树,您可以在一秒钟内完成数百或最近100个点的thousansds。

答案 1 :(得分:0)

从架构上来说,我会安排每个“点”,当服务器的位置发生变化超过一定数量时,可以通过电话回家。在服务器上,您可以繁重地计算移动点与其他每个点之间的距离,并且如果需要,可以更新其他100个最近点的列表。然后,您可以将更改推送到点最近的100个列表(如果您使用的是App Engine,则支持Android推送)。

这将所涉及的工作量减少到绝对最小值:

  • 仅在某个点移动得足够时报告位置更改
  • 仅在收到报告时重新计算距离
  • 每次都不要为一个点重建最接近的100个列表,建立一次列表,然后计算出是否要从每个其他点的列表中添加或删除已移动的点。
  • 仅通知其前100个列表的更改点以保留带宽。

你可以使用一些算法来提高效率,这个问题也有一个fork / join的感觉,让你在这个问题上抛出马力。

答案 2 :(得分:0)

您必须将地球划分为区域,然后使用内部点算法来确定手机所在的区域。每个可能的区域子集将唯一地确定100个最接近的节点以达到合理的近似值。您可以通过逐个检查候选节点的距离来获得一组精确的100个节点,这些节点(再次)由区域子集确定。

答案 3 :(得分:0)

而不是r-tree或四叉树,即空间索引,你也可以使用四核和怪物曲线。该曲线减小了尺寸并完全填充了空间。你可以从phpclasses.org下载我的php类hilbert曲线。您可以使用简单的varchar列作为quadkey,并从左到右搜索级别。一个很好的解释是来自微软Bing地图的四键网站。