Redisで位置情報を扱うコマンド

Redis3.2で位置情報を扱うコマンドが追加されたようです。

の6つあります。

GEOADD、GEODIST、GEOHASH、GEOPOSドキュメントを眺めつつ振る舞いを確認し、纏めておきます。


GEOADD

書式

GEOADD key longitude latitude member [longitude latitude member ...]

概要

指定したキーに対して、指定した地理情報(緯度、経度、名称)を追加するコマンド。

データは、後にGEORADIUSGEORAIUSBYMEMBERコマンドなど半径によるクエリで使用できるように、 キーに対してsorted setとして格納される。

コマンドの引数は、標準的なx, y形式で受けるため、経度、緯度の順で指定する。

(このコマンドで)インデックスできる座標について、極に近いエリアはインデックスできない、という制限がある。

EPSG:900913 / EPSG:3785 / OSGEO:41001 で規定されているように、正確には、

  • 妥当な経度は、-180°〜180°
  • 妥当な緯度は、-85.05112878°〜85.05112878°

に制限される。

ユーザが上記の上記の範囲の外側の座標をインデックスしようとした場合、このコマンドはエラーを報告する。

要素を削除するためにZREMコマンドが利用できるため、GEODELコマンドは存在しない。Geoインデックスはただのsorted setである。

使用例

例えば、東京タワーなどのタワーをあるキーに纏めて登録しておくと、GEODSTコマンドでタワー間の距離を取得したり、ある座標から指定した半径内に存在するタワーを取得できたり、ということができそう。

次のタワーのリストを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"

Sorted Setとして登録されるので、ZRANGEコマンドで登録されていることが確認できる。

GEODIST

書式

GEODIST key member1 member2 [unit]

概要

指定したキーに属する2つのメンバ間の距離を取得するコマンド。

指定した2つのメンバのいずれか、または両方が存在しない場合はNULLを返す。

コマンドの引数として、取得する距離の単位を指定でき、次の4つのうちのいずれかである必要がある。

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

距離の計算は、地球が完全な球体と仮定して計算しているので、 場所によっては最大で0.5%の誤差が生じうる。

使用例

上述のタワーの例で試してみる。

東京タワーとスカイツリーの距離をkmで求めると、

127.0.0.1:6379> GEODIST towers "Tokyo Tower" "SkyTree" km
"8.2159"

というように距離が取得できる。

GEOHASH

書式

GEOHASH key member [member ...]

概要

指定したキーに属する1つ、または複数のメンバのGeohashを取得するコマンド。

Geohashは、Wikipediaのジオハッシュに詳しく書いてある。

使用例

上述のタワーの例で試してみる。

東京タワーに対するGeohashを取得してみる。

127.0.0.1:6379> GEOHASH towers "Tokyo Tower"
1) "xn76ggrw330"

また、東京タワー、スカイツリーに対するGeohashを求めると、

127.0.0.1:6379> GEOHASH towers "Tokyo Tower" "SkyTree"
1) "xn76ggrw330"
2) "xn77jkz41b0"

となる。

GEOPOS

書式

GEOPOS key member [member ...]

概要

指定したキーに属するメンバの緯度・経度を取得するコマンド。

メンバは複数指定することもできる。

指定したメンバが登録されていない場合は、NULLが返る。

使用例

上述のタワーの例で試してみる。

東京タワーの緯度・経度を取得してみると、

127.0.0.1:6379> GEOPOS towers "Tokyo Tower"
1) 1) "139.74546343088150024"
   2) "35.65858273827775093"

のように登録した値が取得できる。

メンバを複数指定した場合は、

127.0.0.1:6379> GEOPOS towers "Tokyo Tower" "SkyTree"
1) 1) "139.74546343088150024"
   2) "35.65858273827775093"
2) 1) "139.81071621179580688"
   2) "35.71003250837001275"

のようになる。


以上、Redis3.2で追加された地理情報系コマンドを試してみました。