附近的人怎麼計算出來的?

來源:互聯網
上載者:User
比如: 餓了麼搜尋附近的餐廳,qq,附件的人,後端怎麼搜尋出來的呢
資料庫裡面有1w條餐廳的座標記錄,當使用者開啟附件的餐廳的時候,搜集到使用者的座標,比如針對某一個店的話,兩點的座標,計算球面距離是好計算的,問題是,有1w條店,怎麼找出來附件500米,1000米 ,2000米....

回複內容:

實現方案有很多:
1. mysql的空間資料庫:
Mysql gis 空間資料庫功能詳解學習
2. solr空間索引天然支援按經緯度索引,按位置查詢,按距離排序;
http://tech.meituan.com/solr-spatial-search.html
3. redis新版本也支援geohash了;
Redis GEO 特性簡介 一般都採用Geohash演算法,用一個字串表示二維座標,並且兩個點越接近,這兩個Geohash的字串首碼相同的位元就越多(這句話可能不太嚴謹),這樣查詢的效率就會高很多。
Geohash 一般都是Geohash演算法,不過這個演算法的問題是可能很近的但是分在不同格子裡就撈不到了,會選取周圍8個格子來計算,另外就是這個演算法不好按照範圍搜,比如附近xx米。

第二種演算法是附近xx米是一個圓,計算出圓的外接正方形的經緯度範圍,就是當前位置為中心邊長是xx*2的一個正方形的經緯度範圍,然後在資料庫裡通過大於小於條件來撈落入正方形內的POI(店鋪),然後,要嚴謹的話把四個角邊緣的資料剔除(通過計算距離就可以,這時候資料量很少,不需要全表掃描計算,就很快了),精度要求不高的話,不需要剔除直接就能用了,這種做法只要把資料庫中經度和緯度兩個欄位做索引,應付一般資料量足夠了,做法也簡單直白, 題主只有1W條資料,這種方法妥妥的。

第三種就是利用資料庫的空間索引來做,貌似MySQL本身就支援的,用R Tree實現的,效率更高。1、把經緯度換成整數。
2、不算圓型算方型,避開乘方根號運算,直接 between 經度 and between 緯度。
3、確定了這個方內的人後,再進行乘方(但不開根號)排序就行。尋找 1000 米以內的人,資料庫設計和查詢如何?這個功能? - 資料庫設計快使用開源工具,橫橫哈嘿,快開啟原始碼,嘿嘿哈橫。用mongodb,內建這類演算法大家的座標儲存起來,然後把你的座標與大家的座標求距離就行了。geohash | rtree方案:geohash + redis set

時間複雜度:O(1)

空間複雜度:O(n),挺省的,因為redis的key很短,參考下表:
  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.