經緯度搜尋 1 Geohash演算法原理

2021-09-01 01:56:53 字數 1160 閱讀 4425

geohash作為solr的位置資訊搜尋演算法,有必要了解其基本的實現原理。geohash演算法的wiki鏈結為[url]這裡再結合自己的理解,重新複述一下。

[b]由經緯度變成base32標識[/b]

geohash的思想,是將所有的經緯度座標,通過geohash,變成乙個唯一的base32標識。他將世界上的所有區域進行分塊,每個維度都是32塊,進而將範圍逐漸變小、變小,最後的一堆數字,就成了這個base32的唯一標識。比如說「drt2y」這個標識,首先確定d:

[img]

ok,找到d區域後,再將d進行分塊,精確到dr:

[img]

類似的,繼續找到drt:

[img]

以此類推,慢慢的精確到你指定的點,這就變成了唯一的base32標識。

base 32的對應表如下:[img]

[b]encode:由經緯度到base32[/b]

使用wiki上的例子,緯度為42.6,經度為-5.6的點,轉化為base32的話要如何轉呢?

拿緯度來進行說明,緯度的範圍為-90到90,將這個範圍劃為兩段,則為[-90,0]、[0,90],然後看給定的緯度在哪個範圍,在前面的範圍的話,就設當前位為0,後面的話值便為1.然後繼續將確定的範圍1分為2,繼續以確定值在前段還是後段來確定bit的值。就這樣慢慢的縮小範圍,一般最多縮小13次就可以了(經緯度的二進位制位相加最多25位,經度13位,緯度12位)。這時的中間值,將跟給定的值最相近。

結合圖,看的更明白些:

[img]

這樣,取出圖中的bit位:1011 1100 1001,同樣的方法,將經度(範圍-180到180)算出來為

0111 1100 0000 0。

得到了經緯度的二進位制位後,下面需要將兩者進行結合:從經度、緯度的迴圈,每次取其二進位制的一位(不足位取0),合併為新的二進位制數:01101 11111 11000 00100 00010。每5位為乙個十進位制數,結合base32對應表對映為base32值為:ezs42。這樣就完成了encode的過程 :)

[b]decode:由base32到經緯度[/b]

相信知道了encode的過程後,decode的過程很容易推導了。不清楚的可以參考wiki。這裡就不細說了。

[b]after[/b]

接下來,我會寫一下lucene/solr是如何應用geohash的,包括建立索引、查詢索引,以及距離的計算等。

跟據經緯度實現附近搜尋Java實現

mysql空間資料庫 矩形演算法 geohash geo演算法 參考文件 一直在琢磨lbs,期待可以發現更好的方案。現在糾結了。簡單列舉一下已經了解到的方案 1.sphinx geo索引 2.mongodb geo索引 3.mysql sql查詢 4.mysql geohash 5.redis ge...

計算兩點經緯度之間的演算法

private static final double earth radius 6378.137 private static double rad double d 得出兩個經緯度之間的距離 param r longitude param r latitude param n longitude...

計算某經緯度1公里內的物件

從具體的某站到其他基站的距離,可以簡單的遍歷一次 得到其他站點和目標站點的距離.再做判斷就可以了,已知2點座標,獲得他們的距離的方法 2點分別為p1 lat1,lng1 p2 lat2,lng2 公式的單位都是弧度。簡注 根據已知兩點經緯度求距離.經緯度輸入以度為單位 使用此函式,需要包含標頭檔案 ...