10. Redis数据类型--Geospatial

10.Redis数据类型–Geospatial 地理空间(geospatial)

Geospatial–Redis中文网 : http://www.redis.cn/commands/geoadd.html


GEOADD key longitude latitude member [longitude latitude member …]

时间复杂度:每一个元素添加是O(log(N)) ,N是sorted set的元素数量。
将指定的地理空间位置(纬度、经度、名称)添加到指定的key中。这些数据将会存储到sorted set这样的目的是为了方便使用
GEORADIUS
或者GEORADIUSBYMEMBER命令对数据进行半径查询等操作。

该命令以采用标准格式的参数x,y,所以经度必须在纬度之前。这些坐标的限制是可以被编入索引的,区域面积可以很接近极点但是不能索引。具体的限制,由EPSG:900913 / EPSG:3785 / OSGEO:41001 规定如下:

  • 有效的经度从-180度到180度。
  • 有效的纬度从-85.05112878度到85.05112878度。

当坐标位置超出上述指定范围时,该命令将会返回一个错误。


实例:GEOADD:添加, GEOADD key 经度 纬度 名称

27.0.0.1:6379> GEOADD shanxi 107.09 34.22 ankang
(integer) 1
127.0.0.1:6379> GEOADD shanxi 110.27 35.28 baoji
(integer) 1
127.0.0.1:6379> GEOADD shanxi 110.27 35.28 baoji
(integer) 0
127.0.0.1:6379> GEOADD shanxi 107.01 33.04 hancheng 108.57 34.17 hanzhong  110.05 34.34 huayin 109.57 33.52 shangzhou 109.07 35.06 tongchuan 109.30 34.30 weinan
(integer) 6
127.0.0.1:6379> 
127.0.0.1:6379> GEOADD shanxi 108.43 34.20 xianyang 108.29 34.18 xingping 109.28 36.35 yanan 109.47 38.18 yulin
(integer) 4
127.0.0.1:6379> 
127.0.0.1:6379> 

查询所有的元素,GEO本质是一个ZSET

127.0.0.1:6379> ZRANGE shanxi 0 -1
 1) "hancheng"
 2) "xian"
 3) "ankang"
 4) "shangzhou"
 5) "xingping"
 6) "xianyang"
 7) "hanzhong"
 8) "weinan"
 9) "huayin"
10) "tongchuan"
11) "yanan"
12) "baoji"
13) "yulin"

GEODIST key member1 member2 [unit]

时间复杂度:O(log(N))
返回两个给定位置之间的距离。
如果两个位置之间的其中一个不存在, 那么命令返回空值。
指定单位的参数 unit 必须是以下单位的其中一个:

  • m 表示单位为米。
  • km 表示单位为千米。
  • mi 表示单位为英里。
  • ft 表示单位为英尺。

如果用户没有显式地指定单位参数, 那么 GEODIST 默认使用米作为单位。

GEODIST 命令在计算距离时会假设地球为完美的球形, 在极限情况下, 这一假设最大会造成 0.5% 的误差。

返回值
bulk-string-reply, 具体的:
计算出的距离会以双精度浮点数的形式被返回。 如果给定的位置元素不存在, 那么命令返回空值。


实例:GEODIST:返回两个给定位置之间的距离。

127.0.0.1:6379> GEODIST shanxi xian ankang
"269017.5237"
127.0.0.1:6379> GEODIST shanxi xian ankang km
"269.0175"

GEOHASH key member [member …]

时间复杂度:O(log(N)) for each member requested, where N is the number of elements in the sorted set.
返回一个或多个位置元素的 Geohash 表示。
通常使用表示位置的元素使用不同的技术,使用Geohash位置52点整数编码。由于编码和解码过程中所使用的初始最小和最大坐标不同,编码的编码也不同于标准。此命令返回一个标准的Geohash,在维基百科和geohash.org网站都有相关描述

Geohash字符串属性
该命令将返回11个字符的Geohash字符串,所以没有精度Geohash,损失相比,使用内部52位表示。返回的geohashes具有以下特性:

  • 他们可以缩短从右边的字符。它将失去精度,但仍将指向同一地区。
  • 它可以在 geohash.org 网站使用,网址 http://geohash.org/。查询例子:http://geohash.org/sqdtr74hyu0.
  • 与类似的前缀字符串是附近,但相反的是不正确的,这是可能的,用不同的前缀字符串附近。

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


实例:GEOHASH:返回一个或多个位置元素的 Geohash 表示

127.0.0.1:6379> GEOHASH shanxi xian baoji ankang
1) "wmv82s49vj0"
2) "wqq2tq80vh0"
3) "wqh4svs9cy0"

GEOPOS key member [member …]

时间复杂度:O(log(N)) for each member requested, where N is the number of elements in the sorted set.
从key里返回所有给定位置元素的位置(经度和纬度)。
给定一个sorted set表示的空间索引,密集使用 geoadd 命令,它以获得指定成员的坐标往往是有益的。当空间索引填充通过 geoadd 的坐标转换成一个52位Geohash,所以返回的坐标可能不完全以添加元素的,但小的错误可能会出台。

因为 GEOPOS 命令接受可变数量的位置元素作为输入, 所以即使用户只给定了一个位置元素, 命令也会返回数组回复。

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


实例:GEOPOS:从key里返回所有给定位置元素的位置(经度和纬度)。

127.0.0.1:6379> GEOPOS shanxi xian
1) 1) "109.0099981427192688"
   2) "32.41000045467069413"
127.0.0.1:6379> GEOPOS shanxi ankang
1) 1) "107.08999782800674438"
   2) "34.21999920957377128"

GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count]

时间复杂度:O(N+log(M)) where N is the number of elements inside the bounding box of the circular area delimited by center and radius and M is the number of items inside the index.
以给定的经纬度为中心, 返回键包含的位置元素当中, 与中心的距离不超过给定最大距离的所有位置元素。
范围可以使用以下其中一个单位:

  • m 表示单位为米。
  • km 表示单位为千米。
  • mi 表示单位为英里。
  • ft 表示单位为英尺。

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

  • WITHDIST: 在返回位置元素的同时, 将位置元素与中心之间的距离也一并返回。 距离的单位和用户给定的范围单位保持一致。
  • WITHCOORD: 将位置元素的经度和维度也一并返回。
  • WITHHASH: 以 52 位有符号整数的形式, 返回位置元素经过原始 geohash 编码的有序集合分值。 这个选项主要用于底层应用或者调试, 实际中的作用并不大。

命令默认返回未排序的位置元素。 通过以下两个参数, 用户可以指定被返回位置元素的排序方式:

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

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

返回值

bulk-string-reply, 具体的:

  • 在没有给定任何 WITH 选项的情况下, 命令只会返回一个像 [“New York”,”Milan”,”Paris”] 这样的线性(linear)列表。
  • 在指定了 WITHCOORD 、 WITHDIST 、 WITHHASH 等选项的情况下, 命令返回一个二层嵌套数组, 内层的每个子数组就表示一个元素。

在返回嵌套数组时, 子数组的第一个元素总是位置元素的名字。 至于额外的信息, 则会作为子数组的后续元素, 按照以下顺序被返回:

  • 以浮点数格式返回的中心与位置元素之间的距离, 单位与用户指定范围时的单位一致。
  • geohash 整数。
  • 由两个元素组成的坐标,分别为经度和纬度。

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

127.0.0.1:6379> GEORADIUS shanxi 107 30 500 km 
1) "hancheng"
2) "xian"
3) "ankang"
4) "shangzhou"
5) "xingping"
6) "xianyang"
7) "hanzhong"
127.0.0.1:6379> GEORADIUS shanxi 107 30 200 km 
(empty list or set)
127.0.0.1:6379> GEORADIUS shanxi 107 30 300 km 
(empty list or set)
127.0.0.1:6379> GEORADIUS shanxi 107 30 400 km 
1) "hancheng"
2) "xian"
127.0.0.1:6379> GEORADIUS shanxi 107 30 400 km  withcoord
1) 1) "hancheng"
   2) 1) "107.00999826192855835"
      2) "33.04000032938207454"
2) 1) "xian"
   2) 1) "109.0099981427192688"
      2) "32.41000045467069413"
127.0.0.1:6379> GEORADIUS shanxi 107 30 400 km  withcoord withdist 
1) 1) "hancheng"
   2) "338.1293"
   3) 1) "107.00999826192855835"
      2) "33.04000032938207454"
2) 1) "xian"
   2) "329.2509"
   3) 1) "109.0099981427192688"
      2) "32.41000045467069413"
127.0.0.1:6379> GEORADIUS shanxi 107 30 500 km  withcoord withdist 
1) 1) "hancheng"
   2) "338.1293"
   3) 1) "107.00999826192855835"
      2) "33.04000032938207454"
2) 1) "xian"
   2) "329.2509"
   3) 1) "109.0099981427192688"
      2) "32.41000045467069413"
3) 1) "ankang"
   2) "469.4514"
   3) 1) "107.08999782800674438"
      2) "34.21999920957377128"
4) 1) "shangzhou"
   2) "460.7766"
   3) 1) "109.57000046968460083"
      2) "33.52000047532609273"
5) 1) "xingping"
   2) "480.5397"
   3) 1) "108.29000204801559448"
      2) "34.17999877495824279"
6) 1) "xianyang"
   2) "486.1748"
   3) 1) "108.43000262975692749"
      2) "34.20000025962658441"
7) 1) "hanzhong"
   2) "486.8179"
   3) 1) "108.56999784708023071"
      2) "34.1699992999846458"

127.0.0.1:6379> GEORADIUS shanxi 107 30 500 km  withcoord withdist count 3
1) 1) "xian"
   2) "329.2509"
   3) 1) "109.0099981427192688"
      2) "32.41000045467069413"
2) 1) "hancheng"
   2) "338.1293"
   3) 1) "107.00999826192855835"
      2) "33.04000032938207454"
3) 1) "shangzhou"
   2) "460.7766"
   3) 1) "109.57000046968460083"
      2) "33.52000047532609273"

GEORADIUSBYMEMBER key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count]

时间复杂度:O(N+log(M)) where N is the number of elements inside the bounding box of the circular area delimited by center and radius and M is the number of items inside the index.

这个命令和 GEORADIUS 命令一样, 都可以找出位于指定范围内的元素, 但是 GEORADIUSBYMEMBER 的中心点是由给定的位置元素决定的, 而不是像 GEORADIUS 那样, 使用输入的经度和纬度来决定中心点指定成员的位置被用作查询的中心。



实例:GEORADIUSBYMEMBER:这个命令和 GEORADIUS 命令一样, 都可以找出位于指定范围内的元素, 但是 GEORADIUSBYMEMBER 的中心点是由给定的位置元素决定的, 而不是像 GEORADIUS 那样, 使用输入的经度和纬度来决定中心点指定成员的位置被用作查询的中心。

127.0.0.1:6379> GEORADIUSBYMEMBER shanxi xian 200 km
1) "hancheng"
2) "xian"
3) "shangzhou"
4) "hanzhong"
127.0.0.1:6379> GEORADIUSBYMEMBER shanxi xian 200 km withcoord
1) 1) "hancheng"
   2) 1) "107.00999826192855835"
      2) "33.04000032938207454"
2) 1) "xian"
   2) 1) "109.0099981427192688"
      2) "32.41000045467069413"
3) 1) "shangzhou"
   2) 1) "109.57000046968460083"
      2) "33.52000047532609273"
4) 1) "hanzhong"
   2) 1) "108.56999784708023071"
      2) "34.1699992999846458"
127.0.0.1:6379> GEORADIUSBYMEMBER shanxi xian 200 km withcoord withdist
1) 1) "hancheng"
   2) "199.8278"
   3) 1) "107.00999826192855835"
      2) "33.04000032938207454"
2) 1) "xian"
   2) "0.0000"
   3) 1) "109.0099981427192688"
      2) "32.41000045467069413"
3) 1) "shangzhou"
   2) "134.0652"
   3) 1) "109.57000046968460083"
      2) "33.52000047532609273"
4) 1) "hanzhong"
   2) "199.9862"
   3) 1) "108.56999784708023071"
      2) "34.1699992999846458"
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值