Geospatial-地理空间

Posted 李子捌

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Geospatial-地理空间相关的知识,希望对你有一定的参考价值。

本文已收录于专栏

❤️《Redis之大厂必备技能包》❤️

欢迎各位关注、三连博主的文章及专栏,全套Redis学习资料,大厂必备技能!


 目录

一、简介

二、命令

2.1 GEOADD

2.2 GEOPOS

2.3 GEODIST

2.4 GEORADIUS

2.5 GEORADIUSBYMEMBER

2.6 GEOHASH

三、中国省会城市的经纬度


一、简介

Geospatial是Redis在3.2版本以后增加的地理位置GEO模块,这个模块可以用来实现微信附近的人,在线点餐“附近的餐馆”等位置功能。

二、命令

2.1 GEOADD

命令简介:

GEOADD key longitude latitude member [longitude latitude member …]

将给定的空间元素(维度、经度、名字)添加到指定的键里面,数据以有序集合的形式被存放在键中。GEOADD接收的参数必须先输入经度,然后输入维度。
GEOADD经纬度的输入范围如下(对两极不支持):

  1. 有效经度介于-180°~180°之间
  2. 有效维度介于-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.40528939.904987
天津市117.19018639.125595
呼和浩特市111.75199040.841490
银川市106.23248038.486440
石家庄市114.50246438.045475
济南市117.00092336.675808
郑州市113.66541334.757977
西安市108.94802134.263161
武汉市114.29856930.584354
南京市118.7674132.041546
合肥市117.28304331.861191
上海市121.47264131.231707
长沙市112.98227728.19409
南昌市115.89215128.676493
杭州市120.1535830.287458
福州市119.30623626.075302
广州市113.2806423.125177
台北市121.520076025.0307240
海口市110.19989020.044220
南宁市108.32000722.82402
重庆市106.50495929.533155
昆明市102.7122525.040609
贵阳市106.71347826.578342
成都市104.06573530.659462
兰州市103.83417036.061380
西宁市101.77782036.617290
拉萨市91.1145029.644150
乌鲁木齐市87.61688043.826630
沈阳市123.42909241.796768
长春市125.32450143.886841
哈尔滨市126.64246445.756966
香港114.16546022.275340
澳门113.54913022.198750

 

以上是关于Geospatial-地理空间的主要内容,如果未能解决你的问题,请参考以下文章

GIS风暴什么是地理空间智能(Geospatial AI)?

GIS风暴什么是地理空间智能(Geospatial AI)?

OGC open geospatial consortium标准服务

Apache点燃地理空间查询示例

mongoDb地理空间索引和查询

Cassandra 3.11.1 地理空间支持