Hi,现在做的东西需要实时存储用户的经纬度,然后要求能快速得到某个指定经纬度附近的用户的列表。
我的问题是:
- 以什么形式存储经纬度比较好?
- 怎么找出数据库里距离某经纬度比较近的其它用户?
- 需要用redis之类的nosql db么?
PS: 我现在的后台用django写的,数据库用的mysql。
Hi,现在做的东西需要实时存储用户的经纬度,然后要求能快速得到某个指定经纬度附近的用户的列表。
我的问题是:
PS: 我现在的后台用django写的,数据库用的mysql。
4 回答4.4k 阅读✓ 已解决
5 回答3.2k 阅读✓ 已解决
4 回答3.8k 阅读✓ 已解决
3 回答3.6k 阅读✓ 已解决
3 回答2.1k 阅读✓ 已解决
1 回答4.4k 阅读✓ 已解决
1 回答3.8k 阅读✓ 已解决
不需要用到redis作经纬度查询,当然你做缓存除外。实际上我们在黑客马拉松就做过一个类似的项目,它的核心思想就是取出当前用户所在地点附近的用户。
我们使用的是MongoDB的Geo索引,这里有详细的介绍http://www.mongodb.org/display/DOCS/G...。
但是我注意到你使用的是mysql,虽然MongoDB能够很方便的实现这一目标,但如果你不想迁移数据库的话,也还是有方法来实现的,当然你得有思想准备,此方法可能比较曲折。我以下要说的大部分内容都来自Mysql AB介绍实现geo search的文章。
首先我们要解决的是把经纬度之差换算成距离之差,这里面涉及到一些角度转换公式,它就是
其中
d
是距离(distance),R
是地球半径。这个公式很复杂,但是我们的最终目标是把d
求出来,我们来看这个求值过程,以下是伪代码来把它转换为SQL代码,看着会有点晕,其中3956是地球半径
OK,求值代码已经出来了,来写个SQL测试下(hotels表有三个字段
hotel_name
,lat
,lon
)这样你就可以把距离当前位置
10
以内的的hotels全部搜索出来了。你可以用存储过程来优化这一代码,让它更加快速。