こんにちは。カヤック技術部の杉山です。
主にクライアントワークでサービスを開発しています。
今回は、とある「歩いていると付近の情報が通知されるアプリ」に関して書きます。
「歩いていると付近の情報が通知されるアプリ」のサービス概要
今回は、サーバーアプリケーションの実装に関して解説してみます。
利用技術
主な処理
- ユーザーがアプリ内のMapをタップし、緯度経度とともに、画像、テキストを保存する
- アプリがバックグラウンド状態の時に、近くに保存した情報があれば、通知を表示する
- 他のユーザーが保存した情報に対して、コメントを行う
それぞれの内容
ユーザーがアプリ内のMapをタップし、緯度経度とともに、画像、テキストを保存する
サーバーはアプリから緯度経度を受け取とり、それをGeohashの値に変換し保存しています。
Geohashとは、地図を細かい矩形に分割し、一つの文字列として表すことの出来るアルゴリズムです。
Geohashの文字列が長ければ狭い領域、文字列が短ければ広い領域を表します。つまり、文字列が長いほど、精度が高くなります。
詳しくはこちら
Geohashの欠点は、緯度経度が矩形内に入っていることがわかっても、矩形内のどこなのかはわからないという点と、1文字減らすと、精度が一気に下がってしまうという点です。
文字数 |
南北 |
東西 |
6 |
609.08m |
988.77m |
7 |
152.27m |
123.60m |
8 |
19.03m |
30.90m |
9 |
4.76m |
3.86m |
10 |
0.59m |
0.97m |
Geohashの利点は、文字列検索さえできれば、どんなデータベースからでも利用できる点です。
Geohashの値を生成する、Ruby Gem もいくつか公開されています。
アプリがバックグラウンド状態の時に、近くに保存した情報があれば、通知を表示する
アプリがバックグラウンドの時に、基地局の切り替わりによる座標変更イベントを利用し、WebAPIがスマートフォンの緯度経度を受け取ります。
サーバーは、受け取った緯度経度を元に、Geohashの値を生成し、文字列検索することで、付近のデータを探します。
このとき、同一の矩形内かどうかだけではなく、付近の矩形を合わせた9ブロック分、OR検索する必要があります。これは、矩形内の端に実際の座標が存在した場合、近くにあっても検索から漏れてしまうためです。
select した結果があれば、APNSまたはGCMでリモート通知を行います。
他のユーザーが保存した情報に対して、コメントを行う
コメントは、ポーリングを利用した簡易的なチャットになっています。
さいごに
以上、中身はこんな処理になっていました。
このプロジェクトは、社内でぴょんさんとサービスを作ろうと考えていたところ、ちょうど関連したこのプロジェクトの話しを受け、一緒に開発を行いました。
こんな仕事が面白そうだと思った人はこちらから!
杉山のブログを読んだと書いてもらえると、筆が進みます。
関連記事
techblog.kayac.com
techblog.kayac.com