python - 如何为实时性应用存取经纬度?

 廖小廖童鞋 发布于 2022-11-08 11:26

Hi,现在做的东西需要实时存储用户的经纬度,然后要求能快速得到某个指定经纬度附近的用户的列表。
我的问题是:

  1. 以什么形式存储经纬度比较好?
  2. 怎么找出数据库里距离某经纬度比较近的其它用户?
  3. 需要用redis之类的nosql db么?

PS: 我现在的后台用django写的,数据库用的mysql。

5 个回答
  • 正好需要了解、关注一下

    2022-11-12 01:41 回答
  • MongoDB GEO +1

    用MYSQL的话,这个你应该用的着
    http://www.scribd.com/doc/2569355/Geo...

    2022-11-12 01:41 回答
  • mongodb geo

    2022-11-12 01:41 回答
  • mongoDB实现空间数据库该有的东西.. 原生就支持地理范围检索...无需各种用不着的东西...4sq就是用它的

    2022-11-12 01:41 回答
  • 不需要用到redis作经纬度查询,当然你做缓存除外。实际上我们在黑客马拉松就做过一个类似的项目,它的核心思想就是取出当前用户所在地点附近的用户。

    我们使用的是MongoDB的Geo索引,这里有详细的介绍http://www.mongodb.org/display/DOCS/G...。

    但是我注意到你使用的是mysql,虽然MongoDB能够很方便的实现这一目标,但如果你不想迁移数据库的话,也还是有方法来实现的,当然你得有思想准备,此方法可能比较曲折。我以下要说的大部分内容都来自Mysql AB介绍实现geo search的文章。

    首先我们要解决的是把经纬度之差换算成距离之差,这里面涉及到一些角度转换公式,它就是

    其中d是距离(distance),R是地球半径。这个公式很复杂,但是我们的最终目标是把d求出来,我们来看这个求值过程,以下是伪代码

    R = 地球半径
    Δlat = lat2 − lat1    //纬度之差
    Δlong = long2 − long1 //经度之差
    a = sin2(Δlat/2) + cos(lat1) * cos(lat2) * sin2(Δlong/2)
    c = 2*atan2(√a, √(1−a))
    d = R*c

    来把它转换为SQL代码,看着会有点晕,其中3956是地球半径

    3956 * 2 * ASIN ( SQRT (
    POWER(SIN((orig.lat - dest.lat)*pi()/180 / 2), 2) + COS(orig.lat * pi()/180) * COS(dest.lat * pi()/180) * POWER(SIN((orig.lon - dest.lon) * pi()/180 / 2), 2) ) ) as distance

    OK,求值代码已经出来了,来写个SQL测试下(hotels表有三个字段hotel_name,lat,lon)

    # 设置当前位置的经纬度
    set @orig_lat=122.4058;
    set @orig_lon=37.7907;
    
    # 设置最大搜索距离
    set @dist=10;
    
    SELECT *, 3956 * 2 * ASIN(SQRT(
    POWER(SIN((@orig_lat - abs(dest.lat)) * pi()/180 / 2), 2) + COS(@orig_lat * pi()/180 ) * COS(abs(dest.lat) * pi()/180) * POWER(SIN((@orig_lon – dest.lon) *
    pi()/180 / 2), 2) )) as distance FROM hotels dest
    having distance < @dist ORDER BY distance limit 10;

    这样你就可以把距离当前位置10以内的的hotels全部搜索出来了。你可以用存储过程来优化这一代码,让它更加快速。

    2022-11-12 01:41 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有