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地理位置
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"