GeoHash -------寻找附近人
增加
geoadd 指令攜帶集合名稱以及多個(gè)經(jīng)緯度名稱三元組,注意這?可以加?多個(gè)三元組 127.0.0.1:6379> geoadd company 116.48105 39.996794 juejin (integer) 1 127.0.0.1:6379> geoadd company 116.514203 (error) ERR wrong number of arguments for 'geoadd' command 127.0.0.1:6379> geoadd company 116.514203 39.905409 ireader (integer) 1 127.0.0.1:6379> geoadd company 116.489033 40.007669 meituan (integer) 1 127.0.0.1:6379> geoadd company 116.562108 39.787602 jd 116.334255 40.027400 xiaomi (integer) 2 也許你會(huì)問為什么 Redis 沒有提供 geo 刪除指令?前?我們提到 geo 存儲(chǔ)結(jié)構(gòu)上使?的是 zset,意味著我們可以使? zset 相關(guān)的 指令來操作 geo 數(shù)據(jù),所以刪除指令可以直接使? zrem 指令即 可。距離
geodist 指令可以?來計(jì)算兩個(gè)元素之間的距離,攜帶集合名稱、2個(gè)名稱和距離單位。距離單位可以是m、km、ml、ft,分別代表?、千?、英?和尺。 127.0.0.1:6379> geodist company juejin ireader km "10.5501" 127.0.0.1:6379> geodist company juejin meituan km "1.3878" 127.0.0.1:6379> geodist company juejin xiaomi km "12.9606"獲取元素位置
geopos 指令可以獲取集合中任意元素的經(jīng)緯度坐標(biāo),可以?次獲取多個(gè)。 127.0.0.1:6379> geopos company juejin 1) 1) "116.48104995489120483"2) "39.99679348858259686" 127.0.0.1:6379> geopos company juejin ireader 1) 1) "116.48104995489120483"2) "39.99679348858259686" 2) 1) "116.5142020583152771"2) "39.90540918662494363"獲取元素的 hash 值
geohash 可以獲取元素的經(jīng)緯度編碼字符串,上?已經(jīng)提到,它是base32 編碼。你可以使?這個(gè)編碼值去 http://geohash.org/${hash}中進(jìn)?直接定位,它是 geohash 的標(biāo)準(zhǔn)編碼值。geohash計(jì)算過程依據(jù)上述原理,接下來詳細(xì)介紹一下geohash的計(jì)算過程,這里拿經(jīng)緯度(116.389550, 39.928167)進(jìn)行算法說明。
a. 緯度計(jì)算
中學(xué)學(xué)過的地理知識(shí)知道,地球分為南緯與北緯,分別都是0~90°,但是在計(jì)算機(jī)中,用文字定義南緯與北緯較為麻煩,所以計(jì)算機(jī)中用區(qū)間定義[-90,0)與[0,90]分為南北緯,同時(shí)叫做左右區(qū)間。區(qū)分了左右區(qū)間,接下來就是整個(gè)計(jì)算過程:
判斷當(dāng)前緯度39.928167是在左區(qū)間還是右區(qū)間,發(fā)現(xiàn)是在右區(qū)間[0,90]中,在右區(qū)間標(biāo)識(shí)為1;接著將區(qū)間[0,90]進(jìn)行左右區(qū)間二分,二分后為 [0,45),[45,90],可以確定39.928167屬于左區(qū)間 [0,45),標(biāo)記為0;不斷重復(fù)上述過程39.928167總是屬于某個(gè)區(qū)間[a,b]。隨著每次迭代區(qū)間[a,b]總在縮小,并越來越逼近39.928167;依據(jù)最大精度,定義一個(gè)最大重復(fù)次數(shù),這里我們定義為15,這樣就能得出一個(gè)01字串;
b. 全局計(jì)算
經(jīng)度計(jì)算與緯度計(jì)算類似,也是依據(jù)區(qū)間劃分,左右判斷來進(jìn)行,這里就不在復(fù)述了,給出最終計(jì)算結(jié)果為:1 1 0 1 0 0 1 0 1 1 0 0 0 1 0,接下來就是如何通過經(jīng)度與緯度的01字串,編碼成相應(yīng)的字母+數(shù)字的組合。將經(jīng)度與緯度的01字串進(jìn)行合并,合并方法為:基數(shù)為放緯度,偶數(shù)位放經(jīng)度
- 最終字串為:11011, 01110, 00010, 01111, 00001, 00100
- 將字串轉(zhuǎn)換成十進(jìn)制,得到:27, 14, 2, 15, 1, 4
- 對(duì)應(yīng)base32編碼表
轉(zhuǎn)載于:https://www.cnblogs.com/hanmengya/p/10967457.html
總結(jié)
以上是生活随笔為你收集整理的GeoHash -------寻找附近人的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 5 dex文件
- 下一篇: SonarQube 代码扫描任务集成