【问题标题】:anything better than bounding boxes?有什么比边界框更好的吗?
【发布时间】:2010-12-23 07:55:16
【问题描述】:

我有一个场景,我有 x 百万个经度纬度点。

添加新的长/纬点时,我想有效地了解哪些其他点在用户配置的距离参数内,以便将它们添加到列表中。

有比边界框更好的东西吗?

我希望看到算法、参考和一些实现;)非常感谢!

【问题讨论】:

  • 几分钟前刚刚回答了这个问题:stackoverflow.com/questions/1847310/…
  • 请记住,long/lat 很奇怪,因为距离会根据纬度而变化。如果所有数据都在一个国家内,那没什么大不了的。但我见过人们忘记在全球数据集上处理这个问题。
  • 哦,当然,不要忘记经度是环绕的。 :-)
  • @drhirsch 没错,但在地理定位方面有一些特殊的兴趣点。

标签: algorithm geolocation gis space-partitioning


【解决方案1】:

有很多更好的选择,主要基于space partitioning

使用KD-Tree 是一个常见且通常非常好的选项(实施起来并不难)。 Quadtrees 更容易实现,但搜索速度较慢。根据您的数据分布和您的要求,其他空间分区算法可能性能更好、内存要求更低或其他相关问题。

【讨论】:

  • 我绝对同意他想做一些空间分区。不过,他将不得不修改四叉树的概念以使其发挥作用,因为它适用于区域为矩形的二维空间。正如 Nosredna 正确指出的那样,他还需要担心包装问题。
  • 是的,但是在这些情况下可以使用四叉树和 kd 树。四叉树更容易,因为在这种情况下处理包装变得更容易。不过,通常情况下,您不是在处理此类情况下的全球案例,而是处理较小的区域,在这种情况下,大多数问题都不太成问题。
【解决方案2】:

一位同事告诉我,他在使用 Morton-Code 作为 GIS 数据的空间索引方面有很好的经验,也许这值得研究。

【讨论】:

  • 我在一个拥有数千万条记录的数据库中使用了莫顿代码——它们运行良好。
【解决方案3】:

这种快速而简单的方法可能会为您省去一些麻烦:将地球表面划分为 1 度的盒子。然后,您将拥有一个 180x360 元素数组,您只需要搜索少量框,包括包含新点的框和紧邻它的所有框,其中一个角在用户指定的距离内。你会发现有一些技巧可以用来快速找出要使用的盒子,而无需考虑所有这些。只是不要忘记纬度和经度环绕。

如果你的“唯一”有数百万个点,并且它们没有聚集成热点,那可能会让你通过。

一种理论上优越的方法:您可以将每个点映射到三维空间,然后将它们存储在octree 中,这样您就可以快速找到任意距离内的附近点。当然,三维空间中的距离会与地球上的大圆距离略有不同,所以需要计算一个换算系数。不过,这应该很简单。您没有提到实现语言,但几乎可以肯定,对于您正在使用的任何语言,都会有一个经过良好测试的八叉树实现。如果您不介意插入第三方代码,那么这个解决方案就是去吧。

【讨论】:

    猜你喜欢
    • 2012-08-28
    • 1970-01-01
    • 2011-07-27
    • 2010-09-11
    • 2012-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多