【12日目】Titanium Mobile で GeoHash を取り扱う

この記事は @astronaughts (通称・あすとろなんとか) さん主催の Titanium Mobile Advent Calendar 2012 向けに書いています。 Early Advent Calendar とは異なり小ネタ以外もご自由にとのことなので、参加したい方は ATND へ !

さて、どうやら Early Advent Calendar によって参加者がネタを出し尽くした結果、参加者欠乏症に陥っている今年の Titanium Mobile Advent Calendar ですが、せっかくなので12日目も担当してみることにしました。誰かー(´;ω;`)

さて、今回は Titanium Mobile で GeoHash を取り扱ってみようと思います。

GeoHash ?

GeoHash ってご存じですか ? 「じおはっしゅ」というのですが、 Wikipedia おじいちゃんが詳しいです。緯度経度からハッシュ値を計算して示すことができる代物で、特徴は文字列の末尾を削っていくと、段々と範囲が広がっていくのです。

範囲が広がるというよりは、精度が落ちていくという方が正しいと思いますが、便利なアルゴリズムに、計算済みのハッシュ値から近傍のハッシュ値を得られるというものがあり、位置情報を取り扱う何かを考えてみるときに役立ちそうですね。

geohash-commonjs

ちょっと前に geohash-commonjs というものを GitHub に載せました。先駆者の Python / JavaScript による実装が MIT ライセンスだったので参考にして JSLint が通る形かつ、 CommonJS / HTML DOM 両対応に直してみたものです。

TiGeoHash

今回作ったのは、現在作っているサービスの実装実験も兼ねてみたものです。 TiGeoHash という名前で GitHub に載せてあります。名前の通り Titanium Mobile 専用で、 CommonJS ライブラリ化してます。

geohash-commonjs を使って、もうちょっと分かりやすいインターフェースで Titanium から使えるようにしただけですが、ラッパーメソッドとして今の位置情報から GeoHash を計算するための getCurrentGeoHash が実装済みです。

他にも緯度経度情報から GeoHash を計算したり、戻したり、近傍の GeoHash を取得したりするメソッドがあります。

ただし、 iOS でしか確認してないのと、 Android は Ti.Geolocation.getCurrentPosition メソッドの結果をキャッシュしてしまう不具合が (Ti 自体に) あるので、そのあたりの分岐が必要ですが、まだ何もしてません。

GitHub に載せてあるものは、 GeoHash はどんな感じなのかを示すためのデモアプリを兼ねてます。実際に動かしてみるか、スクリーンショットをご覧あれ。

何ができるかを考えてみると、近傍にいる誰かを発見することができるでしょう。自分の位置情報から GeoHash を割り出し、近傍のハッシュ値を計算します。近くにいる誰かがまた同様に GeoHash と近傍のハッシュ値を計算し、双方のハッシュ値の中に同じものが含まれていれば、お互いは近くにいるということになります。

サーバサイドは Redis を使ってキーの存命時間を10秒ぐらいにしておけば、比較的リアルタイムに近い時間で近くにいる人を発見できる … みたいなことが考えられます。 … 今作っているものは、まさにそんな感じのものなのです。

Web API との連携をかなり得意とする Titanium ですが、 GPS やカメラももちろんバッチリ使えます。スマートフォンは持ち歩くものですから、実世界とつなげた何かを考えてみると、さらに面白いことがたくさんできそうですね (・∀・)