iPhone Mobile SafariでGPSトラッキングをした話

データベースに記録された緯度経度をマッピングした図。

iPhoneGPS座標値を記録するためにはどうすればいいのか、という話。
最近、自転車を買ったので遊ぶために調査しました。
以下、iPhone4S, iOS6環境での話です。

1. Geolocation API

ネイティブの開発環境を持っていないのでブラウザでなんとかできないかなーと調べてみると、、
なんと、HTML5にはGPS座標を取得するAPIがあり、Mobile Safariはこの仕様を実装していることがわかりました。

Geolocation API Specification


このAPIで、

  • 緯度・経度
  • 緯度・経度の誤差
  • 高度
  • 高度の誤差
  • 速度
  • 端末の向いている方向

を取得できます。ブラウザからセンサの値を取れるってすごいですね。
これなら緯度・経度・高度を記録してやりたい事ができそうです。(iPhoneの開発環境があればネイティブでやるけど金がないので・・・)。
ネイティブアプリでしかできないって事があればその時に考える感じで。

2. APIをいじる

コードとしては、APIに座標を引数にとるコールバック関数を渡してその中で色々やる感じになります。
APIは2つのタイプが提供されています。

  1. 座標値を一回取得して終わりのタイプ
  2. 座標値を継続監視して取得し続けるタイプ
方法1. GetCurrentPositionを使う

1回とって終わりのタイプです。
継続的に取得するにはsetTimeoutとかsetIntervalで一定時間ごとに取得する必要があります
例: http://jsdo.it/brainfs/jWzX

方法2. WatchPositionを使う

座標値を継続的に監視して取得し続けるタイプです。こちらのほうが精度が高いです、なぜか。
座標値を時系列で補正してるんでしょうか。今回はこちらを使いました。
例: http://jsdo.it/brainfs/fESL

3. トラッキングにあたって注意

iOSが以下の状態だとMobile SafariGPSから値を取得しません。

  • ロックされた状態
  • Mobile Safariがバックグラウンド実行中
  • Mobile Safariで位置情報サービスを禁止した状態

なのでGPSラッキング中は

  • 自動ロックをOFF ([設定]→[一般]→[自動ロック]の画面で"しない"を選択)
  • Mobile Safariをフォアグラウンド実行して当該ページを開いた状態
  • Mobile Safariで位置情報サービスをオン([設定]→[プライバシー]→[位置情報サービス] でSafariをオン)

にする必要があります。バッテリー食いそう。この状態でどれぐらい保つものか・・・

ネイティブアプリだとロック中でもGPS座標を取れたりするんでしょうか。

4. 走ってきた

画面をこんな状態にして走ってきました。


冒頭の画像は、一定時間毎に送信したGPS座標値をGoogle Mapsでプロットしたもの。
内堀通りあたりが一番精度が良かった。開けた場所だからかな。


5. バッテリーの持ち

フル充電したiPhone
・輝度最低
・自動ロックOFF
Safari以外のアプリを終了
した状態でGPS座標を取得し続けたところ、だいたい2時間でバッテリーが切れました。

モバイルブースター1台で2回フル充電できるとして、合わせて6時間。一日中外出するとして8〜10時間持たせるには2台必要そうです。

輝度を上げたりtwitterクライアントなどを立ち上げればもっと早く消費するし3台必要かなぁ。

7. もっと正確な速度と移動距離を取れるかも?

iOS6からは、Mobile Safariで加速度・傾きも取れるようになったらしいです。加速度が取れるなら、積分で速度、距離を出せるということに。となると、速度の時系列の変化などは、緯度経度から計算するより加速度から計算した方がより正確に値を出せそうです。もっと高度に、GPSと加速度計で通ってきた経路を補正とかもできたりして。知らんけど。自転車の速度計として使うなら断然こちらの方が正確でしょうから、今度はここら辺に取り組むのが楽しそうな感じです。