ジオロケーション変化の検出

ジオロケーションセンサーを使用するには、Geolocation オブジェクトをインスタンス化し、このオブジェクトが送出する update イベントを登録します。 update イベントは、Geolocation イベントオブジェクトです。このイベントには次の 8 個のプロパティがあります。

  • altitude —高度(メートル単位)を返します。

  • heading —真北を基準とする移動の方角(整数)を返します。

  • horizontalAccuracy —水平精度(メートル単位)を返します。

  • latitude —緯度(度単位)を返します。

  • longitude —経度(度単位)を返します。

  • speed —速度(m/秒)を返します。

  • timestamp —ランタイムが初期化されてからイベント発生時までの時間(ミリ秒)です。

  • verticalAccuracy —垂直精度(メートル単位)を返します。

timestamp プロパティは int オブジェクトです。その他は Number オブジェクトです。

テキストフィールドでジオロケーションデータを表示する基本的な例を示します。

var geo:Geolocation; 
if (Geolocation.isSupported) 
{ 
    geo = new Geolocation(); 
    geo.addEventListener(GeolocationEvent.UPDATE, updateHandler); 
} 
else 
{ 
    geoTextField.text = "Geolocation feature not supported"; 
} 
function updateHandler(event:GeolocationEvent):void 
{ 
    geoTextField.text = "latitude: " + event.latitude.toString() + "\n" 
            + "longitude: " + event.longitude.toString() + "\n" 
            + "altitude: " + event.altitude.toString() 
            + "speed: " + event.speed.toString() 
            + "heading: " + event.heading.toString() 
            + "horizontal accuracy: " + event.horizontalAccuracy.toString() 
            + "vertical accuracy: " + event.verticalAccuracy.toString() 
}

この例を使用するには、必ず geoTextField テキストフィールドを作成し、そのフィールドを表示リストに追加してから、このコードを使用します。

ジオロケーションイベントの目的の間隔を調整するには、Geolocation オブジェクトの setRequestedUpdateInterval() メソッドを呼び出します。このメソッドは 1 つのパラメーター interval を受け取ります。これは、必要な更新間隔(ミリ秒単位)です。

var geo:Geolocation = new Geolocation(); 
geo.setRequestedUpdateInterval(10000);

ジオロケーションを更新する実際の間隔は、この値より大きかったり小さかったりする可能性があります。更新間隔が変更された場合、登録されたリスナーすべてに影響します。 setRequestedUpdateInterval() メソッドを呼び出さない場合、アプリケーションはデバイスのデフォルトの間隔に基づいて更新を受け取ります。

ユーザーは、アプリケーションがジオロケーションデータにアクセスするのを防ぐことができます。例えば、iPhone は、アプリケーションがジオロケーションデータを入手しようとしたときに、ユーザーにプロンプトを表示します。ユーザーは、プロンプトに応じて、ジオロケーションデータへのアプリケーションアクセスを拒否できます。ユーザーがジオロケーションデータへのアクセスを使用できないようにしたときに、Geolocation オブジェクトは status イベントを送出します。また、Geolocation オブジェクトには muted プロパティがあります。このプロパティは、ジオロケーションセンサーを使用できないときに、 true に設定されます。Geolocation オブジェクトは、 muted プロパティが変更されると、 status イベントを送出します。次のコードは、ジオロケーションデータを使用できないときの検出方法を示しています。

package 
{ 
    import flash.display.Sprite; 
    import flash.display.StageAlign; 
    import flash.display.StageScaleMode; 
    import flash.events.GeolocationEvent; 
    import flash.events.MouseEvent; 
    import flash.events.StatusEvent; 
    import flash.sensors.Geolocation; 
    import flash.text.TextField; 
    import flash.text.TextFormat; 
 
    public class GeolocationTest extends Sprite 
    { 
         
        private var geo:Geolocation; 
        private var log:TextField; 
         
        public function GeolocationTest() 
        {             
            super(); 
            stage.align = StageAlign.TOP_LEFT; 
            stage.scaleMode = StageScaleMode.NO_SCALE; 
            setUpTextField(); 
             
            if (Geolocation.isSupported) 
            { 
                geo = new Geolocation(); 
                if (!geo.muted) 
                { 
                    geo.addEventListener(GeolocationEvent.UPDATE, geoUpdateHandler); 
                } 
                geo.addEventListener(StatusEvent.STATUS, geoStatusHandler); 
            } 
            else 
            { 
                log.text = "Geolocation not supported"; 
            } 
        } 
         
        public function geoUpdateHandler(event:GeolocationEvent):void 
        { 
            log.text = "latitude : " + event.latitude.toString() + "\n"; 
            log.appendText("longitude : " + event.longitude.toString() + "\n"); 
        } 
         
        public function geoStatusHandler(event:StatusEvent):void 
        { 
            if (geo.muted) 
                geo.removeEventListener(GeolocationEvent.UPDATE, geoUpdateHandler); 
            else 
                geo.addEventListener(GeolocationEvent.UPDATE, geoStatusHandler); 
        } 
         
        private function setUpTextField():void 
        { 
            log = new TextField(); 
            var format:TextFormat = new TextFormat("_sans", 24); 
            log.defaultTextFormat = format; 
            log.border = true; 
            log.wordWrap = true; 
            log.multiline = true; 
            log.x = 10; 
            log.y = 10; 
            log.height = stage.stageHeight - 20; 
            log.width = stage.stageWidth - 20; 
            log.addEventListener(MouseEvent.CLICK, clearLog); 
            addChild(log); 
        } 
        private function clearLog(event:MouseEvent):void 
        { 
            log.text = ""; 
        } 
    } 
}
注意: GPS を搭載していない第 1 世代 iPhone は、 update イベントをほとんど送出しません。このデバイスでは、Geolocation オブジェクトが最初に 1 つまたは 2 つの update イベントを送出します。その後、情報が大幅に変更されたときに update イベントを送出します。

ジオロケーションサポートの確認

ランタイム環境でこの機能を使用できるかどうかをテストするには、 Geolocation.isSupported プロパティを使用します。

if (Geolocation.isSupported) 
{ 
    // Set up geolocation event listeners and code. 
}

現在、ジオロケーションがサポートされているのは、iPhone および Flash Lite 4 用の ActionScript ベースのアプリケーションのみです。 Geolocation.isSupported が実行時に true の場合は、ジオロケーションサポートが存在しています。

一部の iPhone モデルには GPS ユニットがありません。これらのモデルは他の方法(携帯電話の三角測量など)を使用して、ジオロケーションデータを取得します。これらのモデルや、GPS を無効にしている iPhone では、Geolocation オブジェクトは 1 つまたは 2 つの初期 update イベントを送出できるだけです。