【问题标题】:Location/Proximity search on large record set大型记录集的位置/邻近搜索
【发布时间】:2015-01-26 14:48:22
【问题描述】:

假设我有一个数据库表,它代表可能有数百万条记录的用户(一厢情愿)。此表包含有关每个用户的大量信息,包括有关其位置的信息:

  • 城市
  • 县/州等
  • 国家
  • 纬度
  • 经度
  • 基于纬度/经度值的 Geohash。

我想实现一个功能,登录用户可以搜索附近的其他用户。

理想情况下,我想抓取地理上最接近用户的 20 个用户,然后是接下来的 20 个和接下来的 20 个等。所以基本上我希望能够按 距离某个点。

方法 1

我以前使用过半正弦公式来计算一个点和几百个其他点之间的距离。这种方法在相对较小的记录集上是理想的,但我担心在如此大的记录集上它会变得非常慢。

方法 2

我还对地理散列进行了一些研究,我了解散列是如何计算的,并且我了解了散列如何表示位置以及精度如何随着更短的分辨率而损失的理论。我当然可以通过抓取与他们的 geohash 具有相似开头的用户来抓取位于用户地理区域附近的用户(基于我指定的精度 - 并可能查看邻近区域)但这并不能解决问题需要按位置排序。这种方法也不适用于边缘情况,即 2 个用户可能彼此非常接近,但靠近由 geohash 表示的 2 个区域的边缘。

对此方法的任何想法/建议将不胜感激。我不是特别在寻找代码,但指向好的示例和资源的链接会有所帮助。

谢谢, 乔纳森

编辑

方法 3

经过一番思考,我想出了另一个可能的解决方案来考虑。在收到每个用户的位置信息后,我会将有关位置的信息(城镇/城市、地区、国家、纬度、经度、geohash 可能)存储在单独的表中(比如locations)。然后我会通过外键将用户连接到该位置。这会给我一个小得多的数据集来使用。为了找到附近的用户,我可以简单地找到靠近用户位置的其他位置,然后使用他们的 ID 来查找其他用户。也许可以通过存储每个位置的附近位置 ID 列表来实现某种缓存。

【问题讨论】:

标签: php mysql geolocation geohashing


【解决方案1】:

您可以尝试空间填充曲线。将坐标转换为二进制并交错。将其视为以 4 为基数的数字。你也错了,geohash 也可以用来按位置排序。最有可能使用边界框并过滤解决方案,然后使用 harvesine 公式。

【讨论】:

  • 感谢您的回答。我会看看空间填充曲线。 “你也错了,geohash 的结果也是按距离排序的”是什么意思?
  • @Jonathon:也可以使用geohash按位置排序。
  • 我知道您可以使用它按位置分组,即确定哪些地理哈希以相似的 X 字符开头。您能解释一下我如何使用它按位置订购(最好使用 MySQL)吗?
  • @Jonathon:每个X字符都是t
  • @Jonathon:Mysql 使用 r-trees。但是 X 相似的字符是因为您将二进制视为 base-4。您可以按二进制排序。
猜你喜欢
  • 2012-04-15
  • 1970-01-01
  • 2019-08-11
  • 1970-01-01
  • 1970-01-01
  • 2014-07-27
  • 2018-06-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多