1. ホーム
  2. データベース
  3. レディス

Redisで緯度・経度座標データを簡単に扱う方法

2022-01-15 18:58:32

Redis 3.2以降では、地理的な座標データの管理をサポートしています。指定された座標要素(緯度、経度、名前)が指定されたキーに追加されます。データは順序集合として保存され、GEORADIUSを用いた2つの座標点間の距離計算や、GEORADIUSおよびGEORADIUSBYMEMBERを用いた特定の座標半径内のデータの問い合わせに使用することができる。以下に、よく使われるコマンドを簡単に紹介します。

1. GEOADD

指定されたキーに座標情報を付加する。

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

longitude: 座標点の経度、有効な値 [ -180, 180 ]。

latitude: 座標点の緯度、有効な値 [ -85.05112878, 85.05112878 ]。

127.0.0.1:6379> geoadd parks 116.300892 40.009462 yuanmingyuan
(integer) 1
127.0.0.1:6379> geoadd parks 116.188797 39.990132 xiangshan 116.255916 40.030233 baiwangshan
(integer) 2
 
127.0.0.1:6379> GEOADD parks 110 89.9 nanji
(error) ERR invalid longitude,latitude pair 110.000000,89.900000


ご覧の通り、GEOADDは一度に1つ以上の場所の追加をサポートしており、それぞれの場所には精度の高い次元と名前が必要です。また、法的な緯度と経度(次元89.9の南寺)以外の座標を追加しようとするとエラーが報告されます。

2. GEOPOS

GEOPOSコマンドは、地名から対応する緯度・経度を返します。セット内に存在しない場合は、返されるデータは空です。

127.0.0.1:6379> GEOPOS parks xiangshan baiwangshan nanji
1) 1) "116.18879646062850952"
   2) "39.99013224137585354"
2) 1) "116.2559160590171814"
   2) "40.03023406483775659"
3) (nil)


3. ジオディスト

GEODIST関数は、指定された2つの位置の間の距離を返します。2 つの位置のうち 1 つが存在しない場合は、null を返します。

GEODIST key member1 member2 [ユニット]。

正規のユニット値

<テーブル 単位です。 m(デフォルト値) km ミ フィート 説明 米 キロメーター マイル フィート

127.0.0.1:6379> GEODIST parks xiangshan baiwangshan
"7251.9492"
127.0.0.1:6379> GEODIST parks xiangshan baiwangshan km
"7.2519"
127.0.0.1:6379> GEODIST parks xiangshan nanji km
(nil)


4. ゲオラディウス

与えられた緯度と経度を中心として、中心からの距離が与えられた最大距離を超えない位置要素をキーに含むすべての位置要素を返します。

GEORADIUS キー 経度 緯度 半径 m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key] となります。

緯度、経度、単位のパラメータは、前のコマンドと同じです。その他のオプション・パラメータについては、以下のとおりです。

  • WITHCOORD:座標データの緯度・経度をまとめて返す
  • WITHDIST: 座標データから現在の座標までの距離をまとめて返す
  • WITHHASH: 元のジオハッシュでエンコードされた位置要素の順序付きセットを52ビットの符号付き整数として返す
  • COUNT: 指定されたエントリ数のデータを返します。
  • ASC|DESC: 中心位置に応じて、nearからfar、またはfarからnearへの位置要素を返す
  • STORE と STOREDIST: 返された結果を順序付きセットに保存します。STORE はハッシュ値、STOREDIST は距離を保存するという違いがあります。

追加情報を返す

127.0.0.1:6379> GEORADIUS parks 116.29248 40.048107 20 km
1) "xiangshan"
2) "baiwangshan"
3) "yuanmingyuan"
127.0.0.1:6379> GEORADIUS parks 116.29248 40.048107 20 km WITHCOORD WITHDIST WITHHASH
1) 1) "xiangshan"
   2) "10.9353"
   3) (integer) 4069878528493207
   4) 1) "116.18879646062850952"
      2) "39.99013224137585354"
2) 1) "baiwangshan"
   2) "3.6941"
   3) (integer) 4069880373231506
   4) 1) "116.2559160590171814"
      2) "40.03023406483775659"
3) 1) "yuanmingyuan"
   2) "4.3576"
   3) (integer) 4069880708898691
   4) 1) "116.30089133977890015"
      2) "40.00946202493697257"


データバーの本数とソートを指定する

127.0.0.1:6379> GEORADIUS parks 116.29248 40.048107 20 km WITHDIST ASC
1) 1) "baiwangshan"
   2) "3.6941"
2) 1) "yuanmingyuan"
   2) "4.3576"
3) 1) "xiangshan"
   2) "10.9353"
127.0.0.1:6379> GEORADIUS parks 116.29248 40.048107 20 km WITHDIST DESC
1) 1) "xiangshan"
   2) "10.9353"
2) 1) "yuanmingyuan"
   2) "4.3576"
3) 1) "baiwangshan"
   2) "3.6941"
127.0.0.1:6379> GEORADIUS parks 116.29248 40.048107 20 km WITHDIST ASC COUNT 2
1) 1) "baiwangshan"
   2) "3.6941"
2) 1) "yuanmingyuan"
   2) "4.3576"


結果を新しい zset、ハッシュ値、または距離に保存します。

127.0.0.1:6379> GEORADIUS parks 116.29248 40.048107 20 km ASC COUNT 2 STORE store_20km
(integer) 2
127.0.0.1:6379> GEORADIUS parks 116.29248 40.048107 20 km ASC COUNT 2 STOREDIST storedist_20km
(integer) 2
127.0.0.1:6379> ZRANGE store_20km 0 -1 WITHSCORES
1) "baiwangshan"
2) "4069880373231506"
3) "yuanmingyuan"
4) "4069880708898691"
127.0.0.1:6379> ZRANGE storedist_20km 0 -1 WITHSCORES
1) "baiwangshan"
2) "3.6941190849982757"
3) "yuanmingyuan"
4) "4.3576262236174665"

5. georadiusbymember

このコマンドはGEORADIUSと同様に指定された範囲内の要素を検索しますが、GEORADIUSのように入力された経度と緯度から中心点を決定するのではなく、与えられたlocation要素から中心点を決定するコマンドです。

GEORADIUSBYMEMBER parks yuanmingyuan 5 km ASC
1) "yuanmingyuan"
2) "baiwangshan"

圓明園から半径5km以内にある公園をチェックする。

redisで緯度経度座標データを簡単に扱う方法は、この記事が全てです。redisに関する詳しい情報は、過去の記事を検索するか、以下の記事を引き続きご覧ください。