Geospatial-地理空间
Posted 李子捌
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Geospatial-地理空间相关的知识,希望对你有一定的参考价值。
本文已收录于专栏
欢迎各位关注、三连博主的文章及专栏,全套Redis学习资料,大厂必备技能!
目录
一、简介
Geospatial是Redis在3.2版本以后增加的地理位置GEO模块,这个模块可以用来实现微信附近的人,在线点餐“附近的餐馆”等位置功能。
二、命令
2.1 GEOADD
命令简介:
GEOADD key longitude latitude member [longitude latitude member …]
将给定的空间元素(维度、经度、名字)添加到指定的键里面,数据以有序集合的形式被存放在键中。GEOADD接收的参数必须先输入经度,然后输入维度。
GEOADD经纬度的输入范围如下(对两极不支持):
- 有效经度介于-180°~180°之间
- 有效维度介于-85.05112878°至85.05112878°之间
当用户尝试输入一个超出范围的经度或者纬度时, GEOADD 命令将返回一个错误。
代码示例:
可以依次添加单个,也可以同时添加多个地理位置的元素。
127.0.0.1:6379> geoadd city 116.405289 39.904987 beijing
(integer) 1
127.0.0.1:6379> geoadd city 117.190186 39.125595 tianjin
(integer) 1
127.0.0.1:6379> geoadd city 121.472641 31.231707 shanghai
(integer) 1
127.0.0.1:6379> geoadd city 112.982277 28.19409 changsha 113.28064 23.125177 guangzhou
(integer) 2
错误示例:
127.0.0.1:6379> geoadd city 190 18 buzhidao
(error) ERR invalid longitude,latitude pair 190.000000,18.000000
2.2 GEOPOS
命令简介:
GEOPOS key member [member …]
根据键(key)获取给定位置元素的位置(经度和纬度),GEOPOS 可以接收一个member,也可以接收多个member,如果member不存在则返回nil
代码示例:
127.0.0.1:6379> geopos beijing
(empty array)
127.0.0.1:6379> geopos city beijing
1) 1) "116.40528827905654907"
2) "39.90498588819134085"
127.0.0.1:6379> geopos city tianjin shanghai
1) 1) "117.19018846750259399"
2) "39.12559461779084558"
2) 1) "121.47264093160629272"
2) "31.23170744181923197"
127.0.0.1:6379> geopos city xiaoriben
1) (nil)
2.3 GEODIST
命令简介:
GEODIST key member1 member2 [unit]
返回两个给定位置之间的距离,以双精度浮点数的形式被返回。如果给定的位置其中一个不存在(两个都不存在也是一样,下面有示例),将会返回空值(nil)。
unit单位描述:
- m -> 米
- km -> 千米
- mi -> 英里
- ft -> 英尺
默认单位:
如果用户未给定指定单位unit,则默认为米(m)
误差范围:
GEODIST 计算的算法会将地球考虑为一个完全球体,在极限情况下,存在最大0.5%的误差
代码示例:
127.0.0.1:6379> geodist city beijing shanghai m
"1067597.0432"
127.0.0.1:6379> geodist city beijing shanghai km
"1067.5970"
127.0.0.1:6379> geodist city beijing xiaoriben
(nil)
127.0.0.1:6379> geodist city meiguoguizi xiaoriben
(nil)
2.4 GEORADIUS
命令简介:
GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [ASC|DESC] [COUNT count]
以给定的经纬度为中心, 返回键包含的位置元素当中, 与中心的距离不超过给定最大距离的所有位置元素。
m|km|ft|mi选项:
- m -> 米
- km -> 千米
- mi -> 英里
- ft -> 英尺
[WITHCOORD] [WITHDIST] [WITHHASH]选项:
- [WITHCOORD]:将位置元素的经度和纬度也一并返回。
- [WITHDIST] :在返回位置元素的同时, 将位置元素与中心之间的距离也一并返回。 距离的单位和用户给定的范围单位保持一致。
- [WITHHASH]: 以 52 位有符号整数的形式, 返回位置元素经过原始 geohash 编码的有序集合分值。 这个选项主要用于底层应用或者调试, 实际中的作用并不大。
[ASC|DESC] 选项:
- ASC:根据给定的中心位置,从近到远返回位置元素
- DESC:根据给定的中心位置,从远到近返回位置元素
[COUNT count] 参数:
GEORADIUS 默认会返回符合条件的全部位置元素。但是用户可以通过[COUNT count] 参数去指定获取前N个匹配元素。这个参数可以减少需要返回的元素数量,一定程度上可以减少带宽压力。
返回值:
GEORADIUS 的返回值是一个数组,但是数组的内容会根据是否存在上述参数而改变
- 未给定任何WITH参数,则返回普通线性列表
- 给定[WITHCOORD] [WITHDIST] [WITHHASH]等参数后返回一个二层嵌套数组
具体返回值请查看后续示例,建议还是自己多搞几次就清楚了
代码示例:
未给定任何WITH参数
127.0.0.1:6379> georadius city 116.405289 39.904987 1000 km
1) "tianjin"
2) "beijing"
给定[WITHCOORD] [WITHDIST] [WITHHASH]等参数,返回的时二层嵌套数组
127.0.0.1:6379> georadius city 116.405289 39.904987 1000 km withcoord
1) 1) "tianjin"
2) 1) "117.19018846750259399"
2) "39.12559461779084558"
2) 1) "beijing"
2) 1) "116.40528827905654907"
2) "39.90498588819134085"
127.0.0.1:6379> georadius city 116.405289 39.904987 1000 km withdist
1) 1) "tianjin"
2) "109.7754"
2) 1) "beijing"
2) "0.0001"
2.5 GEORADIUSBYMEMBER
命令简介:
GEORADIUSBYMEMBER key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [ASC|DESC] [COUNT count]
GEORADIUSBYMEMBER与GEORADIUS的区别在于,GEORADIUSBYMEMBER无需给定经纬度,只需要给定成员的key就行,具体使用与GEORADIUS一致
代码示例:
127.0.0.1:6379> georadiusbymember city beijing 1000 km
1) "tianjin"
2) "beijing"
127.0.0.1:6379> georadiusbymember city beijing 1000 km withcoord
1) 1) "tianjin"
2) 1) "117.19018846750259399"
2) "39.12559461779084558"
2) 1) "beijing"
2) 1) "116.40528827905654907"
2) "39.90498588819134085"
2.6 GEOHASH
命令名称:
GEOHASH key member [member …]
返回一个或多个位置元素的GeoHash表示,可以给顶多个key中的member,因此返回的是一个数组。
代码示例:
127.0.0.1:6379> geohash city beijing shanghai changsha
1) "wx4g0b7xru0"
2) "wtw3sjt9vs0"
3) "wt026ux4mz0"
三、中国省会城市的经纬度
为了便于各位大佬们学习Geospatial的学习,我整理了全国省会城市的经纬度在这,有需要的可以自取。
名称 | 经度 | 维度 |
---|---|---|
北京市 | 116.405289 | 39.904987 |
天津市 | 117.190186 | 39.125595 |
呼和浩特市 | 111.751990 | 40.841490 |
银川市 | 106.232480 | 38.486440 |
石家庄市 | 114.502464 | 38.045475 |
济南市 | 117.000923 | 36.675808 |
郑州市 | 113.665413 | 34.757977 |
西安市 | 108.948021 | 34.263161 |
武汉市 | 114.298569 | 30.584354 |
南京市 | 118.76741 | 32.041546 |
合肥市 | 117.283043 | 31.861191 |
上海市 | 121.472641 | 31.231707 |
长沙市 | 112.982277 | 28.19409 |
南昌市 | 115.892151 | 28.676493 |
杭州市 | 120.15358 | 30.287458 |
福州市 | 119.306236 | 26.075302 |
广州市 | 113.28064 | 23.125177 |
台北市 | 121.5200760 | 25.0307240 |
海口市 | 110.199890 | 20.044220 |
南宁市 | 108.320007 | 22.82402 |
重庆市 | 106.504959 | 29.533155 |
昆明市 | 102.71225 | 25.040609 |
贵阳市 | 106.713478 | 26.578342 |
成都市 | 104.065735 | 30.659462 |
兰州市 | 103.834170 | 36.061380 |
西宁市 | 101.777820 | 36.617290 |
拉萨市 | 91.11450 | 29.644150 |
乌鲁木齐市 | 87.616880 | 43.826630 |
沈阳市 | 123.429092 | 41.796768 |
长春市 | 125.324501 | 43.886841 |
哈尔滨市 | 126.642464 | 45.756966 |
香港 | 114.165460 | 22.275340 |
澳门 | 113.549130 | 22.198750 |
以上是关于Geospatial-地理空间的主要内容,如果未能解决你的问题,请参考以下文章
GIS风暴什么是地理空间智能(Geospatial AI)?
GIS风暴什么是地理空间智能(Geospatial AI)?