将指定的地理空间位置(纬度、经度、名称)添加到指定的key
中。这些数据将会存储到sorted set
这样的目的是为了方便使用GEORADIUS或者GEORADIUSBYMEMBER命令对数据进行半径查询等操作。
// 单条插入
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,"任英久");
}
结果
从key
里返回所有给定位置元素的位置(经度和纬度)。
给定一个sorted set表示的空间索引,密集使用 geoadd 命令,它以获得指定成员的坐标往往是有益的。当空间索引填充通过 geoadd 的坐标转换成一个52位Geohash,所以返回的坐标可能不完全以添加元素的,但小的错误可能会出台。
因为 GEOPOS
命令接受可变数量的位置元素作为输入, 所以即使用户只给定了一个位置元素, 命令也会返回数组回复。
geopos "长春" "张三"
geopos "长春" "张三" "王五"
php
// GEOPOS 从key里返回所有给定位置元素的位置(经度和纬度)。
public function pos()
{
$res = $this->redis->GEOPOS("长春" ,"王五");
dump($res);
$res = $this->redis->GEOPOS("长春" ,"张三","王五");
dump($res);
die;
}
结果
如果两个位置之间的其中一个不存在, 那么命令返回空值。
指定单位的参数 unit 必须是以下单位的其中一个:
- m 表示单位为米。
- km 表示单位为千米。
- mi 表示单位为英里。
- ft 表示单位为英尺。
如果用户没有显式地指定单位参数, 那么 GEODIST
默认使用米作为单位。
GEODIST
命令在计算距离时会假设地球为完美的球形, 在极限情况下, 这一假设最大会造成 0.5% 的误差。
geodist "长春" "张三" "王五" [unit]
php
// GEODIST 如果两个位置之间的其中一个不存在, 那么命令返回空值。
public function dist()
{
$res = $this->redis->GEODIST("长春" ,"张三","王五","m");
dump($res);
$res = $this->redis->GEODIST("长春" ,"张三","王五","km");
dump($res);
die;
}
结果
以给定的经纬度为中心, 返回键包含的位置元素当中, 与中心的距离不超过给定最大距离的所有位置元素。
范围可以使用以下其中一个单位:
- m 表示单位为米。
- km 表示单位为千米。
- mi 表示单位为英里。
- ft 表示单位为英尺。
在给定以下可选项时, 命令会返回额外的信息:
WITHDIST
: 在返回位置元素的同时, 将位置元素与中心之间的距离也一并返回。 距离的单位和用户给定的范围单位保持一致。WITHCOORD
: 将位置元素的经度和维度也一并返回。WITHHASH
: 以 52 位有符号整数的形式, 返回位置元素经过原始 geohash 编码的有序集合分值。 这个选项主要用于底层应用或者调试, 实际中的作用并不大。
命令默认返回未排序的位置元素。 通过以下两个参数, 用户可以指定被返回位置元素的排序方式:
ASC
: 根据中心的位置, 按照从近到远的方式返回位置元素。DESC
: 根据中心的位置, 按照从远到近的方式返回位置元素。
在默认情况下, GEORADIUS 命令会返回所有匹配的位置元素。 虽然用户可以使用 COUNT 选项去获取前 N 个匹配元素, 但是因为命令在内部可能会需要对所有被匹配的元素进行处理, 所以在对一个非常大的区域进行搜索时, 即使只使用
COUNT
选项去获取少量元素, 命令的执行速度也可能会非常慢。 但是从另一方面来说, 使用 COUNT
选项去减少需要返回的元素数量, 对于减少带宽来说仍然是非常有用的。
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;
}
结果
这个命令和 GEORADIUS 命令一样, 都可以找出位于指定范围内的元素, 但是 GEORADIUSBYMEMBER
的中心点是由给定的位置元素决定的, 而不是像 GEORADIUS 那样, 使用输入的经度和纬度来决定中心点
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;
}
结果
// 分页查询
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;
}
结果
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?