用于获取"around me"地理位置的"in memory"数据结构



我需要创建寻找关注点的方法(类),位于给定距离内。

类似的东西:

Collection <Position>  getAroundMe(Position myPosition, int distInMeters); 

该方法应使用"内存数据"(不是DB)。

位置类是:

Position {
    double latitude;
    double longitude;
}

我想使用树来存储感兴趣的点,但是我未能为两个(纬度和经度)字段定义比较器。

请您的建议。

评论:"内存数据中的"中"中的"内存数据"很少更新,每分钟getarroundme方法的1000调用(目前与DB一起使用)。

您必须在位置更改时不断更新地图,这样可能不是一个选项。

方法1

一种简单的方法可能是维护两个按经度和纬度排序的列表。当获得距离x到当前位置时,您可以执行以下操作:

  • 获取间隔current.longitude /- x并在经度列表中查找间隔,例如通过使用二进制搜索。
  • 对纬度做同样的事情。
  • 仅保留两个间隔的位置。
  • 根据到您当前邮局的距离对位置进行分类。
  • 使用二进制搜索定位和删除大于x的所有位置。

方法2

一种替代方案,但更复杂的方法可能是四棵四树您将在正方形上具有指数增长),并将其分配给各自的叶子正方形。

然后,通过检查自上而下的侧面长度x的平方盒,在当前位置触摸了哪些叶子正方形。这样做,您将获得可能位于直径x围绕位置的位置列表

方法3

您可以尝试的另一种选择是所谓的哈希网格(例如,请参见:http://www.gicentre.net/utils/hashgrid/)。因此,您基本上基于(粗糙)位置定义了一个函数,即您将位置截断为某些"单元大小",并计算出较低的精度位置的哈希值。您最终会有附近的位置具有相同的哈希,因此处于同一虚拟单元格中。由于您不想使用与单元格一样多的存储桶,您的哈希值可能最终会包裹起来,最终您会在每个桶中列出一个不彼此接近的单元格。

检查位置时,您首先计算当前位置周围的圆圈将触摸哪个单元,然后在哈希图中查找它们。然后,您将像以前一样检查这些单元格中的位置。

最新更新