Redisで位置情報を扱うコマンド(GEORADIUS, GEORADIUSBYMEMBER)

以前、Redisで位置情報を扱うコマンドという記事で、Redis3.2で追加された位置情報を扱うコマンドのいくつかの使い方を纏めました。その時はふれなかった

の2つのコマンドについて調べてみたので纏めておきます。


GEORADIUS

書式

GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]

概要

GEOADDコマンドによって登録された位置情報のソート済みセットについて、指定した中心座標(longitude, latitude)から指定した半径(radius)内に含まれるメンバーを配列として返すコマンド。

半径には、

  • m(メートル)
  • km(キロメートル)
  • mi(マイル)
  • ft(フィート)

の単位を指定することができる。

コマンドにオプションをつけると、応答に次の追加情報を含めることができる。

  • WITHDIST 応答に距離を含める。
  • WITHCOORD 応答に座標を含める。
  • WITHHASH 応答にソート済みセットのスコアのRawジオハッシュエンコード値を含める。

このコマンドの結果はデフォルトではソートされていない。オプションにASC/DESCを付与することでソート済みの結果を得ることができる。

  • ASC 結果を中心から近い順にソートする。
  • DESC 結果を中心から遠い順にソートする。

このコマンドはデフォルトで、マッチした全ての情報を返す。COUNT <count>オプションを付与することで、応答件数を絞ることができる。

使用例

準備

(前回と同様に)タワーのリストをGEOADDコマンドでtowersに登録する。

No タワー名 住所 緯度 経度
1 東京タワー 東京都港区芝公園4丁目2-8 35.658582 139.745464
2 スカイツリー 東京都墨田区押上1丁目1-2 35.710033 139.810716
3 横浜マリンタワー 神奈川県横浜市中区山下町15 35.443938 139.650941
4 千葉ポートタワー 千葉県千葉市中央区中央港1丁目 35.602003 140.102713
127.0.0.1:6379> GEOADD towers 139.745464 35.658582 "Tokyo Tower"
(integer) 1
127.0.0.1:6379> GEOADD towers 139.810716 35.710033 "SkyTree"
(integer) 1
127.0.0.1:6379> GEOADD towers 139.650941 35.443938 "Yokohama Marine Tower"
(integer) 1
127.0.0.1:6379> GEOADD towers 140.102713 35.602003 "Chiba Port Tower"
(integer) 1
127.0.0.1:6379> ZRANGE towers 0 -1
1) "Yokohama Marine Tower"
2) "Tokyo Tower"
3) "SkyTree"
4) "Chiba Port Tower"

GEORADIUSコマンドを実行

中心に東京駅(139.766247, 35.681298)を指定してGEORADIUSコマンドを実行してみる。

127.0.0.1:6379> GEORADIUS towers 139.766247 35.681298 5 km ASC
1) "Tokyo Tower"
127.0.0.1:6379> GEORADIUS towers 139.766247 35.681298 10 km ASC
1) "Tokyo Tower"
2) "SkyTree"

東京駅から半径5kmを指定すると東京タワーが、半径10kmを指定すると東京タワーとスカイツリーがヒットする。

WITHDISTオプション

WITHDISTオプションを指定して実行してみる。

127.0.0.1:6379> GEORADIUS towers 139.766247 35.681298 5 km WITHDIST ASC
1) 1) "Tokyo Tower"
   2) "3.1480"
127.0.0.1:6379> GEORADIUS towers 139.766247 35.681298 10 km WITHDIST ASC
1) 1) "Tokyo Tower"
   2) "3.1480"
2) 1) "SkyTree"
   2) "5.1332"

距離が応答される。

WITHCOORDオプション

WITHCOORDオプションを指定して実行してみる。

127.0.0.1:6379> GEORADIUS towers 139.766247 35.681298 5 km WITHCOORD ASC
1) 1) "Tokyo Tower"
   2) 1) "139.74546343088150024"
      2) "35.65858273827775093"
127.0.0.1:6379> GEORADIUS towers 139.766247 35.681298 10 km WITHCOORD ASC
1) 1) "Tokyo Tower"
   2) 1) "139.74546343088150024"
      2) "35.65858273827775093"
2) 1) "SkyTree"
   2) 1) "139.81071621179580688"
      2) "35.71003250837001275"

座標が応答される。

WITHHASHオプション

WITHHASHオプションを指定して実行してみる。

127.0.0.1:6379> GEORADIUS towers 139.766247 35.681298 5 km WITHHASH ASC
1) 1) "Tokyo Tower"
   2) (integer) 4171231149134217
127.0.0.1:6379> GEORADIUS towers 139.766247 35.681298 10 km WITHHASH ASC
1) 1) "Tokyo Tower"
   2) (integer) 4171231149134217
2) 1) "SkyTree"
   2) (integer) 4171233011319277

スコアが応答される。

GEORADIUSBYMEMBER

書式

GEORADIUSBYMEMBER key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]

概要

GEORADIUSコマンドが、中心の座標を指定するのに対して、GEORADIUSBYMEMBERコマンドは、中心にkey内のメンバーを指定する。

使用例

上述のtowersキーについて、そのメンバであるTokyo Towerから指定した距離に存在するタワーを求める。

127.0.0.1:6379> GEORADIUSBYMEMBER towers "Tokyo Tower" 10 km ASC
1) "Tokyo Tower"
2) "SkyTree"

のように、GEORADIUSコマンドと同様の結果が得られる。


以上、RedisのGEORADIUS、GEORADIUSBYMEMBERコマンドについて調べてみました。