GEORADIUS:查找指定坐标半径范围内的其他位置
通过使用 GEORADIUS 命令,用户可以指定一个经纬度作为中心点,并从位置集合中找出位于中心点指定半径范围内的其他位置:
GEORADIUS location_set longitude latitude radius unit
bash
各个命令参数的意义分别如下:
-
location_set 参数用于指定执行查找操作的位置集合。
-
longitude 参数和 latitude 参数分别用于指定中心点的经度和纬度。
-
radius 参数用于指定查找半径。
-
unit 参数用于指定查找半径的单位,与 GEODIST 命令中的 unit 参数一样,这个参数的值可以是 m(米)、km(千米)、mi(英里)或者 ft(英尺)中的任意一个。
作为例子,以下代码展示了如何实现以经度为 112.3351942、纬度为 23.0586893 的肇庆市作为中心点,查找位于其半径 50km、100km、150km 以及 200km 内的所有城市,其中各个城市的位置可以在图 9-2 中看到:
-- 向位置集合中添加清远、广州、佛山、东莞、深圳、中山这6座城市的坐标
redis> GEOADD Guangdong-cities 113.2099647 23.593675 Qingyuan 113.2278442 23.1255978
Guangzhou 113.106308 23.0088312 Foshan 113.7943267 22.9761989 Dongguan 114.0538788 22.5551603
Shenzhen 113.4060288 22.5111574 Zhongshan
redis> GEORADIUS Guangdong-cities 112.3351942 23.0586893 50 km
(empty list or set) -- 距离肇庆市50km范围内,没有其他城市
redis> GEORADIUS Guangdong-cities 112.3351942 23.0586893 100 km
1) "Foshan" -- 佛山和广州都位于距肇庆100km范围之内
2) "Guangzhou"
redis> GEORADIUS Guangdong-cities 112.3351942 23.0586893 150 km
1) "Foshan" -- 佛山、广州、东莞等5座城市都位于距肇庆150km之内
2) "Guangzhou"
3) "Dongguan"
4) "Qingyuan"
5) "Zhongshan"
redis> GEORADIUS Guangdong-cities 112.3351942 23.0586893 200 km
1) "Zhongshan" -- 上面添加的6座城市全部位于距肇庆200km之内
2) "Shenzhen"
3) "Foshan"
4) "Guangzhou"
5) "Dongguan"
6) "Qingyuan"
bash
返回被匹配位置与中心点之间的距离
GEORADIUS 命令具有可选的 WITHDIST 选项,如果用户在执行 GEORADIUS 命令时给定了这个选项,那么 GEORADIUS 命令不仅会返回位于指定半径范围内的位置,还会返回这些位置与中心点之间的距离:
GEORADIUS location_set longitude latitude radius unit [WITHDIST]
bash

GEORADIUS 命令在返回距离时所使用的单位与进行范围查找时所使用的单位一致:
-
如果命令在进行范围查找时使用米作为单位,那么它就以米为单位返回各个位置的距离。
-
如果命令在进行范围查找时使用千米作为单位,那么它就以千米为单位返回各个位置的距离。
诸如此类。
作为例子,我们可以通过执行以下命令,找出距肇庆市 200km 范围内的所有城市,并计算出这些城市与肇庆市之间的距离:
redis> GEORADIUS Guangdong-cities 112.3351942 23.0586893 200 km WITHDIST
1) 1) "Zhongshan" -- 被匹配的位置
2) "125.5669" -- 位置与中心点之间的距离
2) 1) "Shenzhen"
2) "184.9015"
3) 1) "Foshan"
2) "79.1250"
4) 1) "Guangzhou"
2) "91.6332"
5) 1) "Dongguan"
2) "149.6536"
6) 1) "Qingyuan"
2) "107.3463"
bash
从返回的结果可以看到,中山距离肇庆约 125km,深圳距离肇庆约 184km,佛山距离肇庆约 79km,而广州、东莞和清远则分别距离肇庆约 91km、149km 和 107km。
返回被匹配位置的坐标
除了 WITHDIST 之外,GEORADIUS 命令还提供了另一个可选项 WITHCOORD,通过使用这个选项,用户可以让 GEORADIUS 命令在返回被匹配位置的同时,将这些位置的坐标也一并返回:
GEORADIUS location_set longitude latitude radius unit [WITHCOORD]
bash
比如,通过执行以下命令,我们可以找出距离肇庆市 100km 范围内的所有城市,并获取这些城市的坐标:
redis> GEORADIUS Guangdong-cities 112.3351942 23.0586893 100 km WITHCOORD
1) 1) "Foshan" -- 被匹配的位置
2) 1) "113.10631066560745239" -- 位置的经度
2) "23.00883120241353907" -- 位置的纬度
2) 1) "Guangzhou"
2) 1) "113.22784155607223511"
2) "23.1255982020608073"
bash
结果显示,佛山和广州这两座城市都位于距肇庆市 100km 范围之内,其中佛山市的经度为 113.10631066560745239,纬度为 23.00883120241353907,而广州市的经度为 113.22784155607223511,纬度为 23.1255982020608073。
排序查找结果
GEORADIUS 命令在默认情况下会以无序方式返回被匹配的位置,但是通过使用可选的 ASC 选项或 DESC 选项,用户可以改变这一行为,让 GEORADIUS 命令以有序方式返回结果:
GEORADIUS location_set longitude latitude radius unit [ASC|DESC]
bash
如果用户使用了 ASC 选项,那么 GEORADIUS 将根据中心点与被匹配位置之间的距离,按照由近到远的顺序返回被匹配的位置;相反,如果用户使用的是 DESC 选项,那么 GEORADIUS 将按照由远到近的顺序返回被匹配的位置。
比如,以下代码就展示了如何按照由近到远的顺序返回距离肇庆市 150km 范围内的其他城市:
redis> GEORADIUS Guangdong-cities 112.3351942 23.0586893 150 km ASC
1) "Foshan"
2) "Guangzhou"
3) "Qingyuan"
4) "Zhongshan"
5) "Dongguan"
bash
命令的结果显示,在半径 150km 之内,距离肇庆最近的城市是佛山,之后是广州、清远和中山,而距离肇庆最远的城市则是东莞。
如果我们在使用 ASC 选项或者 DESC 选项的同时也使用 WITHDIST 选项,那么被匹配位置的有序性质将变得更为明显。比如,以下命令在按照由近到远的顺序返回肇庆市指定半径范围内的其他城市时,还会返回这些城市与肇庆市之间的距离:
redis> GEORADIUS Guangdong-cities 112.3351942 23.0586893 150 km ASC WITHDIST
1) 1) "Foshan"
2) "79.1250"
2) 1) "Guangzhou"
2) "91.6332"
3) 1) "Qingyuan"
2) "107.3463"
4) 1) "Zhongshan"
2) "125.5669"
5) 1) "Dongguan"
2) "149.6536"
bash
通过命令给出的距离,我们可以清晰地看出命令返回的各个城市的确是按照距离由近到远地进行排列的。
限制命令获取的位置数量
默认情况下,GEORADIUS 命令将返回指定半径范围内的所有其他位置,但是通过可选的 COUNT 选项,我们可以限制命令返回的最大位置数量:
GEORADIUS location_set longitude latitude radius unit [COUNT n]
bash
举个例子,如果我们在不使用 COUNT 选项的情况下,查找距离肇庆市 200km 范围内的城市,那么命令将返回 6 个城市作为结果:
redis> GEORADIUS Guangdong-cities 112.3351942 23.0586893 200 km
1) "Zhongshan"
2) "Shenzhen"
3) "Foshan"
4) "Guangzhou"
5) "Dongguan"
6) "Qingyuan"
bash
但是通过使用 COUNT 选项,我们可以让 GEORADIUS 命令只返回 3 个城市作为结果:
redis> GEORADIUS Guangdong-cities 112.3351942 23.0586893 200 km COUNT 3
1) "Foshan"
2) "Guangzhou"
3) "Qingyuan"
bash
同时使用多个可选项
用户可以通过同时使用 GEORADIUS 命令的多个可选项来实现更为细致和复杂的查找操作。
比如,通过同时使用 WITHDIST、WITHCOORD 和 ASC 这 3 个选项,我们可以在查找肇庆市指定半径范围内的其他城市时,按照由近到远的顺序对这些城市进行排序,并返回这些城市的坐标以及它们与肇庆市的距离:
redis> GEORADIUS Guangdong-cities 112.3351942 23.0586893 200 km WITHDIST WITHCOORD ASC
1) 1) "Foshan" -- 匹配的位置
2) "79.1250" -- 与中心点的距离
3) 1) "113.10631066560745239" -- 匹配位置的经度
2) "23.00883120241353907" -- 匹配位置的纬度
2) 1) "Guangzhou"
2) "91.6332"
3) 1) "113.22784155607223511"
2) "23.1255982020608073"
3) 1) "Qingyuan"
2) "107.3463"
3) 1) "113.20996731519699097"
2) "23.59367501967128788"
4) 1) "Zhongshan"
2) "125.5669"
3) 1) "113.40603142976760864"
2) "22.51115644582544206"
5) 1) "Dongguan"
2) "149.6536"
3) 1) "113.79432410001754761"
2) "22.97619920220819978"
6) 1) "Shenzhen"
2) "184.9015"
3) 1) "114.05388146638870239"
2) "22.55515920515157546"
bash
或者通过同时使用 ASC 选项和 COUNT 选项,获取距离肇庆市最近的 3 个城市:
redis> GEORADIUS Guangdong-cities 112.3351942 23.0586893 200 km ASC COUNT 3
1) "Foshan"
2) "Guangzhou"
3) "Qingyuan"
bash
诸如此类。