Redis系列9:Geo 类型赋能亿级地图位置计算( 二 )


GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [ASC|DESC] [COUNT count]

  • key longitude latitude: 是前置条件,给定的经纬度信息,以及我要搜索的key
  • radius :距离半径,指的搜索的范围
  • m|km|ft|mi: 为给定的距离单位,有 米、千米、英尺、英里4种
  • [WITHCOORD] [WITHDIST] [WITHHASH]: 为返回的信息类型
    • WITHDIST: 在返回位置元素的同时,将位置元素与中心之间的距离也一并返回 。距离的单位和用户给定的范围单位保持一致 。
    • WITHCOORD: 将位置元素的经度和维度也一并返回 。
    • WITHHASH: 以 52 位有符号整数的形式 ,  返回位置元素经过原始 geohash 编码的有序集合分值 。这个选项主要用于底层应用或者调试,实际中的作用并不大 。
  • ASC|DESC :可选参数 , 按照距离升序或者降序排列,即 由近到远(asc) 还是 由远到近(desc)
  • COUNT count:取数数量 , 避免获取到太多的信息,返回太多信息
所以如果需要获取 距离本人位置10公里半径内由近到远的美食店排序 , 按km单位计算,返回值带上距离信息 , 并只取前100个的信息,代码如下:
redis> GEORADIUS food:location 115.791331 39.512000310 km WITHDISTASC COUNT 100"东北饺子馆"3.3421"兰州拉面"9.4571下图的绿色区域在固定半径(红圈)中搜索到了特定的几个目标位置:1、2、5、9、10 。
Redis系列9:Geo 类型赋能亿级地图位置计算

文章插图
3.5GEORADIUSBYMEMBER 按照位置名称获取与 GEORADIUS 的区别是 GEORADIUSBYMEMBER 的中心点是由给定的位置元素决定的,而不是像 GEORADIUS 那样 , 通过传入经度和纬度来决定中心点 。所以如下,已知兰州拉面和东北饺子馆的距离是6.1公里,根据兰州拉面获取10公里范围内的距离的美食店 , 可以获取到东北饺子馆和自己的位置:
redis> GEORADIUSBYMEMBER food:location "兰州拉面" 100 km WITHDIST"东北饺子馆"6.09127"兰州拉面"03.6 ZREM 删除关闭的店铺redis>ZREM food:location "兰州拉面"(integer) 14 总结
  • GEO 使用了 Sorted Set 集合类型,并通过 GeoHash 编码方法实现了经纬度到 Sorted Set 中元素权重分数的转换 , 涵盖两个关键能力就是就是对二维地图做区间划分,以及对区间进行编码 。
  • 具体可应用的场景如下:
    • 计算用户的精准的地理坐标位置
    • 统计用户定点坐标一定范围内的其他地理位置,并计算出距离
    • 对一定范围内的地理位置进行排序,并由近到远筛选
  • 真实的地图数据存储,场景比这复杂的多,数据量会达到惊人的巨量,所以还是会使用分治原理进行拆分,细化到一个市甚至一个区,来提高存储和检索的效率 。

推荐阅读