Java ";“记忆中”;用于获取“的数据结构”;“在我身边”;地理位置

Java ";“记忆中”;用于获取“的数据结构”;“在我身边”;地理位置,java,data-structures,geolocation,range,Java,Data Structures,Geolocation,Range,我需要创建查找兴趣点的方法(类), 它们位于给定距离内 大概是这样的: Collection <Position> getAroundMe(Position myPosition, int distInMeters); 我想使用TreeSet来存储感兴趣的点,但未能为两个(纬度和经度)字段定义comparator 请给我你的建议 注释:“内存中的数据”很少更新,而大约 每分钟调用1000次GetAroundme方法(目前它与DB一起工作)。当位置发生变化时,您必须不断更新地图,

我需要创建查找兴趣点的方法(类), 它们位于给定距离内

大概是这样的:

Collection <Position>  getAroundMe(Position myPosition, int distInMeters); 
我想使用TreeSet来存储感兴趣的点,但未能为两个(纬度和经度)字段定义comparator

请给我你的建议

注释:“内存中的数据”很少更新,而大约
每分钟调用1000次GetAroundme方法(目前它与DB一起工作)。

当位置发生变化时,您必须不断更新地图,因此这可能不是一个选项

方法1

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

  • 获取间隔
    当前.经度
    +/-
    x
    ,并在经度列表中查找该间隔,例如使用二进制搜索
  • 对纬度也这样做
  • 仅在两个间隔中保持位置
  • 根据与当前位置的距离对位置进行排序
  • 使用二进制搜索查找并删除距离大于
    x
    的所有位置
方法2

另一种但更复杂的方法可能是四叉树,在其中定义一个包含所有位置的矩形区域,将其细分为4个大小相等的较小矩形,继续细分,直到达到合理的水平(不要太深,因为正方形会呈指数增长)并将这些位置分配给各自的叶方块

然后,通过自上而下检查边长为
x
的方形框接触到哪些叶片方形,并且中心位于当前位置。这样做,您将得到一个位置列表,该列表可能位于位置周围的直径圆
x
,因此您需要检查这些位置,并将所有位置从结果中移除

方法3

您可以尝试的另一种替代方法是所谓的哈希网格(参见此处示例:)。基本上,您可以根据(粗略)位置定义一个哈希函数,也就是说,您可以将该位置截断为某个“单元大小”,然后为该较低精度的位置计算一个哈希值。最终,您会发现附近的位置具有相同的散列,因此位于同一虚拟单元中。由于您不希望使用像单元格那样多的存储桶,因此哈希值可能最终会被包围,最终会在每个存储桶中出现一个彼此不接近的单元格列表


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

这里有个愚蠢的问题,DB=数据库?是的。DB=数据库。谢谢。在发布问题之前,我已经测试了第一种方法。它工作正常(性能良好),但这里的关键是对两个集合进行迭代,以找出两个集合中常见的兴趣点,我希望避免这种情况。第二种方法听起来很有趣。一种分组。谢谢,我将对它进行测试。@bw\u dev您可以在第一种方法中使用set,同时使用
retainal()
方法。我还将添加第三种方法,您可能需要考虑。在一些评估之后,我实现了第一种方法。它很好用。与DB的并发连接没有问题,性能良好-比我们在DB上的性能更好
Position {
    double latitude;
    double longitude;
}