我有一个场景,我有100万经度纬度点。
当添加新的长/纬度点时,我想知道有效哪些其他点在用户配置的距离参数内,所以我可以将它们添加到列表中。
有什么比边界框更好的东西?
我很想看到算法,参考资料和一些实现;)非常感谢你!
答案 0 :(得分:3)
有很多选项更好,主要是基于space partitioning。
一个常见的,通常非常好的选择(实施起来不太难)是使用KD-Tree。 Quadtrees更容易实现,但搜索速度较慢。根据数据的分布和您的要求,其他空间分区算法可能表现更好,内存要求更低或其他相关问题。
答案 1 :(得分:1)
一位同事告诉我,他在使用Morton-Code作为GIS数据的空间索引方面有很好的经验,这可能值得研究。
答案 2 :(得分:1)
这种快速而肮脏的方法可以为您节省一些悲伤:将地球表面划分为1度框。然后你将有一个180x360元素阵列,你只需要搜索少量的盒子,包括包含新点的盒子和紧邻它的所有盒子,其中一个角落在用户指定的距离内。您会发现有一些技巧可以用来快速找出要使用的盒子而不考虑它们。只是不要忘记纬度和经度环绕。
如果你的“唯一”拥有数百万分,并且它们没有聚集成热点,那么这可能会让你通过。
一种理论上优越的方法:您可以将每个点映射到三维空间,然后将它们存储在octree中,这样您就可以在任意距离内快速找到附近的点。当然,三维空间中的距离与地球上的大圆距离略有不同,因此您必须计算转换因子。但这应该很简单。您没有提到实现语言,但几乎可以肯定,对于您正在使用的任何语言,都会有一个经过良好测试的八叉树实现。如果您不介意插入第三方代码,那么这个解决方案就是去。