我有一个数据集,目前只存储在一个 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}]
如果有一个地方 1、2 和 3 都在{x: 0, y: 0}
。
我不知道解决此类问题的标准方法是什么。使用带有预先计算距离索引的 SQL DB 是行不通的,因为所提供的距离loc
是任意的。遍历整个数据库并计算所有内容的距离太低效,也太慢了。(我需要 < 30 毫秒的响应时间。)
唯一有意义的解决方案是以某种方式制作靠近位置的“桶”(在r
彼此之间),然后计算用户给定的 loc 和桶的 loc 之间的距离以首先缩小选项。但是我觉得自己创建这样的解决方案就像根本不使用数据库一样;必须有更有效/行业标准的方法。有吗?