redis之地理空间geo实战以及选项详解

2024-09-09 10:21:42 浏览数 (1)

redis之地理空间geo实战以及选项详解

Redis GEO Redis GEO 主要用于存储地理位置信息,并对存储的信息进行操作,该功能在 Redis 3.2 版本新增。

Redis GEO 操作方法有:

geoadd:添加地理位置的坐标。 geopos:获取地理位置的坐标。 geodist:计算两个位置之间的距离。 georadius:根据用户给定的经纬度坐标来获取指定范围内的地理位置集合。 georadiusbymember:根据储存在位置集合里面的某个地点获取指定范围内的地理位置集合。 geohash:返回一个或多个位置对象的 geohash 值。

GEOADD

GEOADD key [NX|XX] [CH] longitude latitude member [longitude latitude member …] summary: Add one or more geospatial items in the geospatial index represented using a sorted set since: 3.2.0

代码语言:javascript复制
# 添加元素 返回添加的个数
> geoadd test:geo 116 39 shanghai
1
> geopos test:geo shanghai
116.00000113248825073
38.99999918434559731
# nx:纯新增,不修改,如果存在,则不作任何操作
> geoadd test:geo nx 116 39 shanghai
0
> geopos test:geo shanghai
116.00000113248825073
38.99999918434559731
# xx:纯修改,不新增,如果存在则修改,不存在则不作任何操作,返回添加的个数0,只有加了ch才会返回修改的个数
> geoadd test:geo xx 116 40 shanghai
0
> geopos test:geo shanghai
116.00000113248825073
39.99999991084916218

[NX|XX]

  • NX:表示“Not Exists”。纯新增,不修改 Don’t update already existing elements. Always add new elements.
  • XX:表示“exists”。纯修改,不新增,Only update elements that already exist. Never add elements.
  • 默认情况,有就修改没有就新增。

[CH]

CH:表示“Changed”。返回新增元素总数 修改元素总数,不加ch只返回新增元素的个数。

代码语言:javascript复制
# 不加ch只返回新增元素总数
> geoadd test:geo 116.11111 40.11111 bj
1
# 不加ch修改元素总数不算在内
> geoadd test:geo 116.11111 50.11111 bj
0
> geopos test:geo bj
116.11110895872116089
50.11110907374093415
# 加上ch返回新增元素和修改元素的总数
> geoadd test:geo ch 116.11111 60.11111 bj
1
> geopos test:geo bj
116.11110895872116089
60.1111087346130688

GEODIST

GEODIST key member1 member2 [m|km|ft|mi] summary: Returns the distance between two members of a geospatial index since: 3.2.0

代码语言:javascript复制
# 原始百度坐标BD-09
> geoadd test:geo 116.7882 39.540622 爱民东道华祥路口 116.782931 39.559824 新源道华祥路口
2
> geopos test:geo 爱民东道华祥路口
116.78820043802261353
39.54062225625752802
> geopos test:geo 新源道华祥路口
116.7829325795173645
39.55982276903952055
> geodist test:geo 爱民东道华祥路口 新源道华祥路口 km
2.182
# 将百度坐标系转为WGS84坐标
> geoadd test:geo 116.77571551835673 39.53331705056734 爱民东道华祥路口 	116.7704850498911 39.55243330632807 新源道华祥路口
0
> geopos test:geo 爱民东道华祥路口
116.77571743726730347
39.53331718987630694
> geopos test:geo 新源道华祥路口
116.77048712968826294
39.55243405686004365
> geodist test:geo 爱民东道华祥路口 新源道华祥路口 km
2.1731

说明:

  1. WGS84坐标系
  2. GCJ-02(中国火星坐标系)在WGS84基础上做了偏移和加密
  3. BD-09(百度坐标系) 在GCJ-02基础上做了偏移和加密
  4. 由于各种原因中国国内不让使用WGS84坐标系
  5. 通过结论可以看出用redis geo计算两个位置之间的距离 有所偏差,好像也并不是很大
  1. 百度坐标拾取地址https://api.map.baidu.com/lbsapi/getpoint/index.html
  2. 坐标在线转换工具https://tool.lu/coordinate/?ivk_sa=1021577i

GEOHASH

GEOHASH key member [member …] summary: Returns members of a geospatial index as standard geohash strings since: 3.2.0

代码语言:javascript复制
> Geohash test:geo 爱民东道华祥路口
wx50ckc6r20

GEOPOS

GEOPOS key member [member …] summary: Returns longitude and latitude of members of a geospatial index since: 3.2.0

GEORADIUS

GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count [ANY]] [ASC|DESC] [STORE key] [STOREDIST key] summary: Query a sorted set representing a geospatial index to fetch members matching a given maximum distance from a point since: 3.2.0

  • [WITHCOORD] 查询结果显示坐标
  • [WITHDIST] 查询结果显示距离
  • [WITHHASH] 查询结果显示hash
  • [COUNT count [ANY]] 只显示 count个,[ANY],找到count个就不再继续找了
  • [ASC|DESC] 排序
  • [STORE key] 将查询结果报错到key里面.数据结构zset score为hash
  • [STOREDIST key] 将查询结果报错到key里面.数据结构zset score为到中心点的距离
代码语言:javascript复制
> geoadd test:geo 116.77230566740036 39.544611907362324 新奥大学 116.78676813840866 39.5384297224547 大官地村 116.78331345319748 39.534402050532506 观锦城 116.76229566335678 39.553546799448995 大长亭村 116.75371259450912 39.559171345701564 小长亭村 116.73862248659134 39.57108200042931 万达学院 116.7310693860054 39.52131021574452 北华航天工业学院 116.76123887300491 39.60063684914719 北京联合大学 116.70570105314255 39.51458306578764 廊坊北站 116.70827597379684 39.50895345009274 廊坊站
10
> georadius test:geo 116.78676813840866 39.5384297224547 5 km
大长亭村
小长亭村
新源道华祥路口
大官地村
爱民东道华祥路口
观锦城
> georadius test:geo 116.78676813840866 39.5384297224547 5 km WITHCOORD WITHDIST WITHHASH count 3 asc
大官地村
0.0000
4069241163792491
116.78676813840866089
39.53842972245470122
观锦城
0.5371
4069229686821146
116.78331345319747925
39.53440205053250622
爱民东道华祥路口
1.1054
4069229683961546
116.77571743726730347
39.53331718987630694
> georadius test:geo 116.78676813840866 39.5384297224547 5 km count 3 asc STORE  test:geo:radius:store
3
# STORE选项与WITHDIST, WITHHASH and WITHCOORDS不兼容
> georadius test:geo 116.78676813840866 39.5384297224547 5 km WITHCOORD WITHDIST WITHHASH count 3 asc STORE  test:geo:radius:store
ERR STORE option in GEORADIUS is not compatible with WITHDIST, WITHHASH and WITHCOORDS options
> type test:geo:radius:store
zset
> ZRANGE test:geo:radius:store 0 -1 WITHSCORES
爱民东道华祥路口
4069229683961546
观锦城
4069229686821146
大官地村
4069241163792491
> type  test:geo:radius:sstoredist
zset
> ZRANGE test:geo:radius:sstoredist 0 -1 WITHSCORES
大官地村
0
观锦城
0.53712926544788142
爱民东道华祥路口
1.1054155718829237

GEORADIUSBYMEMBER

GEORADIUSBYMEMBER key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count [ANY]] [ASC|DESC] [STORE key] [STOREDIST key] summary: Query a sorted set representing a geospatial index to fetch members matching a given maximum distance from a member since: 3.2.0

代码语言:javascript复制
> georadius test:geo 116.77230566740036 39.544611907362324 5 km asc
新奥大学
新源道华祥路口
爱民东道华祥路口
大长亭村
大官地村
观锦城
小长亭村
万达学院
北华航天工业学院
> GEORADIUSBYMEMBER test:geo 新奥大学 5 km asc
新奥大学
新源道华祥路口
爱民东道华祥路口
大长亭村
大官地村
观锦城
小长亭村
万达学院
北华航天工业学院

GEOSEARCH

GEOSEARCH key [FROMMEMBER member] [FROMLONLAT longitude latitude] [BYRADIUS radius m|km|ft|mi] [BYBOX width height m|km|ft|mi] [ASC|DESC] [COUNT count [ANY]] [WITHCOORD] [WITHDIST] [WITHHASH] summary: Query a sorted set representing a geospatial index to fetch members inside an area of a box or a circle. since: 6.2

从指定的起点(成员或经纬度)开始,按照指定的范围(半径或矩形框)搜索地理位置。

除了根据半径搜索还能根据矩形框搜索

代码语言:javascript复制
> GEOSEARCH test:geo FROMMEMBER 新奥大学 BYRADIUS 5 km asc
新奥大学
新源道华祥路口
爱民东道华祥路口
大长亭村
大官地村
观锦城
小长亭村
万达学院
北华航天工业学院
> GEOSEARCH test:geo FROMMEMBER 新奥大学 BYBOX 5 3 km asc
新奥大学
新源道华祥路口
爱民东道华祥路口
大长亭村
大官地村
观锦城

GEOSEARCHSTORE destination source [FROMMEMBER member] [FROMLONLAT longitude latitude] [BYRADIUS radius m|km|ft|mi] [BYBOX width height m|km|ft|mi] [ASC|DESC] [COUNT count [ANY]] [WITHCOORD] [WITHDIST] [WITHHASH] [STOREDIST] summary: Query a sorted set representing a geospatial index to fetch members inside an area of a box or a circle, and store the result in another key. since: 6.2

0 人点赞