美文网首页geotools
Redis geo地理位置模块

Redis geo地理位置模块

作者: Carlos_ | 来源:发表于2021-05-31 09:05 被阅读0次

    业界比较通用的地理位置排序算法是GeoHash算法,Redis也使用了GeoHash算法。GeoHash算法将二维经纬度数据经过编码映射到一维的整数,这样将所有的元素挂载到一条直线上,距离很近的二维经纬度坐标映射到一维后的点之间的距离也会很近,当我们要计算"附近的人"时,首先将目标位置定位到这条线上,然后获取这条一维直线上附近的点就可以了。
    经过GeoHash算法编码之后,每个地图的元素坐标将变成一个整数,通过这个整数可以还原出初始坐标,整数越长,还原出来的坐标损失就越小,对于附近的人这种功能,损失一点精度是可以接受的。
    GeoHash算法会继续对这个整数做一次base32编码变成一个字符串。在Redis中,经纬度使用的是52位的整数进行编码放在zset里,zset的value是元素的key,score是GeoHash的52位整数值。zset的score虽然是浮点数,但是仍然可以无损储存52位的整数值。

    一、Geo的基本用法

    1. geoadd 向集合中添加元素
    image.png
    格式:geoadd [key] [经度] [纬度] [名称]
    geo并没有删除语句,但是geo本质上就是一个zset,所以可以直接使用zset的删除指令进行删除。
    
    1. geodist 计算两个元素之间的距离
    image.png
    格式:geodist [key] [名称1] [名称2] [距离单位] 距离单位可以是m、km、ml、ft。
    

    从结果来看 小米到掘金的距离要小于京东到掘金的距离

    1. geopos 获取元素的初始位置
    image.png
    格式:geopos [key] [名称]
    

    我们可以看到geopos取出来的元素初始位置和存进去的初始位置会有一定的误差,这是因为GeoHash对二维坐标转换为一维坐标是有一定损耗的,但是对于附近的人这种功能,这点损耗是完全可以接受的。

    1. geohash 获取元素的hash值
    image.png
    格式:geohash [key] [名称]
    

    上面已经提到,他是个base32的编码,可以自行利用这个编码获取定位。

    5.georadiusbymember geo最关键的指令之一,可以查询指定元素附近的其他元素

    image.png
    image.png
    格式:georadiusbymember [key] [名称1] [距离] [距离单位] [count] [数量] [排序方式]
    

    无论正序排列还是倒序排列,并不会排除本身
    另外还有三个可选参数,withcoord withdist withhash 其中withdist可以计算距离

    6.georadius 根据定位查询附近的人

    image.png
    格式:georadius [key] [经度] [纬度] [距离] [距离单位] [可选参数] [count] [数量] [排序方式]
    

    可以直接根据定位来查询附近的信息,他的参数和georadiusbymember基本相似,只是把名称换成了经纬度

    好了 今天的分享就到这里了,如果感觉对自己有帮助的话,欢迎关注我的公众号 "IT编程技术猿"
    谢谢大家啦!

    相关文章

      网友评论

        本文标题:Redis geo地理位置模块

        本文链接:https://www.haomeiwen.com/subject/hnzysltx.html