我应该探索哪些算法来实现一个功能,让用户找到位于他附近的其他用户,所有用户的纬度和经度都是事先知道的并且是固定的[非动态]。 此外,我相信应该有一个更好的方法来存储这样的数据,然后简单地存储lat,用户长在数据库中的用户ID。处理这个的有效方法是什么?
答案 0 :(得分:2)
如果你只是找到近点,你需要的只是一个简单的圆形边界半径,你可以调整或偏向中心对数。当然,您希望避免在每个查询的整个数据集上执行此操作。一般来说,除了纬度/经度之外,您还可以将地图分解为您知道可以忽略的象限。 - 只需确定您感兴趣的区域是否边缘,也可以查询邻近象限。这是一个链接表,仅用于获取该象限中的行。
一旦你减少了象限。使用最基本的几何:
1)使用简单的边界框消除大部分数据。
伪代码:
DistanceLat = abs( P2lat - P1lat);
DistanceLon = abs( P2lon - P1lat)
2)做毕达哥拉斯定理,看看点是否随着半径而下降。在简化数据集(a2 + b2 = c2)
内Distance = Sqrt( DistanceLat * DistanceLat + DisanceLon * DistanceLon)
if ( Distance < radius) keep the data
答案 1 :(得分:1)
MySQL (和其他人)现在支持spatial indexing.
如果您的数据库可以spatial queries,您不需要自己实现算法的任何部分。
答案 2 :(得分:1)
对nearest neighbor search使用k-D树。
答案 3 :(得分:1)