aboutsummaryrefslogtreecommitdiff
path: root/files/fr/web/api/geolocation_api/index.html
blob: 153bce57b288bb465a318ae83163e719b48a4ab6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
---
title: Geolocation API (API de géolocalisation)
slug: Web/API/Geolocation_API
tags:
  - API
  - GPS
  - Geolocation
  - Géolocalisation
translation_of: Web/API/Geolocation_API
---
<div>{{securecontext_header}}{{DefaultAPISidebar("Geolocation API")}}</div>

<p>L'API <strong>Geolocation </strong>(pour géolocalisation) permet à un utilisateur d'indiquer sa localisation à une application web s'il le souhaite. Pour des raisons de vie privée, l'application doit demander la permission à l'utilisateur de manipuler ces informations.</p>

<h2 id="Lobjet_geolocation">L'objet <code>geolocation</code></h2>

<p>L'API <a href="/fr/docs/Web/API/Geolocation">Geolocation</a> est publiée via l'objet {{domxref("navigator.geolocation")}}.</p>

<p>Si l'objet existe, les services de géolocalisation sont disponibles. On peut donc tester la présence de ces fonctionnalités de cette façon :</p>

<pre class="brush: js">if ("geolocation" in navigator) {
  /* la géolocalisation est disponible */
} else {
  /* la géolocalisation n'est pas disponible */
}
</pre>

<div class="note">
<p><strong>Note :</strong> Pour Firefox 24 et les versions antérieures, <code>"geolocation" in navigator</code> renvoyait toujours <code>true</code> même si l'API était désactivée. Cela a été corrigé à partir de <a href="/en-US/docs/Mozilla/Firefox/Releases/25/Site_Compatibility">Firefox 25</a> afin de respecter la spécification ({{bug(884921)}}).</p>
</div>

<h3 id="Obtenir_la_position_actuelle">Obtenir la position actuelle</h3>

<p>Afin d'obtenir la position actuelle de l'utilisateur, on peut appeler la méthode {{domxref("geolocation.getCurrentPosition()","getCurrentPosition()")}}. Cela initie une requête asynchrone pour détecter la position de l'utilisateur en demandant au composant matériel une position à jour. Lorsque la position est déterminée, la fonction de <em>callback</em> est appelée. Il est possible de fournir un deuxième <em>callback</em> afin de gérer les erreurs. Le troisième paramètre de la fonction, optionnel, est un objet d'options qui indique l'âge maximal pour la position, le temps à attendre l'exécution de la requête et si on souhaite obtenir une précision élevée pour la position.</p>

<div class="note">
<p><strong>Note :</strong> Par défaut {{domxref("Geolocation.getCurrentPosition()","getCurrentPosition()")}} tente de répondre aussi rapidement que possible quitte à ce que le résultat soit peu précis. Cela permet de répondre rapidement (potentiellement avec des données peu précises comme l'IP ou le WiFi) plutôt que d'attendre une ou plusieurs minutes le calibrage du GPS.</p>
</div>

<pre class="brush: js">navigator.geolocation.getCurrentPosition(function(position) {
  faireQqc(position.coords.latitude, position.coords.longitude);
});</pre>

<p>Dans l'exemple ci-avant, la fonction <code>faireQqc()</code> sera exécutée quand la localisation sera obtenue.</p>

<h3 id="Suivre_lévolution_de_la_position">Suivre l'évolution de la position</h3>

<p>Si les données de position changent (que l'appareil ait bougé ou que des informations de géolocalisation plus précises soient disponibles), on peut définir une fonction de <em>callback</em> qui sera appelée avec les informations mises à jour</p>

<p>Pour cela, on utilise la fonction {{domxref("Geolocation.watchPosition()","watchPosition()")}} qui utilise les mêmes paramètres d'entrée que {{domxref("Geolocation.getCurrentPosition()","getCurrentPosition()")}}. Ce <em>callback</em> est appelé plusieurs fois, permettant au navigateur de mettre à jour la position lorsqu'on se déplace ou lorsque des données plus précises sont fournies. La fonction de rappel pour la gestion des erreurs (optionnelle) peut aussi être appelée de façon répétée.</p>

<div class="note">
<p><strong>Note :</strong> On peut utiliser {{domxref("Geolocation.watchPosition()","watchPosition()")}} sans avoir d'abord appelé {{domxref("Geolocation.getCurrentPosition()","getCurrentPosition()")}}.</p>
</div>

<pre class="brush: js">var watchID = navigator.geolocation.watchPosition(function(position) {
  faireQqc(position.coords.latitude, position.coords.longitude);
});</pre>

<p>La méthode {{domxref("Geolocation.watchPosition()","watchPosition()")}} renvoie un identifiant qui peut être utilisé afin de redemander la position. Cet identifiant peut également être passé à la méthode {{domxref("Geolocation.clearWatch()","clearWatch()")}} afin d'arrêter le suivi de la position.</p>

<pre class="brush: js">navigator.geolocation.clearWatch(watchID);
</pre>

<h3 id="Paramétrer_la_réponse">Paramétrer la réponse</h3>

<p>{{domxref("Geolocation.getCurrentPosition()","getCurrentPosition()")}} et {{domxref("Geolocation.watchPosition()","watchPosition()")}} prennent en argument un <em>callback</em> appelé en cas de succès, un deuxième <em>callback</em> (optionnel) appelé en cas d'erreur et un troisième argument (optionnel) qui est un objet <code><a href="/fr/docs/Web/API/PositionOptions">PositionOptions</a></code>.</p>

<p>Un appel à {{domxref("Geolocation.watchPosition()","watchPosition")}} peut donc ressembler à :</p>

<pre class="brush: js">function geo_success(position) {
  do_something(position.coords.latitude, position.coords.longitude);
}

function geo_error() {
  alert("Sorry, no position available.");
}

var geo_options = {
  enableHighAccuracy: true,
  maximumAge        : 30000,
  timeout           : 27000
};

var wpid = navigator.geolocation.watchPosition(geo_success, geo_error, geo_options);</pre>

<h2 id="Décrire_une_position">Décrire une position</h2>

<p>La position de l'utilisateur est décrite par un objet {{domxref("Position")}} qui fait référence à un objet {{domxref("Coordinates")}} via la propriété <code>coords</code>.</p>

<p>{{page("/fr/docs/Web/API/Position")}}</p>

<p>{{page("/fr/docs/Web/API/Position/coords","Coordinates")}}</p>

<h2 id="Gérer_les_erreurs">Gérer les erreurs</h2>

<p>Le <em>callback</em> de gestion des erreurs (s'il est passé à <code>getCurrentPosition()</code> ou <code>watchPosition()</code>) s'attend à recevoir un objet <code><a href="/fr/docs/Web/API/PositionError">PositionError</a></code> comme premier paramètre.</p>

<pre class="brush: js">function errorCallback(error) {
  alert('ERROR(' + error.code + '): ' + error.message);
};
</pre>

<h2 id="Exemple_interactif">Exemple interactif</h2>

<pre class="brush: css hidden">body {
  padding: 20px;
  background-color:#ffffc9
}

button {
  margin: .5rem 0;
}
</pre>

<h3 id="HTML">HTML</h3>

<pre class="brush: html;">&lt;button id = "find-me"&gt;Montrer ma localisation&lt;/button&gt;&lt;br/&gt;
&lt;p id = "status"&gt;&lt;/p&gt;
&lt;a id = "map-link" target="_blank"&gt;&lt;/a&gt;
</pre>

<h3 id="JavaScript">JavaScript</h3>

<pre class="brush: js">function geoFindMe() {

  const status = document.querySelector('#status');
  const mapLink = document.querySelector('#map-link');

  mapLink.href = '';
  mapLink.textContent = '';

  function success(position) {
    const latitude  = position.coords.latitude;
    const longitude = position.coords.longitude;

    status.textContent = '';
    mapLink.href = `https://www.openstreetmap.org/#map=18/${latitude}/${longitude}`;
    mapLink.textContent = `Latitude: ${latitude} °, Longitude: ${longitude} °`;
  }

  function error() {
    status.textContent = 'Unable to retrieve your location';
  }

  if (!navigator.geolocation) {
    status.textContent = 'Geolocation is not supported by your browser';
  } else {
    status.textContent = 'Locating…';
    navigator.geolocation.getCurrentPosition(success, error);
  }

}

document.querySelector('#find-me').addEventListener('click', geoFindMe);
</pre>

<h3 id="Résultat">Résultat</h3>

<p>{{EmbedLiveSample('Exemple_interactif', 350, 150, "", "", "", "geolocation")}}</p>

<h2 id="Demander_la_permission">Demander la permission</h2>

<p>Pour une extension, toute utilisation des données de géolocalisation ne peut se faire qu'après avoir obtenu la permission. La fonction qui suit permet de demander la permission de façon semblable au rendu des pages web. La réponse de l'utilisateur est enregistrée dans la préférence indiquée par le paramètre <code>pref</code>. La fonction fournie dans le paramètre de <code>callback</code> sera appelée avec une valeur booléenne qui indique la réponse de l'utilisateur. Lorsque cette dernière vaut <code>true</code>, le module complémentaire pourra accéder aux données de géolocalisation.</p>

<pre class="brush: js">function prompt(window, pref, message, callback) {
    let branch = Components.classes["@mozilla.org/preferences-service;1"]
                           .getService(Components.interfaces.nsIPrefBranch);

    if (branch.getPrefType(pref) === branch.PREF_STRING) {
        switch (branch.getCharPref(pref)) {
        case "always":
            return callback(true);
        case "never":
            return callback(false);
        }
    }

    let done = false;

    function remember(value, result) {
        return function() {
            done = true;
            branch.setCharPref(pref, value);
            callback(result);
        }
    }

    let self = window.PopupNotifications.show(
        window.gBrowser.selectedBrowser,
        "geolocation",
        message,
        "geo-notification-icon",
        {
            label: "Share Location",
            accessKey: "S",
            callback: function(notification) {
                done = true;
                callback(true);
            }
        }, [
            {
                label: "Always Share",
                accessKey: "A",
                callback: remember("always", true)
            },
            {
                label: "Never Share",
                accessKey: "N",
                callback: remember("never", false)
            }
        ], {
            eventCallback: function(event) {
                if (event === "dismissed") {
                    if (!done) callback(false);
                    done = true;
                    window.PopupNotifications.remove(self);
                }
            },
            persistWhileVisible: true
        });
}

prompt(window,
       "extensions.foo-addon.allowGeolocation",
       "Foo Add-on wants to know your location.",
       function callback(allowed) { alert(allowed); });
</pre>

<h2 id="Compatibilité_des_navigateurs">Compatibilité des navigateurs</h2>

<p>{{Compat("api.Geolocation")}}</p>

<h3 id="Disponibilité">Disponibilité</h3>

<p>La localisation basée sur le WiFi étant généralement obtenue via un service Google, l'API de géolocalisation peut être indisponible en Chine. Vous pouvez utiliser des fournisseurs tiers tels que <a href="http://lbsyun.baidu.com/index.php?title=jspopular/guide/geolocation">Baidu</a>, <a href="https://lbs.amap.com/api/javascript-api/guide/services/geolocation#geolocation">Autonavi</a> ou <a href="http://lbs.qq.com/tool/component-geolocation.html">Tencent</a>. Ces services se basent sur l'adresse IP de l'utilisateur ou sur une application locale afin de fournir un positionnement amélioré.</p>

<h2 id="Voir_aussi">Voir aussi</h2>

<ul>
 <li>{{domxref("navigator.geolocation")}}</li>
 <li><a href="https://www.w3.org/TR/geolocation-API/">L'API Geolocation sur w3.org</a></li>
 <li><a href="https://hacks.mozilla.org/2013/10/who-moved-my-geolocation/">Qui a déplacé ma géolocalisation ? sur le blog Hacks</a></li>
</ul>