[编辑] - 正如我在评论中指出的那样,我应该注意到我将使用基于LAMP的架构,这意味着MySQL数据库。抱歉忘记提及此事。
我必须为iPhone应用程序创建PHP后端。该应用程序发送用户坐标并请求关闭10个本地用户。
我只是想知道确定这个的最有效方法是什么,我不想扫描整个用户表,计算他们的地理坐标和目标之间的距离。从最低到最远订购它们。
有人可以建议更优雅的解决方案而不是扫描所有用户吗?谢谢你的时间。
答案 0 :(得分:1)
您可以通过大致的纬度和经度(例如,整个度数,或十分之一度,或任何适合您所获得的分布的比例)对用户进行分配,然后从查询用户的存储桶向外工作。
不确定额外的复杂性是否值得,除非蛮力方法确实是一种表现难题。
答案 1 :(得分:1)
最有效的方法是使用空间索引或空间填充曲线。空间索引将2d复杂度降低到1d复杂度,因此它有助于细分表面。你想寻找Nick的空间索引quadtree hilbert曲线博客。
答案 2 :(得分:0)
有多种方法可以做到这一点。这是在sql查询中执行此操作的一种方法。
$sql = "Select id, abs($currlat - latitude) + abs($currlon - longitude) as distance from geo_loc_table order by distance asc";
这个问题是它不是太有效率。我建议使用某种形式的索引软件来为您完成工作。狮身人面像可能是个不错的选择。
答案 3 :(得分:0)
由于地球曲线,您必须进行一些计算
SELECT id, 6371 * ACos(Cos(RADIANS(users.Lat)) * Cos(RADIANS(CurrentLat)) * Cos(RADIANS(CurrentLng) - RADIANS(users.Lng)) + Sin(RADIANS(users.Lat)) * Sin(RADIANS(CurrentLat)) ) AS distance
FROM users
ORDER BY distance
LIMIT 10;
distance
在Km,如果你想要Miles,用3959替换6371