Redis教程(八) GEO地理位置



Redis教程(八) GEO地理位置


1 GEO地理位置

Redis的键值可以支持数据类型:字符串,列表,散表,集合,有序集合、HyperLogLog,通过选用不同的数据结构,用户可以使用Redis解决各式各样的问题。


1.1 GEO地理位置

      Redis的GEO特性将在 Redis 3.2 版本出这个功能可以将用户给定的地理位置信息储存起来,并对这些信息进行操作。


1、GEOADD命令:将给定的空间元素(纬度、经度、名字)添加到指定的键里面。这些数据会以有序集合的形式被储存在键里面,从而使得像 GEORADIUS和 GEORADIUSBYMEMBER这样的命令可以在之后通过位置查询取得这些元素。GEOADD命令以标准的 x,y格式接受参数,所以用户必须先输入经度,然后再输入纬度。

GEOADD能够记录的坐标是有限的:非常接近两极的区域是无法被索引的。精确的坐标限制由 EPSG:900913 / EPSG:3785 / OSGEO:41001等坐标系统定义,具体如下:

*有效的经度介于 -180度至 180度之间。

*有效的纬度介于 -85.05112878度至 85.05112878度之间。

当用户尝试输入一个超出范围的经度或者纬度时, GEOADD 命令将返回一个错误。

      GEOADD map 116.1920929 39.98448618 "BeiJing"

      GEOADD map 121.47583008 31.23159167 "ShangHai" 120.13549805 30.29701788 "HangZhou"

      GEOADD map 114.08203125 22.55314748 "ShenZhen" 112.97241211 28.2076086 "ChangSha"


 

2、GEOPOS命令:从键里面返回所有给定位置元素的位置(经度和纬度)。因为 GEOPOS 命令接受可变数量的位置元素作为输入,所以即使用户只给定了一个位置元素,命令也会返回数组回复。

返回值:GEOPOS命令返回一个数组,数组中的每个项都由两个元素组成:第一个元素为给定位置元素的经度,而第二个元素则为给定位置元素的纬度。当给定的位置元素不存在时,对应的数组项为空值。

GEOPOS map "BeiJing" "ShangHai" "NonExisting" "ShenZhen"


 

3、GEODIST命令:返回两个给定位置之间的距离。如果两个位置之间的其中一个不存在,那么命令返回空值。如果用户没有显式地指定单位参数,那么 GEODIST默认使用米作为单位。GEODIST命令在计算距离时会假设地球为完美的球形,在极限情况下,这一假设最大会造成 0.5%的误差。

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

* m表示单位为米。

* km表示单位为千米。

* mi表示单位为英里。

* ft表示单位为英尺。

 GEODIST map "BeiJing" "ShangHai"

 GEODIST map "BeiJing" "ShangHai" km

 GEODIST map "BeiJing" "ShangHai" mi

 GEODIST map "BeiJing" "ShangHai" ft

 GEODIST map "BeiJing" "NonExisting"


 

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

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

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

* m表示单位为米。

* km表示单位为千米。

* mi表示单位为英里。

* ft表示单位为英尺。

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

   WITHDIST:在返回位置元素的同时,将位置元素与中心之间的距离也一并返回。距离的单位和用户给定的范围单位保持一致。

   WITHCOORD:将位置元素的经度和维度也一并返回。

   WITHHASH:以 52 位有符号整数的形式,返回位置元素经过原始 geohash编码的有序集合分值。这个选项主要用于底层应用或者调试,实际中的作用并不大。

 

命令默认返回未排序的位置元素:

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

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

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

GEORADIUSmap 116.1920929 39.98448618 1100 km WITHDIST

GEORADIUSmap 116.1920929 39.98448618 1100 km WITHDIST WITHCOORD

GEORADIUSmap 116.1920929 39.98448618 1100 km WITHDIST WITHCOORD DESC

GEORADIUSmap 116.1920929 39.98448618 1100 km WITHDIST WITHCOORD DESC COUNT 1


 

5、GEORADIUSBYMEMBER命令:这个命令和GEORADIUS命令一样,都可以找出位于指定范围内的元素,但是GEORADIUSBYMEMBER的中心点是由给定的位置元素决定的,而不是像 GEORADIUS那样,使用输入的经度和纬度来决定中心点。返回值:一个数组,数组中的每个项表示一个范围之内的位置元素。

语法:GEORADIUSBYMEMBER key member radius m|km|ft|mi [WITHCOORD][WITHDIST] [WITHHASH] [ASC|DESC] [COUNT count]

 

GEORADIUSBYMEMBER map "HangZhou" 1000 km

GEORADIUSBYMEMBER map "HangZhou" 1000 km WITHDIST WITHCOORDASC


 

6、GEOHASH命令:返回一个或多个位置元素的Geohash表示。Geohash是什么?Geohash的初衷是如何用尽量短的URL来标志地图上的某个位置,而地图上的位置一般是用经纬度来表示,问题就转化为如何把经纬度转化为一个尽量短的URL。Geohash的算法描述请参考:http://en.wikipedia.org/wiki/Geohash

返回值:一个数组,数组的每个项都是一个 geohash。命令返回的geohash的位置与用户给定的位置元素的位置一一对应。

语法:GEOHASH key member [member ...]

 

GEOHASH map "BeiJing" "ShangHai" "HangZhou" "ShenZhen"

Redis教程() GEO地理位置


GEO地理位置

Redis的键值可以支持数据类型:字符串,列表,散表,集合,有序集合、HyperLogLog,通过选用不同的数据结构,用户可以使用Redis解决各式各样的问题。


1.1 GEO地理位置

      RedisGEO特性将在 Redis 3.2 版本出这个功能可以将用户给定的地理位置信息储存起来,并对这些信息进行操作。


1、GEOADD命令:将给定的空间元素(纬度、经度、名字)添加到指定的键里面。这些数据会以有序集合的形式被储存在键里面,从而使得像 GEORADIUS GEORADIUSBYMEMBER这样的命令可以在之后通过位置查询取得这些元素。GEOADD命令以标准的 x,y格式接受参数,所以用户必须先输入经度,然后再输入纬度。

GEOADD能够记录的坐标是有限的:非常接近两极的区域是无法被索引的。精确的坐标限制由 EPSG:900913 / EPSG:3785 / OSGEO:41001等坐标系统定义,具体如下:

*有效的经度介于 -180度至 180度之间。

*有效的纬度介于 -85.05112878度至 85.05112878度之间。

当用户尝试输入一个超出范围的经度或者纬度时, GEOADD 命令将返回一个错误。

      GEOADD map 116.1920929 39.98448618 "BeiJing"

      GEOADD map 121.47583008 31.23159167 "ShangHai" 120.13549805 30.29701788 "HangZhou"

      GEOADD map 114.08203125 22.55314748 "ShenZhen" 112.97241211 28.2076086 "ChangSha"


 

2、GEOPOS命令:从键里面返回所有给定位置元素的位置(经度和纬度)。因为 GEOPOS 命令接受可变数量的位置元素作为输入,所以即使用户只给定了一个位置元素,命令也会返回数组回复。

返回值:GEOPOS命令返回一个数组,数组中的每个项都由两个元素组成:第一个元素为给定位置元素的经度,而第二个元素则为给定位置元素的纬度。当给定的位置元素不存在时,对应的数组项为空值。

GEOPOS map "BeiJing" "ShangHai" "NonExisting" "ShenZhen"


 

3、GEODIST命令:返回两个给定位置之间的距离。如果两个位置之间的其中一个不存在,那么命令返回空值。如果用户没有显式地指定单位参数,那么 GEODIST默认使用米作为单位。GEODIST命令在计算距离时会假设地球为完美的球形,在极限情况下,这一假设最大会造成 0.5%的误差。

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

* m表示单位为米。

* km表示单位为千米。

* mi表示单位为英里。

* ft表示单位为英尺。

 GEODIST map "BeiJing" "ShangHai"

 GEODIST map "BeiJing" "ShangHai" km

 GEODIST map "BeiJing" "ShangHai" mi

 GEODIST map "BeiJing" "ShangHai" ft

 GEODIST map "BeiJing" "NonExisting"


 

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

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

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

* m表示单位为米。

* km表示单位为千米。

* mi表示单位为英里。

* ft表示单位为英尺。

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

   WITHDIST在返回位置元素的同时,将位置元素与中心之间的距离也一并返回。距离的单位和用户给定的范围单位保持一致。

   WITHCOORD将位置元素的经度和维度也一并返回。

   WITHHASH 52 位有符号整数的形式,返回位置元素经过原始 geohash编码的有序集合分值。这个选项主要用于底层应用或者调试,实际中的作用并不大。

 

命令默认返回未排序的位置元素:

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

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

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

GEORADIUSmap 116.1920929 39.98448618 1100 km WITHDIST

GEORADIUSmap 116.1920929 39.98448618 1100 km WITHDIST WITHCOORD

GEORADIUSmap 116.1920929 39.98448618 1100 km WITHDIST WITHCOORD DESC

GEORADIUSmap 116.1920929 39.98448618 1100 km WITHDIST WITHCOORD DESC COUNT 1


 

5、GEORADIUSBYMEMBER命令:这个命令和GEORADIUS命令一样,都可以找出位于指定范围内的元素,但是GEORADIUSBYMEMBER的中心点是由给定的位置元素决定的,而不是像 GEORADIUS那样,使用输入的经度和纬度来决定中心点。返回值:一个数组,数组中的每个项表示一个范围之内的位置元素。

语法:GEORADIUSBYMEMBER key member radius m|km|ft|mi [WITHCOORD][WITHDIST] [WITHHASH] [ASC|DESC] [COUNT count]

 

GEORADIUSBYMEMBER map "HangZhou" 1000 km

GEORADIUSBYMEMBER map "HangZhou" 1000 km WITHDIST WITHCOORDASC


 

6、GEOHASH命令:返回一个或多个位置元素的Geohash表示。Geohash是什么?Geohash的初衷是如何用尽量短的URL来标志地图上的某个位置,而地图上的位置一般是用经纬度来表示,问题就转化为如何把经纬度转化为一个尽量短的URLGeohash算法描述请参考:http://en.wikipedia.org/wiki/Geohash

返回值:一个数组,数组的每个项都是一个 geohash命令返回的geohash的位置与用户给定的位置元素的位置一一对应。

语法:GEOHASH key member [member ...]

 

GEOHASH map "BeiJing" "ShangHai" "HangZhou" "ShenZhen"

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值