移動互聯網時代LBS應用愈來愈多,交友軟件中附近的小姐姐、外賣軟件中附近的美食店鋪、打車軟件附近的車輛等等,那這種附近各類形形色色的XX是如何實現的呢git
我麼你都知道地球上的地理位置是使用二維的經緯度表示,經度範圍 (-180, 180),緯度範圍 (-90, 90),只要咱們肯定一個點的經緯度就能夠明確在地球上的位置。redis
redis3.2版本新增的一個功能就是對GEO(地理位置)的支持。編碼
地理位置大概提供了6個命令,分別爲:.net
將給定的空間元素(緯度、經度、名字)添加到指定的鍵裏面調試
GEOADD key longitude latitude member [longitude latitude member …]code
# 如添加杭州北京上海的地理位置 127.0.0.1:6379> geoadd city 120.20000 30.26667 hangzhou 116.41667 39.91667 beijing 121.47 31.23 shanghai
從鍵裏面返回全部給定位置元素的位置(經度和緯度),能夠獲取集合中任意元素的經緯度座標,能夠一次獲取多個blog
GEOPOS key member [member …]排序
127.0.0.1:6379> geopos city hangzhou beijing shanghai 1) 1) "120.15000075101852417" 2) "30.2800007575645509" 2) 1) "116.39999896287918091" 2) "39.90000009167092543" 3) 1) "121.47000163793563843" 2) "31.22999903975783553" 127.0.0.1:6379> geopos city hangzhou 1) 1) "120.15000075101852417" 2) "30.2800007575645509"
距離單位能夠是 m、km、ml、ft,分別表明米、公里、英里和尺。若是用戶沒有顯式地指定單位參數, 那麼GEODIST
默認使用米做爲單位。ci
GEODIST key member1 member2 [unit]字符串
127.0.0.1:6379> geodist city shanghai hangzhou km "164.5694" 127.0.0.1:6379> geodist city beijing hangzhou km "1122.7998"
[info]
GEODIST
命令在計算距離時會假設地球爲完美的球形, 在極限狀況下, 這一假設最大會形成 0.5% 的偏差。
使用GEORADIUSBYMEMBER
命令便可查詢附近的位置
GEORADIUSBYMEMBER key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [ASC|DESC] [COUNT count]
# 例如查找距離杭州300km之內的城市的10個城市按距離排序 127.0.0.1:6379> GEORADIUSBYMEMBER city hangzhou 300 km WITHCOORD WITHDIST WITHHASH ASC COUNT 10 1) 1) "hangzhou" 2) "0.0000" 3) (integer) 4054134257390783 4) 1) "120.15000075101852417" 2) "30.2800007575645509" 2) 1) "shanghai" 2) "164.5694" 3) (integer) 4054803462927619 4) 1) "121.47000163793563843" 2) "31.22999903975783553"
WITHDIST
: 在返回位置元素的同時, 將位置元素與中心之間的距離也一併返回。 距離的單位和用戶給定的範圍單位保持一致。WITHCOORD
: 將位置元素的經度和維度也一併返回。WITHHASH
: 以 52 位有符號整數的形式, 返回位置元素通過原始 geohash 編碼的有序集合分值。 這個選項主要用於底層應用或者調試, 實際中的做用並不大。返回的實際上是元素的經緯度通過goehash計算後的base32編碼字符串。能夠經過鏈接 http://geohash.org/${hash}中進行直接定位,它是 geohash 的標準編碼值。
127.0.0.1:6379> geohash city hangzhou 1) "wtmkq069cc0" 127.0.0.1:6379> geohash city beijing 1) "wx4fbxxfke0"
其存儲結構主要使用的是Redis的有序結構,其score是GeoHash的52位整數值
127.0.0.1:6379> ZRANGE city 0 -1 WITHSCORES 1) "hangzhou" 2) "4054134257390783" 3) "shanghai" 4) "4054803462927619" 5) "beijing" 6) "4069885360207904"
其原理比較容易理解,核心思想就是將球體轉換爲球面,區塊轉換爲一點
主要分爲三步
詳細原理解析能夠參考這邊文章GeoHash核心原理解析
目前不少數據存儲引擎都支持Geo的處理,如MongoDB、MySql、PgSql、Elasticsearch等等。