什么是从地理坐标计算本地用户的最有效方法?

时间:2011-05-04 23:40:32

标签: php geolocation

[编辑] - 正如我在评论中指出的那样,我应该注意到我将使用基于LAMP的架构,这意味着MySQL数据库。抱歉忘记提及此事。

我必须为iPhone应用程序创建PHP后端。该应用程序发送用户坐标并请求关闭10个本地用户。

我只是想知道确定这个的最有效方法是什么,我不想扫描整个用户表,计算他们的地理坐标和目标之间的距离。从最低到最远订购它们。

有人可以建议更优雅的解决方案而不是扫描所有用户吗?谢谢你的时间。

4 个答案:

答案 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