使用 Redis GeoHash 实现附近的XXX

文章目录

    功能概述

    用户A打开手机,可以看到附件的商铺,或者附件的人。甚至告诉用户,你正在某个商铺中。

    geohash 的疑问

    geohash 能否实现直接告诉用户正在某个商铺中?

    geohash 代表了一个块状区域,而不是一个点,但是商铺一定是个正方形区域么?

    数据库选型

    目前暂定 redis。Redis 于 3.2.0 版本加入了 geohash 的支持,而目前的稳定版是 3.2.3.

    Redis geohash

    如何找到关于 redis geohash 的资料?当然是 redis 官网。

    GEOADD key 看这个文档基本就明白了。但是,那个示例想看懂的话,还是需要查一下意大利地理

    redis> GEOADD Sicily 13.361389 38.115556 "Palermo" 15.087269 37.502669 "Catania"
    (integer) 2
    redis> GEODIST Sicily Palermo Catania
    "166274.15156960039"
    redis> GEORADIUS Sicily 15 37 100 km
    1) "Catania"
    redis> GEORADIUS Sicily 15 37 200 km
    1) "Palermo"
    2) "Catania"
    redis> 
    

    这里 sicily 类似山东省,而 Palermo, Catania 类似烟台、威海,即 Palermo、Catania 是 sicily 辖区内的城市。

    Data is stored into the key as a sorted set, in a way that makes it possible to later retrieve items using a query by radius with theGEORADIUS or GEORADIUSBYMEMBER commands.

    注意,添加时,经度在前,维度在后。

    GEORADIUSBYMEMBER yeda "富士康" 1 km
    

    小心,前方有坑! 返回的结果默认是无序的,即不会按照距离远近进行排序。需要手动加上 ASC, DESC 进行排序。

    GEORADIUSBYMEMBER yeda "富士康" 10 km WITHDIST ASC
    

    如何在 Laravel 中使用

    composer require predis/predis
    
    $items = Redis::georadius("yeda", $lng, $lat, 20, "km", "WITHDIST", "ASC");
    

    微信获取地理位置信息接口的坑

    在 weixin js sdk config 信息未验证之前,如果调用微信 js sdk 实际上不会正确执行。需要使用

    wx.ready(function() {
        // ...
    });
    

    专业术语

    • latitude 纬度
    • longitude 经度

    MySQL 的实现方案

    MySQL 通过经纬度查询附近的目标

    参考

    关于作者 🌱

    我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊,或者关注我的个人公众号“大象工具”, 查看更多联系方式