我需要创建寻找关注点的方法(类),位于给定距离内。
类似的东西:
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/)。因此,您基本上基于(粗糙)位置定义了一个函数,即您将位置截断为某些"单元大小",并计算出较低的精度位置的哈希值。您最终会有附近的位置具有相同的哈希,因此处于同一虚拟单元格中。由于您不想使用与单元格一样多的存储桶,您的哈希值可能最终会包裹起来,最终您会在每个桶中列出一个不彼此接近的单元格。
检查位置时,您首先计算当前位置周围的圆圈将触摸哪个单元,然后在哈希图中查找它们。然后,您将像以前一样检查这些单元格中的位置。