您当前的位置: 首页 >  redis

苗先生的PHP记录

暂无认证

  • 0浏览

    0关注

    190博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

使用redis geo计算范围内的数据

苗先生的PHP记录 发布时间:2022-08-11 13:28:29 ,浏览量:0

ADD

将指定的地理空间位置(纬度、经度、名称)添加到指定的key中。这些数据将会存储到sorted set这样的目的是为了方便使用GEORADIUS或者GEORADIUSBYMEMBER命令对数据进行半径查询等操作。

cli
// 单条插入
 GEOADD "长春" 125.419354 43.896298 "张三" 
// 多条插入
GEOADD "长春" 125.419354 43.896298 "张三"  125.383925 43.913029 "李四"
php
// 添加给geo数据
    public function add()
    {
        $this->redis->geoadd("长春" ,125.419354,43.896298,"张三");
        $this->redis->geoadd("长春" ,125.383925,43.913029,"李四");
        $this->redis->geoadd("长春" ,125.347202,43.912562,"王五");
        $this->redis->geoadd("长春" ,125.337895,43.920718,"老刘");
        $this->redis->geoadd("长春" ,125.337895,43.920718,"社会王");
        $this->redis->geoadd("长春" ,125.363371,43.883616,"老二");
        $this->redis->geoadd("长春" ,125.366749,43.834371,"老赵");
        $this->redis->geoadd("长春" ,125.252341,43.795029,"任英久");
    }
结果

GEOPOS

key里返回所有给定位置元素的位置(经度和纬度)。

给定一个sorted set表示的空间索引,密集使用 geoadd 命令,它以获得指定成员的坐标往往是有益的。当空间索引填充通过 geoadd 的坐标转换成一个52位Geohash,所以返回的坐标可能不完全以添加元素的,但小的错误可能会出台。

因为 GEOPOS 命令接受可变数量的位置元素作为输入, 所以即使用户只给定了一个位置元素, 命令也会返回数组回复。

cli
geopos "长春" "张三"

geopos "长春" "张三" "王五"
php
// GEOPOS 从key里返回所有给定位置元素的位置(经度和纬度)。
    public function pos()
    {
        $res = $this->redis->GEOPOS("长春" ,"王五");
        dump($res);
        $res = $this->redis->GEOPOS("长春" ,"张三","王五");
        dump($res);
        die;
    }
结果

GEODIST

如果两个位置之间的其中一个不存在, 那么命令返回空值。

指定单位的参数 unit 必须是以下单位的其中一个:

  • m 表示单位为米。
  • km 表示单位为千米。
  • mi 表示单位为英里。
  • ft 表示单位为英尺。

如果用户没有显式地指定单位参数, 那么 GEODIST 默认使用米作为单位。

GEODIST 命令在计算距离时会假设地球为完美的球形, 在极限情况下, 这一假设最大会造成 0.5% 的误差。

cli
geodist "长春" "张三" "王五" [unit]
php
// GEODIST 如果两个位置之间的其中一个不存在, 那么命令返回空值。
    public function dist()
    {
        $res = $this->redis->GEODIST("长春" ,"张三","王五","m");
        dump($res);
        $res = $this->redis->GEODIST("长春" ,"张三","王五","km");
        dump($res);
        die;
    }
结果

GEORADIUS

以给定的经纬度为中心, 返回键包含的位置元素当中, 与中心的距离不超过给定最大距离的所有位置元素。

范围可以使用以下其中一个单位:

  • m 表示单位为米。
  • km 表示单位为千米。
  • mi 表示单位为英里。
  • ft 表示单位为英尺。

在给定以下可选项时, 命令会返回额外的信息:

  • WITHDIST: 在返回位置元素的同时, 将位置元素与中心之间的距离也一并返回。 距离的单位和用户给定的范围单位保持一致。
  • WITHCOORD: 将位置元素的经度和维度也一并返回。
  • WITHHASH: 以 52 位有符号整数的形式, 返回位置元素经过原始 geohash 编码的有序集合分值。 这个选项主要用于底层应用或者调试, 实际中的作用并不大。

命令默认返回未排序的位置元素。 通过以下两个参数, 用户可以指定被返回位置元素的排序方式:

  • ASC: 根据中心的位置, 按照从近到远的方式返回位置元素。
  • DESC: 根据中心的位置, 按照从远到近的方式返回位置元素。

在默认情况下, GEORADIUS 命令会返回所有匹配的位置元素。 虽然用户可以使用 COUNT  选项去获取前 N 个匹配元素, 但是因为命令在内部可能会需要对所有被匹配的元素进行处理, 所以在对一个非常大的区域进行搜索时, 即使只使用 COUNT 选项去获取少量元素, 命令的执行速度也可能会非常慢。 但是从另一方面来说, 使用 COUNT 选项去减少需要返回的元素数量, 对于减少带宽来说仍然是非常有用的。

cli
geodist "长春" "张三" "王五" [unit]
php
//geoRadius 以给定的经纬度为中心, 找出某一半径内的元素
    public function radius()
    {
        $options = ['WITHDIST','ASC' ,"count"=>5]; //显示距离 ,最近的开始 , 查询5条
        $res = $this->redis->geoRadius('长春',125.418491,43.885955 ,5,"km", $options);
        dump($res);

        $res = $this->redis->geoRadius('长春',125.418491,43.885955 ,10,"km", $options);
        dump($res);
        die;
    }
结果

 

GEORADIUSBYMEMBER

这个命令和 GEORADIUS 命令一样, 都可以找出位于指定范围内的元素, 但是 GEORADIUSBYMEMBER 的中心点是由给定的位置元素决定的, 而不是像 GEORADIUS 那样, 使用输入的经度和纬度来决定中心点

cli
georadiusbymember key member ? [m/km/ft/mi] [withscoord] [withdist] [withhash] [COUNT count] [ASC/DESC]
php
//GEORADIUSBYMEMBER 以给定的经纬度为中心, 找出某一半径内的元素
    public function radiusbymembers()
    {

        $res = $this->redis->GEORADIUSBYMEMBER('长春',"王五" ,5,"km",);
        dump($res);
        $options = ['WITHDIST','ASC' ,"count"=>3];
        $res = $this->redis->GEORADIUSBYMEMBER('长春',"王五" ,5,"km", $options);
        dump($res);
        die;
    }
结果

GEORADIUSBYMEMBER / GEORADIUS分页查询

php
// 分页查询
    public function radiusByPage()
    {
        $options = ['ASC' ,"storedist"=>'a']; // 这里不能WITHDIST , 通过storedist 把结果集写入a 的zset里,score为距离
        $res = $this->redis->geoRadius('长春',125.418491,43.885955 ,10,"km",$options);
        dump($res);
        die;
    }
结果

 

 

demo代码
            
关注
打赏
1665468453
查看更多评论
1.0382s