【问题标题】:how to sort geographical data for quick search如何对地理数据进行排序以便快速搜索
【发布时间】:2012-07-12 16:33:05
【问题描述】:

我有一些地理定位的对象(每个对象都有纬度 + 经度)。 我的 App 需要显示移动设备 GPS 位置周围 3 公里的物体。 我有数千个对象,它们分布在大范围内(例如,美国的几个州、几个小国家),这意味着在我的对象列表中,我可以有一个位于纽约市,另一个位于迈阿密,但我也可以有对象非常接近(几米)。

目前,我的应用程序执行迭代搜索。对于每个对象,我使用 GPS 位置计算距离,如果距离

我想有一种方法可以使用地理坐标对我的对象进行排序,然后可以更快地找到位于 GPS 位置周围的对象。

我目前的想法只是用“极端点”计算矩形,北/南/东/西(距离 GPS 位置 3 公里)来限制搜索区域。接下来,我将仅计算此框内对象的距离。 我认为可以做一些更好的事情,但我不知道......

我们将不胜感激任何建议 ;-) 谢谢,

塞伯。

【问题讨论】:

    标签: algorithm search sorting geolocation latitude-longitude


    【解决方案1】:

    听起来像nearest neighbor search,但没有最大邻居数(如在kNN中),但有最大距离阈值。

    一种常见的方法是将对象放入特殊的数据结构中,以便快速排除大部分搜索空间。 但是,这些通常是在考虑欧几里德空间的情况下制作的,而不是针对球形(纬度/经度)平面(环绕问题)。 因此,您可能需要将坐标转换为笛卡尔坐标系中相对于球体中心的 3d 坐标,然后才能应用以下数据结构之一来有效搜索对象:

    【讨论】:

    • 我认为直接在 lat/lon 中的四叉树几乎适用于所有场景。如果经度是 0-360,那么我会更改它,以便数据中的“接缝”在日期线上而不是零(所以所有问题都只在北极、南极和太平洋) .
    • 非常感谢,我会研究Octree和kd-tree。如果对我的小大脑来说不是太复杂的话,它可能可以用它做点什么!
    【解决方案2】:

    提到空间索引的其他答案是正确的,但不一定是最简单的解决方案。

    我会考虑一些更简单的事情: 按国家/地区,然后按州、地区、城市,最后按密集城市中的一些地标(您有很多对象)对项目进行分组。

    然后,您只需要执行一些查询(检查我在哪个国家、哪个州、哪个地区等),就可以将自己限制在非常小的一组对象中,而无需在您的移动应用中实现高级数据结构。

    【讨论】:

    • 如果我在区域边界附近怎么办?
    • @smocking:搜索所有这些。这可能很少见,并且不会让您太慢。
    【解决方案3】:

    在没有专门的数据结构的情况下执行此操作的一种方法似乎是对数据的两个副本进行排序 - 一次按经度,一次按纬度。任何二进制搜索以关闭纬度和经度的东西都是关闭的。

    同样,您可以使用常用的 treap(快速)或红黑树(低可变性)。

    但是使用 r-tree 或 kd-tree 可能有一些优势。我所描述的可能只是为了避免采用新的依赖项或避免从头开始编写新的数据结构。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-02
      • 2017-10-03
      • 2016-09-25
      • 1970-01-01
      • 1970-01-01
      • 2010-10-25
      • 1970-01-01
      • 2014-10-18
      相关资源
      最近更新 更多