mongoDBのGeospatial indexについて調べた
ちょっと前までは、自分の中でNoSQLといえばCassandraと思い込んでいた(勉強会に行ったり、コードリーディングに挑戦したりもしたので思い入れがある)けれど、11月のNoSQL Afternoon以来、俄然MongoDBに興味が湧いている。
foresquareを始め様々な企業での採用実績、クエリの自由度の高さ、doryokujinさんをはじめとした日本のユーザ会の活発さ、とメリットは色々あるのだけれど、ジオ系のサービスをしている会社にいる人間として一番魅力を感じているのは、Geospatial indexの存在。
まだ、クラスタでは動かしたことは無いのだけれど、このインデックスを保持しながらスケールアウトできるならば、魅力的すぎる!!
ということで、チュートリアル(http://www.mongodb.org/display/DOCS/Geospatial+Indexing)みながら実行してみた。その中で、疑問に思ったのは以下の2点
- $maxDistance で指定している引数の単位って何?メートル??
- Spherical Modelで使われるradians,radiusって何??
しかし、活発な日本コミュニティを有するだけあって、ちょこっとググると日本語資料が出てきました。
- -
「第1回 MongoDB JP & CouchDB JP 合同勉強会 in Tokyo」でMongoDB 地理空間インデックスについてLTしました
http://d.hatena.ne.jp/ja9/20101213/1292231352
- -
資料には、
- $maxDistance で指定している引数の単位って何?メートル??
-> 度。
- Spherical Modelで使われるradians,radiusって何??
-> 1ラジアン = 6371km
とあった。
前者に関しては、確かに$maxDistance : 0.1 とかでもがんがんデータが引っかかるあたりから薄々そんな気はしていたので、おお、やっぱりそうかという感じ。(度数で距離指定できる機能って、、、と思わなくもない。)
ただ、後者に関しては、wikipedia(http://ja.wikipedia.org/wiki/%E3%83%A9%E3%82%B8%E3%82%A2%E3%83%B3)を引いてみると、
とある。何か違う??
確かに戻ってきた値に6371kmを掛けることで、距離は求まるけど、何か違うような。うーむ。。
さらに他のサイトを見てみても、ラジアンってのは角度の単位の模様。そして、さらに色々調べて、このサイトに辿りついた!!
- -
緯度経度より距離を求める方法・備忘録 | 地球は丸い!
http://www.kiteretsu-so.com/archives/1183
- -
こてこての文系あがりとしては、中々理解しづらい部分が多いけれど、この中に
円弧の長さ = 半径 ×円弧 の角度をラジアンに変換した値
という大きなヒントになりそうな言葉を見つけた。
円弧の長さ -> 2点間の距離
地球の半径 -> 約6371km (赤道付近。地球は完全な球体ではないため、厳密には特定できない)
さらに、mongoDBから返ってくる値に ×6371km すると、距離が求まるってことは、
円弧の長さ (-> 2点間の距離) = 半径(-> 約6371km) ×円弧 の角度をラジアンに変換した値 (-> MongoDBが返す値)
ってことになるのかな。
なんとなく全部つながったような気がするけれど、緯度経度間の距離の計算方法が全部は理解できていないので、何とも言えない。
イメージしやすくしてこの問題を完全に理解するためと、世界を常に意識するためにも(後付け)、軽いおしゃれのため(さらに後付け)に、席におけるサイズの地球儀を週末に買おうと思ったとさ。めでたし、めでたし。