18.app後端如何實現LBS

移動互聯網,除了一直在線這個特色外,還有一個重要特色,能定位到手機的位置。查找附近的人,附近的餐館等服務,以及大量的o2o應用, 都須要使用LBS(Location Based Services)。那麼,如何用戶的地理座標?如何去查找所需的附近的數據呢?在這篇文章中,爲你一一道來。

1.如何獲取用戶的地理座標


  如今,基於手機來獲取用戶的地理座標,主要是下面兩種方法:


  (1)使用手機上的GPS模塊

  (2)使用手機網絡所鏈接的基站定位html


  通常是使用第一種方法,當手機上沒有GPS模塊,就用第二種方法來定位。

  app端建議直接使用地圖sdk提供的獲取地理座標的方法來獲取地理座標,它會自動判斷使用哪一種方式的。

  對於初次作LBS的小夥伴,地理座標的偏移問題須要注意。經過手機獲取的座標,放到百度地圖或高德地圖上,老是會出現偏移,例如,當時是在微信的前總部「南方通信大廈」附近獲取的座標,那是把座標放到百度地圖上卻到了華南師範大學(那是俺的母校)。

  被這個問題困擾了很久,查了好多資料才找到是這個緣由:國家的法律規定,全部的電子地圖服務提供商都須要給地圖數據加上偏移和加密,例如,你獲取的座標是100,90 ,這個座標到了地圖上卻變成了105,95,這個數據的差別就是偏移。

  並且,這個偏移量沒有明確規定,這就形成了一個現象,不一樣電子地圖服務提供商有不一樣的座標體系,例如,Google地圖,高德地圖,蘋果地圖是同一套座標體系,百度地圖倒是另一套座標體系。

  那麼,怎麼解決這個問題?方法很簡單,使用地圖sdk提供的獲取地理座標功能,獲取的這個座標是已經偏移過的。


2.如何查找附近的用戶(商戶,人)


  通常的業務邏輯是,數據中有不少座標,知道一個座標,把必定範圍內(例如500米內)的其餘座標查出來。

  下面介紹3種實現方案:

(1) mysql的空間數據庫



  參考資料:http://blog.csdn.net/chaiqi/article/details/23099407

  從MySQL4.1開始,mysql就引入了一系列空間擴展,使其具有了必定的空間處理能力。

簡單點來講,就是mysql裏已經能夠把地理座標的數據當成一種獨立的數據類型,並且提供了相關的空間函數(例如查找一個矩形範圍內的座標)給開發者直接調用。mysql

(2)geohash


  geohash的詳細介紹,可參考 http://www.cnblogs.com/dengxinglin/archive/2012/12/14/2817761.html

  geohash編碼,能夠把地理座標轉換成一個值,簡單點來講就是把二維座標轉換成一維座標。geohash表示的並非一個點,而是一個矩形區域。好比編碼w23yr3,它表示的是一個矩形區域。geohash編碼的前綴能夠表示更大的區域。例如w23yr3,它的前綴w23yr表示包含編碼w23yr在內的更大範圍。 這個特性能夠用於附近地點搜索。

  查找附近的時候,很是方便,用SQL中,LIKE ‘w23yr3%’可查詢附近的全部地點。

  在之前的產品中,一個需求是查找用戶附近的商鋪(包含關鍵字),商鋪的數據有130萬,全放在mysql中, 發現用mysql LIKE ‘w23yr3%’這種方式檢索geohash性能上的瓶頸很大,檢索130萬行的數據,平均花費了8秒,這是響應速度是沒法忍受的。

  後來通過不斷優化,肯定了以下使用coreseek+redis+mysql解決方案,一會兒就把響應速度減小到平均1 秒,這個方案的以下:

  1. 用每一個商鋪的座標值計算geohash,把geohash做爲key,商鋪的id做爲value,放到redis的set集中。

  2. 根據用戶的座標計算geohash,在redis中用"keys *"的方法匹配查找附近的商鋪geohash(記得geohash的特色嗎?geohash編碼的前綴能夠表示一個區域),再得到商鋪的id

  3. 把2中商鋪的id做爲filter ,在coreseek中繼續查找。

(3) mongodb


  地理位置支持是MongoDB的一大亮點,全球最流行的LBS服務foursquare,國內的快的,選擇的也是mongodb。

  使用mongodb開發LBS服務有如下的優勢:


  1. mongodb自身的性能高,更新,查詢的速度快。

  2. 經過副本集,分片等方法,很容易實現mongodb的分佈式部署,解決性能瓶頸。

  3. mongodb已在app後端中普遍使用,開發部署對於不少開發者來講都是比較熟悉。


  用mongodb,可支持:

  1. 查詢多邊形範圍的座標。

  2. 查詢附近的座標。

  3. 查詢圓形區域內的座標。


  強烈推薦LBS服務中優先使用mongodb!!!redis


---------------------------------------------------------------------------------------------------------------------------sql

打開連接  app後端系列文章總目錄 總目錄 ,能查看本人發表過的全部原創「app後端」文章。mongodb

【做者】曾健生
【QQ】190678908
【app後端qq羣】254659220 
【微信公衆號】 appbackend
【新浪微博】 @newjueqi
【博客】http://blog.csdn.net/newjueqi 

版權聲明:本文爲博主原創文章,未經博主容許不得轉載。數據庫

相關文章
相關標籤/搜索