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
x
的方形框接触到哪些叶片方形,并且中心位于当前位置。这样做,您将得到一个位置列表,该列表可能位于位置周围的直径圆x
,因此您需要检查这些位置,并将所有位置从结果中移除
方法3
您可以尝试的另一种替代方法是所谓的哈希网格(参见此处示例:)。基本上,您可以根据(粗略)位置定义一个哈希函数,也就是说,您可以将该位置截断为某个“单元大小”,然后为该较低精度的位置计算一个哈希值。最终,您会发现附近的位置具有相同的散列,因此位于同一虚拟单元中。由于您不希望使用像单元格那样多的存储桶,因此哈希值可能最终会被包围,最终会在每个存储桶中出现一个彼此不接近的单元格列表
检查位置时,首先计算当前位置周围的圆圈将接触哪些单元格,然后在hashmap中查找它们。然后像以前一样检查这些单元格中的位置 这里有个愚蠢的问题,DB=数据库?是的。DB=数据库。谢谢。在发布问题之前,我已经测试了第一种方法。它工作正常(性能良好),但这里的关键是对两个集合进行迭代,以找出两个集合中常见的兴趣点,我希望避免这种情况。第二种方法听起来很有趣。一种分组。谢谢,我将对它进行测试。@bw\u dev您可以在第一种方法中使用set,同时使用
retainal()
方法。我还将添加第三种方法,您可能需要考虑。在一些评估之后,我实现了第一种方法。它很好用。与DB的并发连接没有问题,性能良好-比我们在DB上的性能更好
Position {
double latitude;
double longitude;
}