Détection des changements de géolocalisation

Pour utiliser le capteur de géolocalisation, instanciez un objet Geolocation et enregistrez-vous pour recevoir les événements update qu’il distribue. Un événement update est un objet GeolocationEvent. Il possède huit propriétés :

  • altitude : renvoie l’altitude, en mètres.

  • heading : renvoie la direction du mouvement (par rapport au nord géographique), en degrés.

  • horizontalAccuracy : renvoie la précision horizontale, en mètres.

  • latitude : renvoie la latitude, en degrés.

  • longitude : renvoie la longitude, en degrés.

  • speed : renvoie la vitesse en mètres par seconde.

  • timestamp : nombre de millisecondes au moment où se produit l’événement après l’initialisation du moteur d’exécution.

  • verticalAccuracy : renvoie la précision verticale, en mètres.

La propriété timestamp est un objet int. Les autres propriétés sont des objets Number.

Exemple de base qui affiche les données de géolocalisation dans un champ de texte :

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() 
}

Pour exploiter cet exemple, veillez à créer le champ de texte geoTextField et à l’ajouter à la liste d’affichage avant d’utiliser le code.

Vous pouvez ajuster l’intervalle de temps qui sépare les événements de géolocalisation en appelant la méthode setRequestedUpdateInterval() de l’objet Geolocation. Cette méthode ne gère qu’un seul paramètre, interval, qui correspond à la fréquence de mise à jour requise, en millisecondes :

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

L’intervalle réel entre les mises à jour de la géolocalisation peut être supérieur ou inférieur à cette valeur. Toute modification de l’intervalle de mise à jour affecte l’ensemble des écouteurs enregistrés. Si vous n’appelez pas la méthode setRequestedUpdateInterval(), l’application reçoit des mises à jour à la fréquence définie par défaut sur le périphérique.

L’utilisateur peut interdire à une application d’accéder aux données de géolocalisation. L’iPhone avertit par exemple l’utilisateur lorsqu’une application tente d’obtenir des données de géolocalisation. En réponse à l’invite, l’utilisateur peut refuser à l’application tout accès aux données de géolocalisation. L’objet Geolocation distribue un événement status lorsque l’utilisateur refuse l’accès aux données de géolocalisation. Il possède également une propriété muted, définie sur true lorsque le capteur de géolocalisation n’est pas disponible. L’objet Geolocation distribue un événement status lorsque la propriété muted change. Le code suivant indique comment détecter que les données de géolocalisation ne sont pas disponibles :

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 = ""; 
        } 
    } 
}
Remarque : les iPhone de première génération, qui n’intègrent pas d’unité GPS, ne distribuent que rarement des événements update. Sur ces périphériques, un objet Geolocation distribue initialement un ou deux événements update. Il distribue ensuite des événements update lorsque les informations sont sensiblement modifiées.

Vérification de la prise en charge de la géolocalisation

La propriété Geolocation.isSupported permet de vérifier si l’environnement d’exécution prend en charge cette fonction :

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

A l’heure actuelle, la géolocalisation n’est prise en charge que par les applications ActionScript pour l’iPhone et dans Flash Lite 4. Si Geolocation.isSupported correspond à true à l’exécution, la géolocalisation est prise en charge.

Certains modèles d’iPhone ne sont pas équipés d’une unité GPS. Ces modèles font appel à d’autres techniques, telles que la localisation par triangulation des téléphones portables, pour obtenir les données de géolocalisation. Pour ces modèles, ou sur tout iPhone dont l’unité GPS est désactivée, un objet Geolocation risque de ne distribuer qu’un ou deux événements update initiaux.