読者です 読者をやめる 読者になる 読者になる

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)を引いてみると、

ラジアン(radian, 記号:rad)は、国際単位系(SI)における角度(平面角)の単位である。

とある。何か違う??
確かに戻ってきた値に6371kmを掛けることで、距離は求まるけど、何か違うような。うーむ。。


さらに他のサイトを見てみても、ラジアンってのは角度の単位の模様。そして、さらに色々調べて、このサイトに辿りついた!!

  • -

緯度経度より距離を求める方法・備忘録 | 地球は丸い!
http://www.kiteretsu-so.com/archives/1183

  • -

こてこての文系あがりとしては、中々理解しづらい部分が多いけれど、この中に

円弧の長さ = 半径 ×円弧 の角度をラジアンに変換した値

という大きなヒントになりそうな言葉を見つけた。
円弧の長さ -> 2点間の距離
地球の半径 -> 約6371km (赤道付近。地球は完全な球体ではないため、厳密には特定できない)
さらに、mongoDBから返ってくる値に ×6371km すると、距離が求まるってことは、

円弧の長さ (-> 2点間の距離) = 半径(-> 約6371km) ×円弧 の角度をラジアンに変換した値 (-> MongoDBが返す値)

ってことになるのかな。

なんとなく全部つながったような気がするけれど、緯度経度間の距離の計算方法が全部は理解できていないので、何とも言えない。
イメージしやすくしてこの問題を完全に理解するためと、世界を常に意識するためにも(後付け)、軽いおしゃれのため(さらに後付け)に、席におけるサイズの地球儀を週末に買おうと思ったとさ。めでたし、めでたし。