這100萬的數據表裡記錄著商戶的經緯度信息, 經度欄位為lan double類型, 緯度為lat double。


現在Mongodb也支持空間查詢 比如語句$near 關鍵字。可以把空間坐標和商戶信息放到裡面。進行查詢。
題主問的問題是經典的knn問題,建議直接搜索knn相關演算法。具體到空間查詢可以建立空間索引,目前有的資料庫如Mongodb是內置了空間索引的。


已有的幾個回答中的方案成本都太高了。一個成本比較低的方案是建一個Geohash欄位,生成Geohash時,經緯度的精度要高。然後按照查找附近50條的這個需求,調整查詢hash的模糊匹配長度。這樣成本較低,比較容易實施。

可以試一試地圖資源管理平台將100萬條數據導入地圖上,選中用戶的那個點,附近的商戶信息可視化的展示在地圖上了,誰近誰遠一目了然。如果不想要可視化編輯的過程也可以通過GIS空間運算的形式用編碼來實現


MySQL 空間座標查詢 MySQL :: MySQL 5.5 Reference Manual :: 12.17 Spatial Extensions
使用MySQL的空間特性吧~~~不過只有MyISAM引擎支持,你可以設置為索引就可以改善性能~~~再去對應的數據...:1.表A:UID,空間信息欄位;存儲引擎為:MyISAM2.表B:UID,用戶信息欄位;存儲引擎為:InnoDB;


mongodb的2d geospatial indexes的概念和用法舉例 Geospatial Queries with 2d Indexes
geo hash 具體谷歌吧
如果你要自己實現,可以試試KDTree, RTree, QuadTree之類的演算法。

最好需要使用spatial database來快速高頻率查詢

通常geom列存儲地理信息 lon,lat ,crs

推薦 postgis

查詢sql為:

select a.name from (Select a.name,a.geom from tbl_商家位置)as a where ST_Distance(dian_A,a.geom,TRUE) &< 50

可以通過建立spatial indexes 顯著提高查詢速度 通常是rtree

但是 大多數情況下 都是以街道為主的網格查詢 這就稍微複雜 需要pg routing

https://docs.pgrouting.org/2.0/en/doc/index.html

其詳細文檔

這個問題是最簡單的 網格查詢

使用pgr_drivingDistance 一行就能得到結果

網格查詢一般是都是基於dijastra優化演算法 個別演算法調整會在複雜情況下結果不同


反地理編碼,比對,提取
推薦閱讀:
相关文章