天天看點

【Redis筆記】Redis GEO

将指定的地理空間位置(緯度、經度、名稱)添加到指定的

key

中。這些資料将會存儲到

sorted set

這樣的目的是為了友善使用GEORADIUS或者GEORADIUSBYMEMBER指令對資料進行半徑查詢等操作。

該指令以采用标準格式的參數x,y,是以經度必須在緯度之前。這些坐标的限制是可以被編入索引的,區域面積可以很接近極點但是不能索引。具體的限制,由EPSG:900913 / EPSG:3785 / OSGEO:41001 規定如下:

  • 有效的經度從-180度到180度。
  • 有效的緯度從-85.05112878度到85.05112878度。

當坐标位置超出上述指定範圍時,該指令将會傳回一個錯誤。

它是如何工作的?

sorted set使用一種稱為Geohash的技術進行填充。經度和緯度的位是交錯的,以形成一個獨特的52位整數. 我們知道,一個sorted set 的double score可以代表一個52位的整數,而不會失去精度。

這種格式允許半徑查詢檢查的1 + 8個領域需要覆寫整個半徑,并丢棄元素以外的半徑。通過計算該區域的範圍,通過計算所涵蓋的範圍,從不太重要的部分的排序集的得分,并計算得分範圍為每個區域的sorted set中的查詢。

使用什麼樣的地球模型(Earth model)?

這隻是假設地球是一個球體,因為使用的距離公式是Haversine公式。這個公式僅适用于地球,而不是一個完美的球體。當在社交網站和其他大多數需要查詢半徑的應用中使用時,這些偏差都不算問題。但是,在最壞的情況下的偏差可能是0.5%,是以一些地理位置很關鍵的應用還是需要謹慎考慮。

傳回值

integer-reply, 具體的:

  • 添加到sorted set元素的數目,但不包括已更新score的元素。

例子

redis> GEOADD Sicily 13.361389 38.115556 "Palermo" 15.087269 37.502669 "Catania"
(integer) 2
redis> GEODIST Sicily Palermo Catania
"166274.15156960039"
redis> GEORADIUS Sicily 15 37 100 km
1) "Catania"
redis> GEORADIUS Sicily 15 37 200 km
1) "Palermo"
2) "Catania"
redis> 
           

相關指令

  • GEOADD
  • GEODIST
  • GEOHASH
  • GEOPOS
  • GEORADIUS
  • GEORADIUSBYMEMBER

繼續閱讀