一、認(rèn)識geohash
算法計算后,獲取到可比較字符串

緯度:1 1 0 1 0 0 1 0 1 1 0 0 0 1 0,經(jīng)度:1 0 1 1 1 0 0 0 1 1 0 0 0 1 1,合并:偶數(shù)位放經(jīng)度,奇數(shù)位放緯度:

首先將11100 11101 00100 01111 0000? 01101轉(zhuǎn)成十進(jìn)制,對應(yīng)著28、29、4、15,0,13 十進(jìn)制對應(yīng)的base32編碼就是wx4g0e

然戶將獲取到的經(jīng)緯度二進(jìn)制數(shù)以每5個數(shù)為一組,將每一組都進(jìn)行轉(zhuǎn)換成十進(jìn)制數(shù)字。
然后采用Base32對應(yīng)編碼進(jìn)行轉(zhuǎn)換可得到編碼?wx4g0e這樣的可比較的字符串,比如我們的經(jīng)緯度都分了10次,那么最后生成的字符串的長度就是4,范圍是20km,如果我們經(jīng)緯度都分20次,那么最后生成的字符串的長度就是8,范圍可以精確到19m。為什么是可比較字符串,后面會詳細(xì)講解到。
在此對Base32編碼進(jìn)行一番簡單介紹: Base32,是將數(shù)字 0~9 ,加上26個字母(去除a,i,l,o?四個)進(jìn)行組合而成的32個字符編碼形式。如代碼:

在線解析的GeoHash值(wx4gjk32kfrx)

二、geohash算法
Geohash中的每一個字母或者數(shù)字(如wx4g0e中的w)都是由5bits組成(2^5 = 32,base32),這5bits可以有32中不同的組合(0~31),這樣我將整個地圖區(qū)域分為32個區(qū)域,00000 ~ 11111標(biāo)識這32個區(qū)域。第一次劃分后:

第一次劃分(11100)5bits中有3bits是經(jīng)度(2^3 = 8), 2bits緯度4個區(qū)段(2^2 = 4),32個區(qū)域(對應(yīng)Base32)

GeoHash將每一個區(qū)域畫成一塊塊矩形塊,用字符串表示,查詢附近點,坐標(biāo)計算出字符串,定位到所在矩形塊,?wx4e就包含wx4e0e,也就是說wx4e0e在wx4e范圍內(nèi)。

弊端如圖:不僅獲取當(dāng)前所在矩形區(qū)域,還獲取周圍8個矩形塊中的點:

三、GeoHash對應(yīng)地圖精度參考圖


Redis3.2之后支持Geo

(lat:39.9257460000,lng:116.5998310000)
geohash拆分規(guī)律拆分后:11100 11101 00100 01111 10001 10010 00011 00010 01110 10111 11101
轉(zhuǎn)成10進(jìn)制得到28 29 4 15 17 18 3 2 18 14 23 29
鏈接:https://www.cnblogs.com/LBSer/p/3310455.html
鏈接:https://zhuanlan.zhihu.com/p/27771446