Geolocation クラスの使い方は前回説明した Accelerometer と良く似ています。
Geolocation.isSupported 属性を使うと、実行環境で Geolocation が使えるかどうかを確認できます。値が true なら利用可能、false なら利用不可を意味します。
if (Geolocation.isSupported) { // Geolocationの機能が利用できる }
位置情報といえば GPS が有名ですが、GPS 以外の手段で位置情報を取得するデバイスもあります。そのため、isSupported の値が true であることは、必ずしも GPS が搭載されているという意味にはなりません。
また、GPS 情報が受信できない場合の補助用に、複数の測位システムを搭載しているデバイスもあります。このようなデバイスでは、アプリ実行中に利用する測位情報システムが変わる可能性があります。
利用する測位システムの種類によって、Geolocation からの通知のタイミングや頻度が影響を受けるようです。ですが、利用中の測位情報の種類を知る手段はありません。なので、Geolocation の振る舞いについては実機での検証がいるかもです。
位置情報へのアクセスの状態
多くのデバイスでは、位置情報を利用する/しないをオプションとして選択できるようになっています。この状態は muted 属性を使って知ることができます。値が true のときは利用しない、false のときは利用する、が選択されていることを示します。
この状態が変わると、Status イベントが発生します。イベントハンドラを追加することで、状況に応じて処理をすることができます。下はその例です。
var geo:Geolocation; if (Geolocation.isSupported) { geo = new Geolocation(); geo.addEventListener(StatusEvent.STATUS, onGeoStatus); if (!geo.muted) { // 位置情報が利用できる } } function onGeoStatus(event:StatusHandler):void { if (!geo.muted) { // 位置情報が利用できるようになった } else { // 位置情報が利用できなくなった } }
GeolocationEvent クラス
位置情報を受け取るには、Geolocation のインスタンスに Update イベント用のハンドラを追加します。こんな感じです。
var geo:Geolocation; if (Geolocation.isSupported) { geo = new Geolocation(); geo.addEventListener(StatusEvent.STATUS, onGeoStatus); if (!geo.muted) { geo.addEventListener(GeolocationEvent.UPDATE, onGeoUpdate); } }
追加したイベントハンドラで受け取るのは GeolocationEvent オブジェクトです。以下の 8 つの属性があります。
- latitude -- 緯度 (単位は度)
- longitude -- 経度 (単位は度)
- altitude -- 高度 (単位はメートル)
- speed -- 速度 (単位はメートル毎秒)
- heading -- 方角 (単位は度、基準は北)
- horizontalAccuracy -- 水平方向の正確さ (単位はメートル)
- verticalAccuracy -- 垂直方向の正確さ (単位はメートル)
- timestamp -- アプリが初期化されてからの時間 (単位はミリ秒)
timestamp 属性のみ int で、あとは Number 型のオブジェクトです。
こちらも簡単なサンプルを。
function onGeoUpdate(event:GeolocationEvent):void { myTextField.text = "緯度: " + event.latitude.toString() + "\n" + "経度: " + event.longitude.toString() + "\n" + "高度: " + event.altitude.toString() + "\n" + "速度: " + event.speed.toString() + "\n" + "方角: " + event.heading.toString() + "\n" + "水平方向の正確さ: " + event.horizontalAccuracy.toString() + "\n" + "垂直方向の正確さ: " + event.verticalAccuracy.toString() + "\n" + "経過時間: " + event.timestamp.toString() }
イベント間隔の指定
Geolocation からイベントを受け取る間隔を setRequestedUpdateInterval() メソッドを使って指定することができます。引数に希望する間隔をミリ秒単位で指定します。指定した値ぴったりになるわけではないようで、多少間隔の前後はあります。
下が、サンプルです。
var geo:Geolocation = new Geolocation(); // 10秒間隔でイベントが発生するよう指定 geo.setRequestedUpdateInterval(10000);
この指定は、全てのイベントリスナーに対して適用されます。
特に指定しない場合は、デバイスにもともと指定されている間隔で更新が行われます。
コメントする