Redisで緯度・経度座標データを簡単に扱う方法
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に関する詳しい情報は、過去の記事を検索するか、以下の記事を引き続きご覧ください。
関連
-
JAVAでRedisの5つのデータ構造を利用する方法
-
Redisによる分散ロック(setnx, getset, incr)の実装とタイムアウトの扱い方
-
Redisの重複排除の3つの手法のまとめ
-
SpringBootプロジェクトにおけるRedis。包括的なアプリケーション
-
Redisのkeysコマンドの遅さ
-
インタビューFAQです。Redisキャッシュとデータベース間のデータ整合性を確保する方法
-
Redisデータ永続化技術解説
-
Redisの高同期スパイクを防ぐために、ソースコードソリューションを売られすぎ
-
シングルスレッドのredisがなぜ速いのかの紹介
-
Redisの分散ロックについて簡単に説明します
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Redisクラスタのマスターノードとスレーブノードを縮小する詳細チュートリアル
-
redisクラスタ構築プロセス (非常に詳細、初心者向け)
-
redis の RedissonLock が待ちロックを実装する方法
-
redisプラグインbloom-filterをcentosにインストールする方法
-
redisでluaスクリプトを使用するためのチュートリアル
-
Redisにおけるビットマップの説明
-
redis クラスタの実装は同じプレフィックスを持つキーをクリーンアップします。
-
Redis 3つのクラスターモードの説明
-
Redisトランザクション処理の使用方法
-
RedisTemplateでRedisを操作する、この記事で十分です(a)