GEO功能在Redis3.2版本提供,支持存储地理位置信息用来实现诸如附近位置、摇一摇这类依赖于地理位置信息的功能.geo的数据类型为zset.
基本操作命令为以下几个:
geoadd
geopos
geodist
georadius
georadiusbymember
geohash
zrem
一。geoadd
1.语法
geoadd key longitude latitude member [longitude latitude member...]
2.解析
将给定的空间元素(纬度、经度、名字)添加到指定的键里面。这些数据会以有序集he的形式被储存在键里面,从而使得georadius和georadiusbymember这样的命令可以在之后通过位置查询取得这些元素。
geoadd命令以标准的x,y格式接受参数,所以用户必须先输入经度,然后再输入纬度。
geoadd能够记录的坐标是有限的:非常接近两极的区域无法被索引的精确的坐标限制由EPSG:900913 / EPSG:3785 / OSGEO:41001 等坐标系统定义, 具体如下
有效的经度介于-180-180度之间
有效的纬度介于-85.05112878 度至 85.05112878 度之间。
当用户尝试输入一个超出范围的经度或者纬度时,geoadd命令将返回一个错误。
3.返回值
新添加到键里面的空间元素数量,不包括那些已经存在但是被更新的元素。
4.例子
geoadd city 117.12 39.08 tianjin 114.29 38.02 shijiazhuang 118.01 39.38 tangshan 115.29 38.51 baoding
geopos city tianjin shijiazhuang
输出结果,geoadd可以设置一个值,也可以多个同上设置

这里注意,经纬度之间使用空格,而且是先设置经纬度,再设置对应列,和以前的的方式有点不同。中间用空格隔开。
二。geopos
1.语法
geopos key member [member...]
2.解析
从键里面返回所有给定位置元素的位置(经度和纬度)
因为geopos命令接受可变数量的位置元素作为输入,所以即使用户只给定了一个位置元素,命令也会返回数组的回复。
3.返回值
geopos命令返回一个数组,数组中的每个项都由两个元素组成:第一个元素为给定位置元素的经度,而第二个元素则为给定位置元素的纬度。当给定的位置元素不存在时,对应的数组项为空值.
4.例子
geoadd city 116.28 39.55 beijing
geopos city beijing

三。geodist
1.语法
geodist key member1 member2 [unit]
2.解析
如果两个位置之间的其中一个不存在,那么命令返回空值。
指定单位的参数unit必须是以下单位的其中一个:
m表示单位为米
km表示单位为千米
mi表示单位为英里
ft表示单位为英尺
如果用户没有显式地指定单位参数,那么geodist默认使用米作为单位。
geodist命令在计算距离时会假设地球为完美的球形,在极限情况下,这一假设最大会造成0.5%的误差。
3.返回值
计算出的距离会以双精度浮点数的形式被返回。如果给定的位置元素不存在,那么命令返回空值。
4.例子
geoadd city 117.12 39.08 tianjin 114.29 38.02 shijiazhuang 118.01 39.38
geodist city tianjin shijiazhuang
geodist city tianjin shijiazhuang km
如果不存在返回nil
geodist city beijing zhengzhou

四。georadius
1.语法
georadius key longitude latitude radius m|km|ft|mi [withcoord][withdist][withhash][asc|desc][count count] [store key] [storedist key]
2.解析
以给定的经纬度为中心,返回键包含的位置元素当中,与中心的距离不超过给定最大距离的所有位置元素。
范围可以使用以下其中一个单位:
m 表示单位为米。
km 表示单位为千米。
mi 表示单位为英里。
ft 表示单位为英尺。
在给定以下选项时,命令会返回额外的信息:
withdist:在返回位置元素的同时,将位置元素与中心之间的距离也一并返回.距离的单位和用户给定的范围单位保持一致。
withcoord:将位置元素的经度和纬度也一并返回。
withhash:以52位有符号整数的形式,返回位置元素经过原始geohash编码的有序集合分值。这个选项主要用于底层应用或者调试,实际中的作用不大。
命令默认返回未排序的位置元素。通过以下两个参数,用户可以指定被返回位置元素的排序方式:
asc:根据中心的位置,按照从近到远的方式返回位置元素
desc:根据中心的位置,按照从远到近的方式返回位置元素。
[store key] 将返回结果的地理位置信息保存到指定键
[storedist key] 将返回结果距离中心节点的距离保存到指定键
在默认情况下,georadius命令会返回所有匹配的位置元素.虽然用户可以使用count选项去获取N个匹配元素,但是因为命令在内部
可能会需要对所有被匹配的元素进行处理,所以在对一个非常大的区域进行搜索时,即使只使用count选项去获取少量元素,
命令的执行速度也可能非常慢。但从另一方面说,使用count选项去减少需要返回的元素数量,对于减少带宽来说仍然是非常有用的。
3.返回值:
georadius命令返回一个数组,具体来说:
在没有给定任何with选项的情况下,命令只会返回一个像["Beijing","Tianjin"]这样的线性列表
在指定了withcoord、withdist、withhash等选项的情况下,命令返回一个二层嵌套数组,内层的每个子数组就表示一个元素。
在返回嵌套数组时,子数组的第一个元素总是位置元素的名字.至于额外的信息,则会作为子数组的后续元素,按照以下顺序被返回:
(1).以浮点数格式返回的中心位置元素之间的距离,单位与用户指定范围时的单位一致。
(2).geohash整数
(3).由两个元素组成的坐标,分别为经度和纬度。
4.例子:
geoadd city 117.12 39.08 tianjin 114.29 38.02 shijiazhuang 118.01 39.38 tangshan 115.29 38.51 baoding
withdist 返回位置名称和中心距离
georadius city 117 39 200 km withdist

withcoord 返回位置名称和经纬度
georadius city 117 39 200 km withcoord

withdist withcoord 返回位置名称 距离 和经纬度
georadius city 117 39 200 km withdist withcoord

五。georadiusbymember
1.语法
georadiusbymember key member radius m|km|ft|mi [withcoord][withdist][withhash][asc|desc][count count] [store key] [storedist key]
2.解析
这个命令和georadius命令一样,都可以找出位于指定范围内的元素,但是georadiusbymember的中心点是由给定的位置元素决定的,
而不是像georadius那样,使用输入的经度和纬度来决定中心点。
3.返回值
一个数组,数组中的每个项表示一个范围之内的位置元素。
4.例子
geoadd city 117.12 39.08 tianjin 114.29 38.02 shijiazhuang 118.01 39.38 tangshan 115.29 38.51 baoding
georadiusbymember city tianjin 100 km
六。geohash
1.语法
geohash key member [member...]
2.解析
Redis使用geohash将二维经纬度转换为一维字符串,字符串越长表示位置更精确,两个字符串越相似表示距离越近。
3.返回值:
一个数组,数组的每个项都是一个geohash。命令返回的geohash的位置与用户给定的位置元素的位置一一对应。
4.例子
geoadd city 118.01 39.38 tangshan 115.29 38.51 baoding
geohash city tangshan baoding
七。zrem
GEO没有提供删除成员的命令,但是因为GEO的底层实现是zset,所以可以借用zrem命令实现对地理位置信息的删除.
zrem city tianjin
网友评论