如何實現查詢附近的人

2021-07-12 03:22:46 字數 808 閱讀 6589

問題:給定乙個使用者a,返回與此使用者相距小於d的所有使用者。

支援geo的後端儲存有mongodb,redis等。那麼如果讓我們實現,我們應該怎麼做呢?

思路:圍繞此使用者生成乙個圓形,半徑是d,返回所有被此園覆蓋的使用者。

方法1: 

先求方,再求園。

如果直接求園,每乙個使用者都要計算距離值,無法利用到索引,可以先求方,將經度值和緯度值分別差值小於半徑的點拿出來,然後在求園,將不符合點的使用者過濾。

方法2: 位置敏感hash

mongodb採用的就是這種方式:具體方式是先將整個地圖分為四個相等的區域,然後給每個區域賦值,比如左下方是00,左上方是01,右下方是10,右上方是11. 

a. 給定乙個點,算出此點在哪個區域,比如在右上方,則是11,那麼geohash的值的前兩位就是11.

b. 將右上方區域繼續切分為四個相等的區域,然後算出此點在哪個區域,如果在右下方,那麼geohash的接下來兩位就是10.

c 就這樣迭代n次,geohash的值就是2n位的。n越大,精度越高,mongodb的預設值是26次。

然後計算相鄰的時候就比較容易了,因為hash值是位置敏感hash,所以越是相近的點那麼他們的差值就越小。

方法2的優點顯而易見,求相鄰的速度非常快,是o(1), 缺點是模擬相鄰,並不是真正的圓形等距離,不過這一缺點可以靠增加迭代次數實現,也就是精度提高。方法1的優點是嚴格的圓形等距離,但缺點是演算法複雜度根附近的使用者數相關。

原文:hongchangfirst

hongchangfirst的主頁:

redis實現查詢附近的人

地球上的任何乙個位置都可以使用二維的經緯度來表示,經度範圍 180,180 緯度範圍 90,90 可以基於當前的座標節點,來劃分出乙個矩形 2r 的範圍來查詢附近的人。當兩個座標元素的距離不是很遠的時候,我們就可以簡單利用勾股定理就能夠得出他們之間的距離。但是地球不是乙個標準的球體,經緯度的密度是不...

查詢附近的人 mongodb的實現

最近做乙個關於附近的人查詢,參考了很多資料 現在市面上主流的做法 1.用資料庫 2.用類存 3.用lucene 我選用的是用mongodb自帶的查附近的人的方法,如下 dbobject db new basicdbobject cityid json.parse dbobject near new ...

nodejs mongo 實現搜附近的人

參考 用mongo作為儲存,來實現搜尋附近的人具有先天的優勢,mongodb原生支援地理位置索引,可以直接用於位置距離計算和查詢。另外,它也是如今最流行的nosql資料庫之一,除了能夠很好地支援地理位置計算之外,還擁有諸如面向集合儲存 模式自由 高效能 支援複雜查詢 支援完全索引等等特性。先看一下我...