以前、Redisで位置情報を扱うコマンドという記事で、Redis3.2で追加された位置情報を扱うコマンドのいくつかの使い方を纏めました。その時はふれなかった
の2つのコマンドについて調べてみたので纏めておきます。
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"
中心に東京駅(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
オプションを指定して実行してみる。
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
オプションを指定して実行してみる。
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
オプションを指定して実行してみる。
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 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コマンドについて調べてみました。