之前接手了學長的一個地圖項目,學長說可以把地圖的經緯度用Geohash算法換成字符串,下來了解了一下
Geohash算法是將二維的經緯度轉換爲了一維的字符串,這樣相近的點字符串相似的前綴就越多,這樣充分利用了數據庫的B樹索引,速度大大提高
GeoHash的算法
字符串位數越長代表精度越高,8位誤差約爲19M
字符串的由來:
1、根據經緯度計算出GeoHash的二進制編碼
將緯度 分成 [ - 90 , 0) 和 (0 , 90] ,如果位於左區間則取 0 ,右區間取 1 ,分的次數越多,代表的精度越高
經度 則 分成 [ - 180 , 0) 和 (0 , 180 ] 同上。
2、我們將計算出的經緯度二進制編碼進行 組碼 ,偶數位放經度,奇數位放緯度。
然後每 5 位一組,轉爲 十進制 ,對照 base32編碼,得出字符串。
GeoHash 的缺點:
我們將二維經緯度轉爲一維字符串,根據經緯度二分 左 0 右 1 的原則繪製如下圖N型曲線,這種曲線被稱爲Peano空間填充曲線
這種曲線的缺點就是有突變性,0111與 1000編碼相鄰,但是實際距離卻相差甚遠,因此我們需要根據GeoHash字符串先選出臨近的點,然後進行實際距離的計算。