【问题标题】:Searching for "nearby" results搜索“附近”结果
【发布时间】:2013-09-27 03:36:16
【问题描述】:

我有一个数据集,目前只存储在一个 JSON 文件中,其中包含大约 40k 个不同的地理位置。它看起来像这样:

[
    {"title": "Place 1", "loc": {"x": "00.000", "y": "00.00000"}},
    {"title": "Place 2", "loc": {"x": "00.000", "y": "00.00000"}},

]

一个地方的loc 就是它的坐标。

我希望能够对此数据运行查询,因此对于任何给定用户输入的loc,我可以获得n 最近的地点。

或者换句话说,我想写一些函数f,这样它就可以工作了:

def f(loc, n): ...
f({"x": "5", "y": "5"}, 3) #=> [{"title": "Place 1", "distance": 7.073}, {"title": "Place 2": "distance": 7.073}, {"title": "Place 3", "distance": 7.073}]

如果在{x: 0, y: 0} 有地点 1、2 和 3。

我不知道解决此类问题的标准方法是什么。使用带有预先计算距离索引的 SQL DB 不起作用,因为提供的 loc 是任意的。遍历整个数据库并计算所有内容的距离太低效,也太慢了。 (我需要

唯一有意义的解决方案是以某种方式制作近距离位置的“桶”(在彼此的一些 r 内),然后计算用户给定的 loc 和桶的 loc 之间的距离以缩小范围选项第一。但是我觉得自己创建这样的解决方案就像根本不使用数据库一样;必须有更有效/行业标准的方法。有吗?

【问题讨论】:

  • Postgres(带有 PostGIS 扩展)对这种类型的查询有很好的支持。

标签: json database algorithm database-design geolocation


【解决方案1】:

这是nearest neighbor 问题的广义形式(更正式地称为k-nearest neighbor)。没错,solution that makes sense 使用存储桶。您可以将存储桶存储在允许您利用 SQL 的数据库中,只需过滤掉不在适当存储桶中的所有点。 Depending on your database,这实际上可能已经为您实现了,这将是您建议的“行业标准”方法。

否则,自己编写会非常有效,并且可以在不偏离数据库太多的情况下完成。

【讨论】:

    【解决方案2】:

    Oracle 提供空间数据功能。它有一个内置的最近邻函数SDO_NN,它将为您完成这项工作。只是无意中将所有数据放入db中,其余的将由oracle db处理。

    【讨论】:

      【解决方案3】:

      您可以使用具有点数据类型和空间索引的数据库,例如 MySQL。您还可以使用四键或四叉树。它是细分平面并减小尺寸。你可以下载我的 PHP 类 Hilbert-curve@phpclasses.org。它使用四键,可以帮助组织存储桶中的位置并建立邻近搜索。由于特殊的数据库,quadkey 可以减少重叠搜索。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-24
        • 2017-09-12
        相关资源
        最近更新 更多