最近的一個項目要求根據使用者目前位置的經緯度來查詢該使用者方圓十公裡以内的人,這個功能并不是什麼很有技術含量的實作(當然,我們僅僅指的是該功能本身和資料量較小的時候,并不包括長期以來其派生出來的其他問題 ),但由于種種考慮,我還是決定将其記錄下來。
以後不管我們從事APP服務端開發,還是做WEB開發,可能經常會有客戶要求實作這樣的功能,是以我們還是要掌握其原理。
【問題的提出】
我們該如何思考這個問題 ? 可能有的小夥伴要說了:“ 既然我們已經知道了目前使用者的經緯度,我們從資料庫裡面查詢使用者的經緯度,然後一一計算,篩選出所有符合條件的使用者。”
我也曾想當然的這樣認為,并沒有考慮到資料庫的感受,當你操作的是一個十萬,百萬級别的資料庫時,這樣的做法帶來的問題将是災難性的,那麼我們到底該如何做呢 ?
【實作思路】
首先,我們應該這樣想: 既然我們知道了使用者目前位置的經緯度,又知道我們将要搜尋的範圍,我們可不可以計算出一個範圍 ?也就是說,根據一個中心點和半徑,計算出符合條件的經緯度的最大值和最小值 。
【具體實作】
那麼到此,想要獨立思考完成的小夥伴可以不要繼續往下看了。
上面我們提到該功能的一個實作原理,接下來我們就講解一下具體的實作步驟。
我們先聲明一個函數,用作計算經緯度的範圍:
傳回的數組中包含了在 $radius 範圍内,符合條件的最大最小經緯度。
既然我們已經擷取到了範圍,那麼我們就可以開始從資料庫中查找所有在這個經緯度範圍内符合條件的記錄:
【擴充】
直到現在,我們已經知道了如何計算出附近的人,但在實際需求中,我們往往需要計算出每一個人與目前中心點的實際距離。
接着,我們再來看一個方法:
我們在之前已經計算出了附近符合條件的所有人的經緯度,那麼我們可以将每一個人的經緯度和目前中心點的經緯度作為參數傳入該函數,最終計算出每個人符合條件的人與該中心點的距離。
為了保證程式的嚴謹性,我必須做出以下說明:
經緯度範圍的計算方法是在百度上查找的,目前尚沒有找到标準的計算工具,是以該算法無法求證,但大多數文章基本上采用的這種計算方式。
經緯度距離的計算方式是在 Google 上查找的,計算結果與大多數計算工具結果相近。之是以在 Google 中查找,是因為我曾在百度上查找過多種計算方式,結果都不盡人意。
通過半徑和經緯度計算範圍時,半徑的機關是m;計算距離時,得到的結果是km。是以,要注意機關變化。
我依然在努力求證,尋求有關專業的幫助,獲得更精确的計算結果。
作者:Elvis_Li
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。