5.3 地理位置相关操作

5.3.1 用GEOADD命令存储地理位置

  • GEOADD

    • 语法:GEOADD key longitute latitude member [longitute latitude member ...].其中:

      • longitute:经度

      • latitude:纬度

      • member:位置名称

    • 功能:存储指定的地理空间位置,可以将一个或多个经度(longitude)、纬度(latitude)、位置名称(member)添加到指定的key中.添加成功返回1,失败则返回错误信息

例:添加地理位置:

127.0.0.1:6379> GEOADD pos 120.52 30.40 pos1
(integer) 1
127.0.0.1:6379> GEOADD pos 120.52 31.53 pos2
(integer) 1
127.0.0.1:6379> GEOADD pos 120.12 30.40 pos3
(integer) 1
127.0.0.1:6379> GEOADD pos 120.12 31.53 pos4
(integer) 1

可以看到,4个地理位置的键均为pos,但是这4个地理位置的别名不同.

例:添加地理位置失败:

127.0.0.1:6379> GEOADD errPos 1221.12 311.53 errPos
(error) ERR invalid longitude,latitude pair 1221.120000,311.530000

在Redis的GEO数据结构中,经纬度的上下限是基于WGS-84地理坐标系统的.具体限制如下:

  • Longitude(经度):-180°到180°

  • Latitude(纬度):-85.05112878°到85.05112878°

纬度的上下限并不是完全的-90°到90°,是因为这样可以确保地球的形状在某些投影下仍然为正方形.这个特定的纬度约为±85.0511°是Web墨卡托投影的一个特点,这种投影经常被用于地图服务,例如Google Maps.

5.3.2 获取地理位置的经纬度信息

  • GEOPOS

    • 语法:GEOPOS key member [member ...]

    • 功能:从给定的key里返回所有指定名称(member)的位置(经度和纬度),不存在的返回nil

例:查询地理位置数据

127.0.0.1:6379> GEOPOS pos pos1
1) 1) "120.52000075578689575"
   2) "30.39999952668997452"
127.0.0.1:6379> GEOPOS pos pos4
1) 1) "120.11999756097793579"
   2) "31.53000103201371473"
127.0.0.1:6379> GEOPOS pos notExist
1) (nil)
127.0.0.1:6379> GEOPOS notExist notExist
1) (nil)

5.3.3 查询指定范围内的地理信息

  • GEORADIUS

    • 语法:GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key].其中:

      • longitude/latitude:指定待查询地理信息的中心点

      • radius:半径.

        • m:米

        • km:千米

        • ft:英尺

        • mi:英里

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

      • WITHDIST:在返回位置元素的同时,将位置元素与中心点之间的距离也一并返回

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

      • ASC/DESC:查找结果根据距离从近到远/从远到近排序

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

例:查询pos中距给定中心点距离不超过200km的位置元素的经纬度信息和距给定中心点的距离,按位置元素距中心点从远到近排序

127.0.0.1:6379> GEORADIUS pos 120.52 30.40 200 km WITHCOORD WITHDIST DESC
1) 1) "pos4"
   2) "131.3478"
   3) 1) "120.11999756097793579"
      2) "31.53000103201371473"
2) 1) "pos2"
   2) "125.6858"
   3) 1) "120.52000075578689575"
      2) "31.53000103201371473"
3) 1) "pos3"
   2) "38.3739"
   3) 1) "120.11999756097793579"
      2) "30.39999952668997452"
4) 1) "pos1"
   2) "0.0001"
   3) 1) "120.52000075578689575"
      2) "30.39999952668997452"
  • GEORADIUSBYMEMBER

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

    • 功能:和GEORADIUS命令一样,都可以找出位于指定范围内的元素.但是GEORADIUSBYMEMBER命令的中心点是由给定的位置元素决定的,而不是使用经度和纬度来决定中心点

例:查询pos中距离位置元素pos1距离不超过200km的位置元素的经纬度信息和距给定中心点的距离,按位置元素距中心点从远到近排序

127.0.0.1:6379> GEORADIUSBYMEMBER pos pos1 200 km WITHCOORD WITHDIST DESC
1) 1) "pos4"
   2) "131.3479"
   3) 1) "120.11999756097793579"
      2) "31.53000103201371473"
2) 1) "pos2"
   2) "125.6859"
   3) 1) "120.52000075578689575"
      2) "31.53000103201371473"
3) 1) "pos3"
   2) "38.3740"
   3) 1) "120.11999756097793579"
      2) "30.39999952668997452"
4) 1) "pos1"
   2) "0.0000"
   3) 1) "120.52000075578689575"
      2) "30.39999952668997452"

5.3.4 查询地理位置间的距离

  • GEODIST

    • 语法:GEODIST key member1 member2 [m|km|ft|mi]

    • 返回两个给定位置之间的距离.距离单位默认为米.若待计算的地理位置不存在,则返回nil

例:计算位置元素pos1到pos2之间间隔的千米数:

127.0.0.1:6379> GEODIST pos pos1 pos2 km
"125.6859"

例:待计算的地理位置不存在的情况

127.0.0.1:6379> GEODIST pos pos1 notExist
(nil)

Last updated