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”
——厚积薄发(yuanxw)
</div>
转载链接 : https://blog.csdn.net/yuan_xw/article/details/52385938