基於LBS的興趣點查詢

http://www.cnblogs.com/xiongbo/archive/2011/06/03/2071936.html

  • 問題:

在服務端保存有海量的興趣點(POI,Point of Interest),根據用戶的位置,如何判斷用戶當前出在哪個POI呢?

  • 分析:

興趣點是海量的,用戶也是電信級的。如果每次查詢用戶所處的興趣點,都要將全部興趣點取出來計算一遍距離,從中選取最小的,這樣會給服務端帶來極大的壓力(計算量級別約爲:興趣點數*用戶數)。

我們知道赤道約爲4萬公里,1度大約爲111公里,1分大約爲2公里,1秒大約爲33米(經緯度的單位分別爲度、分、秒,1度=60分=60*60秒)。

我們可以根據用戶所在位置的經緯度,先從海量數據中選取用戶周圍一定範圍內的興趣點,然後計算用戶與興趣點之間的距離,從而選出用戶所處的興趣點。

但是,位置信息都是有一定的精度範圍的,一般GPS定位精度在10米左右,基站定位精度在1000M左右,另外有的POI本來就是在一起的,比如一個是在一樓,另一個是在兩樓。因此如果單單通過計算距離的最小值來選出用戶所處的興趣點也不可能完全正確。我們可以將一定範圍以內的興趣點提供給用戶,讓用戶自己來確定在所處的興趣點。

  • 詳細方案:

假設用戶所在的位置信息爲(px,py,pm),px表示精度,py表示緯度,pm表示精度。我們從海量興趣點數據庫中,選取滿足一下條件的興趣點:

1.經度範圍在px-0.1~px+0.1(單位度)

2.緯度範圍在py-0.1~py+0.1(單位度)

備註:0.1度=6分 約等於12公里

這樣就可以選出用戶周圍24公里*24公里這樣一個範圍的興趣點。

針對以上興趣點,我們逐個計算用戶與興趣點之間的距離,選取距離在 1000+pm (單位米)範圍內的興趣點,提供給用戶進行選擇確認。

計算模型中的參數可根據實際數據進行微調

  • 服務端壓力:

以上方案,通過第一次篩選,極大減少了第二次篩選的計算量。主要壓力爲從海量數據庫中查詢出滿足條件的興趣點記錄。不過這問題不大,完全可以通過優化數據庫進行解決,如根據經緯度對錶進行分區,或者基於經緯度進行函數索引等等。

  • 獲取用戶準確位置信息爲什麼那麼難

首先,是因爲用戶的位置信息有不同的來源:GPS/WIFI/基站;其次,用戶是在移動的;最後,每次獲得的位置信息的準確度是在變化的。所以這些原因造成想要獲得用戶的準確位置信息是一件很複雜的事情。

  • 如何獲取用戶的位置信息

獲取用戶的位置信息是異步的,android通過調用一個listener回調函數,告訴應用用戶的具體位置。但是,這種方式需要用戶等一段時間才行,如果希望短時間內獲取用戶的位置信息,可以採用locationManager.getLastKnownLocation獲取用戶最近一次的位置信息,然後等待listener來更新更加準確的用戶位置信息。

  • 如何獲取準確的用戶位置信息

前面已經知道,多種原因造成我們獲得的用戶位置信息不是那麼準確,如果我們希望能夠得到較爲精確的位置信息怎麼辦?
如果用戶是在不斷移動的:那麼不斷通過listener獲取用戶位置信息,並從中找到最準確的位置信息;
如果用戶是相對靜止的:那麼通過listener獲取用戶位置信息,並從中找到最準確的位置信息,如果連續n次,都沒有找到比之前的位置信息更加準確,那麼認爲已經找到最準確信息,刪除listener;
如果只需要獲取用戶粗略位置信息:那麼通過listerer獲取用戶位置信息,從前面n個位置信息中,找到最準確的,刪除listener;


發佈了4 篇原創文章 · 獲贊 4 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章