redis 经纬度坐标点 redis轻松处理经纬度坐标点数据的实现方法
be5yond 人气:2Redis 3.2 之后,支持地理坐标数据的管理。将给定的坐标元素(纬度、经度、名字)添加到指定的键里面。 这些数据就会以有序集合的形式被储, 可以通过GEORADIUS 计算两个坐标点的距离,或者使用GEORADIUS 和 GEORADIUSBYMEMBER查询某个坐标半径内的数据。下面对其中常用的命令进行一个简单的介绍。
1. GEOADD
将坐标信息添加到指定的键里面。
GEOADD key longitude latitude member [longitude latitude member ...]
longitude:坐标点经度,有效值[ -180,180 ]
latitude:坐标点纬度,有效值[ -85.05112878, 85.05112878 ]
示例:
127.0.0.1:6379> geoadd parks 116.300892 40.009462 yuanmingyuan (integer) 1 127.0.0.1:6379> geoadd parks 116.188797 39.990132 xiangshan 116.255916 40.030233 baiwangshan (integer) 2 127.0.0.1:6379> GEOADD parks 110 89.9 nanji (error) ERR invalid longitude,latitude pair 110.000000,89.900000
可以看到,GEOADD 支持一次添加一个或多个地点,每个地点需要包含精度维度和名称,当尝试添加合法经纬度外的坐标(维度为89.9的nanji) 时, 会报错。
2. GEOPOS
GEOPOS命令根据地点的名称返回对应的经纬度。集合中不存在时,返回数据为空
示例:
127.0.0.1:6379> GEOPOS parks xiangshan baiwangshan nanji 1) 1) "116.18879646062850952" 2) "39.99013224137585354" 2) 1) "116.2559160590171814" 2) "40.03023406483775659" 3) (nil)
3. GEODIST
GEODIST 返回两个给定位置之间的距离。如果两个位置之间的其中一个不存在, 那么命令返回空值。
GEODIST key member1 member2 [unit]
合法的unit值
unit: | m(缺省值) | km | mi | ft |
说明: | 米 | 千米 | 英里 | 英尺 |
示例:
127.0.0.1:6379> GEODIST parks xiangshan baiwangshan "7251.9492" 127.0.0.1:6379> GEODIST parks xiangshan baiwangshan km "7.2519" 127.0.0.1:6379> GEODIST parks xiangshan nanji km (nil)
4. GEORADIUS
以给定的经纬度为中心, 返回键包含的位置元素当中, 与中心的距离不超过给定最大距离的所有位置元素。
GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]
经纬度和单位参数与前面命令保持一致。 其他可选参数说明
- WITHCOORD: 将坐标数据的经纬度一并返回
- WITHDIST:将坐标数据与当前坐标的距离一并返回
- WITHHASH:以 52 位有符号整数的形式, 返回位置元素经过原始 geohash 编码的有序集合分值
- COUNT:返回指定条数的数据
- ASC|DESC:根据中心的位置, 按照从近到远或者从远到近的方式返回位置元素
- STORE和STOREDIST:将返回结果保存至一个有序集合,区别是STORE保存的是hash值,STOREDIST保存的是距离
示例:
返回额外信息
127.0.0.1:6379> GEORADIUS parks 116.29248 40.048107 20 km 1) "xiangshan" 2) "baiwangshan" 3) "yuanmingyuan" 127.0.0.1:6379> GEORADIUS parks 116.29248 40.048107 20 km WITHCOORD WITHDIST WITHHASH 1) 1) "xiangshan" 2) "10.9353" 3) (integer) 4069878528493207 4) 1) "116.18879646062850952" 2) "39.99013224137585354" 2) 1) "baiwangshan" 2) "3.6941" 3) (integer) 4069880373231506 4) 1) "116.2559160590171814" 2) "40.03023406483775659" 3) 1) "yuanmingyuan" 2) "4.3576" 3) (integer) 4069880708898691 4) 1) "116.30089133977890015" 2) "40.00946202493697257"
指定数据条数和排序
127.0.0.1:6379> GEORADIUS parks 116.29248 40.048107 20 km WITHDIST ASC 1) 1) "baiwangshan" 2) "3.6941" 2) 1) "yuanmingyuan" 2) "4.3576" 3) 1) "xiangshan" 2) "10.9353" 127.0.0.1:6379> GEORADIUS parks 116.29248 40.048107 20 km WITHDIST DESC 1) 1) "xiangshan" 2) "10.9353" 2) 1) "yuanmingyuan" 2) "4.3576" 3) 1) "baiwangshan" 2) "3.6941" 127.0.0.1:6379> GEORADIUS parks 116.29248 40.048107 20 km WITHDIST ASC COUNT 2 1) 1) "baiwangshan" 2) "3.6941" 2) 1) "yuanmingyuan" 2) "4.3576"
将结果保存到新的zset, hash值或者距离
127.0.0.1:6379> GEORADIUS parks 116.29248 40.048107 20 km ASC COUNT 2 STORE store_20km (integer) 2 127.0.0.1:6379> GEORADIUS parks 116.29248 40.048107 20 km ASC COUNT 2 STOREDIST storedist_20km (integer) 2 127.0.0.1:6379> ZRANGE store_20km 0 -1 WITHSCORES 1) "baiwangshan" 2) "4069880373231506" 3) "yuanmingyuan" 4) "4069880708898691" 127.0.0.1:6379> ZRANGE storedist_20km 0 -1 WITHSCORES 1) "baiwangshan" 2) "3.6941190849982757" 3) "yuanmingyuan" 4) "4.3576262236174665"
5. GEORADIUSBYMEMBER
这个命令和 GEORADIUS 命令一样, 都可以找出位于指定范围内的元素, 但是GEORADIUSBYMEMBER的中心点是由给定的位置元素决定的, 而不是像GEORADIUS 那样, 使用输入的经度和纬度来决定中心点。
示例:
GEORADIUSBYMEMBER parks yuanmingyuan 5 km ASC 1) "yuanmingyuan" 2) "baiwangshan"
查询圆明园5公里内的公园
加载全部内容