geohash美團附近酒店搜尋 技術方案

2021-10-07 11:37:19 字數 2906 閱讀 8239

自redis 3.2開始,redis基於geohash和zset提供了地理位置相關功能。

什麼是geohash

geohash是一種位址編碼,它能把二維的經緯度編碼成一維的字串。比如,世界之窗的編碼是ws101xy1rp0。

redis geo模組包含了以下6個命令:

geoadd

將給定的位置物件(緯度、經度、名字)新增到指定的key;

39.100.196.99:6379> geoadd hotel 113.9807127428 22.5428248089 "世界之窗" 113.9832042690 22.5408496326 "南山威尼斯酒店" 114.0684865267 22.5412294122 "福田喜來登酒店" 114.3135524539 22.5999265998 "大梅沙海景酒店" 113.9349465491 22.5305488659 "南山新年酒店" 114.0926367279 22.5497917634 "深圳華強廣場酒店"

639.100.196.99:6379> zrange hotel 0 -1

南山新年酒店

世界之窗

南山威尼斯酒店

福田喜來登酒店

深圳華強廣場酒店

大梅沙海景酒店

注:

這裡我們採用的是中文儲存,如果出現了亂碼,redis命令的登入命令加上 --raw

例如: ./redis-cli --raw

geopos

從key裡面返回所有給定位置物件的位置(經度和緯度);

39.100.196.99:6379> geopos hotel "世界之窗"

113.98071080446243286

22.54282525199023013

geohash:

返回乙個或多個位置物件的geohash表示;

39.100.196.99:6379> geohash hotel "世界之窗"

ws101xy1rp0

geodist key member1 member2 [unit]

返回兩個給定位置之間的距離;

指定單位的引數 unit 必須是以下單位的其中乙個:

– m 表示單位為公尺。

– km 表示單位為千公尺。

– mi 表示單位為英里。

– ft 表示單位為英呎。

39.100.196.99:6379> geodist hotel "世界之窗"  "南山威尼斯酒店" m

337.4887

georadius key longitude latitude radius m|km|ft|mi [withcoord] [withdist] [withhash] [count count] [asc|desc] [store key] [storedist key]

給定乙個經緯度,然後以半徑為中心,計算出半徑內的資料。

39.100.196.99:6379> georadius hotel 113.9410499639 22.5461508801 10 km withdist withcoord count 10

南山新年酒店

1.8451

113.93494695425033569

22.53054959741555052

世界之窗

4.0910

113.98071080446243286

22.54282525199023013

南山威尼斯酒店

4.3704

113.98320525884628296

22.54085070420710224

– withdist: 在返回位置元素的同時, 將位置元素與中心之間的距離也一併返回。 距離的單位和使用者給定的範圍單位保持一致。

– withcoord: 將位置元素的經度和維度也一併返回。

– withhash: 以 52 位有符號整數的形式, 返回位置元素經過原始 geohash 編碼的有序集合分值。 這個選項主要用於底層應用或者除錯, 實際中的作用並不大。

– asc、desc 排序方式,按照距離的 公升序、降序排列

– store key1 把結果存入key1,zset格式,以座標hash為score

– storedist key2 把結果存入key2,zset格式,以距離為score

georadiusbymember key longitude latitude radius m|km|ft|mi [withcoord] [withdist] [withhash] [count count] [asc|desc] [store key] [storedist key]

georadiusbymember 和 georadius 一樣的功能,區別在於,georadius是以經緯度去查詢,而georadiusbymember是以當前集合中的某個member元素來查詢

39.100.196.99:6379> georadiusbymember hotel "世界之窗" 10 km withdist withcoord count 10

世界之窗

0.0000

113.98071080446243286

22.54282525199023013

南山威尼斯酒店

0.3375

113.98320525884628296

22.54085070420710224

南山新年酒店

4.8957

113.93494695425033569

22.53054959741555052

福田喜來登酒店

9.0190

114.06848877668380737

22.54122837765984144

geohash的應用 附近位址搜尋

url 簡單使用 geohash,redis,bottle,python geohash 來實現 restful api的地理位置附近人搜素 依賴的redis封裝class import redis class redis object pool none r none def init self,...

GeoHash演算法獲取附近店鋪和距離

geohash演算法將二維經緯度座標直接轉換成字串,每乙個字串代表乙個矩形區域,也就是說,這個矩形區域內所有的點 經緯度座標 都共享相同的geohash字串,字串的長度越大,矩形的區域就越小,經度也就越高。字串相似的表示距離相近,這樣可以利用字串的字首匹配來查詢附近的poi資訊。地球緯度區間是 90...

利用GeoHash優化查詢附近門店功能

有乙個營銷砍價活動,當使用者報名完成後,需要選擇去領取活動商品的門店,可選的門店列表需要按照距離當前使用者經緯度最近的3家門店進行距離排序,假設候選門店有10000家門店。具體demo如下圖 2.1 思路 2.2 geohash實踐 2.2.1 活動繫結門店表增加geohash欄位 id 自增,bi...