位置/接近搜索大型记录集

时间:2015-01-26 14:48:23

标签: php mysql geolocation geohashing

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

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

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

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

方法1

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

方法2

我还做了一些关于geohashing的研究,我理解哈希是如何计算的,我得到了它如何表示位置以及如何用更短的分辨率丢失精度的理论。我当然可以抓住位于用户地理区域附近的用户,抓住具有与geohash相似的开头的用户(基于我指定的精度 - 并且可能在相邻区域中查找)但是这不能解决问题需要按位置排序。这种方法对于边缘情况也不是很好,在这种边缘情况下,2个用户可能彼此非常靠近但是靠近由geohash表示的2个区域的边缘。

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

谢谢, 乔纳森

修改

方法3

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

1 个答案:

答案 0 :(得分:0)

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