The Geolocation API provides access to geographical location information associated with the hosting device.
The Devices and Sensors Working Group is updating this specification in the hope of making it a "living standard". As such, we've dropped the "Editions" and aim to continue publishing updated W3C Recommendations of this specification as we add new features or fix bugs.
The Geolocation API defines a high-level interface to location information associated only with the device hosting the implementation. Common sources of location information include Global Positioning System (GPS) and location inferred from network signals such as IP address, RFID, WiFi and Bluetooth MAC addresses, and GSM/CDMA cell IDs, as well as user input. The API itself is agnostic of the underlying location information sources, and no guarantee is given that the API returns the device's actual location.
If an end user [=check permission|grants permission=], the Geolocation API:
This specification is limited to providing a scripting API for retrieving geographic position information associated with a hosting device. The geographic position information is provided in terms of World Geodetic System coordinates [[WGS84]]. It does not include providing a markup language of any kind, nor does not include defining a new URL scheme for building URLs that identify geographic locations.
Since publication of the Second Edition in 2016, this specification has received the following changes:
See the commit history for a complete list of changes.
The API is designed to enable both "one-shot" position requests and repeated position updates. The following examples illustrate common use cases.
Request the user's current location. If the user allows it, you will get back a position object.
Request the ability to watch user's current location. If the user allows it, you will get back continuous updates of the user's position.
Stop watching for position changes by calling the {{Geolocation/clearWatch()}} method.
When an error occur, the second argument of the {{Geolocation/watchPosition()}} or {{Geolocation/getCurrentPosition()}} method gets called with a {{GeolocationPositionError}} error, which can help you figure out what might have gone wrong.
By default, the API always attempts to return a cached position so long as it has a previously acquired position. In this example, we accept a position whose age is no greater than 10 minutes. If the user agent does not have a fresh enough cached position object, it automatically acquires a new position.
If you require location information in a time sensitive manner, you can use the {{PositionOptions}} {{PositionOptions/timeout}} member to limit the amount of time you are willing to wait to [=acquire a position=].
The default allowlist of `["self"]` allows Geolocation API usage in same-origin nested frames but prevents third-party content from using the API.
Third-party usage can be selectively enabled by adding [^iframe/allow^]`="geolocation"` attribute to an [^iframe^] element:
Alternatively, the API can be disabled in a first-party context by specifying the a HTTP response header:
See [[[permissions-policy]]] for more details about the `Permissions-Policy` HTTP header.
The API defined in this specification is used to retrieve the geographic location of a hosting device. In almost all cases, this information also discloses the location of the user of the device, thereby potentially compromising the user's privacy.
This section applies to "recipients", which generally means developers utilizing the Geolocation API. Although it's impossible for user agent, or this specification, to enforce these requirements, developers need to read this section carefully and do their best to adhere to the suggestions below. Developers need to be aware that there might be privacy laws in their jurisdictions that can govern the usage and access to users' location data.
Recipients ought to only request position information when necessary, and only use the location information for the task for which it was provided to them. Recipients ought to dispose of location information once that task is completed, unless expressly permitted to retain it by the user. Recipients need to also take measures to protect this information against unauthorized access. If location information is stored, users need to be allowed to update and delete this information.
The recipient of location information need to refrain from retransmitting the location information without the user’s express permission. Care needs to be taken when retransmitting and the use of encryption is encouraged.
Recipients ought to clearly and conspicuously disclose the fact that they are collecting location data, the purpose for the collection, how long the data is retained, how the data is secured, how the data is shared if it is shared, how users can access, update and delete the data, and any other choices that users have with respect to the data. This disclosure needs to include an explanation of any exceptions to the guidelines listed above.
Implementers are advised to consider the following aspects that can negatively affect the privacy of their users: in certain cases, users can inadvertently grant permission to the user agent to disclose their location to websites. In other cases, the content hosted at a certain URL changes in such a way that the previously granted location permissions no longer apply as far as the user is concerned. Or the users might simply change their minds.
Predicting or preventing these situations is inherently difficult. Mitigation and in-depth defensive measures are an implementation responsibility and not prescribed by this specification. However, in designing these measures, implementers are advised to enable user awareness of location sharing, and to provide access to user interfaces that enable revocation of permissions.
[Exposed=Window]
interface Geolocation {
undefined getCurrentPosition (
PositionCallback successCallback,
optional PositionErrorCallback? errorCallback = null,
optional PositionOptions options = {}
);
long watchPosition (
PositionCallback successCallback,
optional PositionErrorCallback? errorCallback = null,
optional PositionOptions options = {}
);
undefined clearWatch (long watchId);
};
callback PositionCallback = undefined (
GeolocationPosition position
);
callback PositionErrorCallback = undefined (
GeolocationPositionError positionError
);
Instances of {{Geolocation}} are created with the internal slots in the following table:
| Internal slot | Description |
|---|---|
| [[\cachedPosition]] | A {{GeolocationPosition}}, initialized to null. It's a reference to the last acquired position and serves as a cache. A user agent MAY evict {{Geolocation/[[cachedPosition]]}} by resetting it to null at any time for any reason. |
| [[\watchTasks]] | Initialized as an empty [=set=] of {{unsigned long}} [=set/item|items=], which represent the identifier for timed [=task=]. |
When getCurrentPosition() is invoked, the user agent MUST:
When watchPosition() is invoked, the user agent MUST:
When clearWatch() is invoked, the user agent MUST:
Request position by passing a {{PositionCallback}} |successCallback:PositionCallback|, a {{PositionErrorCallback}}`?` |errorCallback:PositionErrorCallback|, {{PositionOptions}} |options:PositionOptions|, a {{boolean}} |repeats:boolean|, and optionally (and only if |repeats| is true) a |previous id:long|.
When instructed to check permission, given an {{PositionErrorCallback}}`?` |errorCallback:PositionErrorCallback|:
When instructed to call back with error, given an {{PositionErrorCallback}}`?` |callback:PositionErrorCallback| and an {{unsigned short}} |code:unsigned short|:
dictionary PositionOptions {
boolean enableHighAccuracy = false;
[Clamp] unsigned long timeout = 0xFFFFFFFF;
[Clamp] unsigned long maximumAge = 0;
};
The enableHighAccuracy member provides a hint that the application would like to receive the most accurate location data. The intended purpose of this member is to allow applications to inform the implementation that they do not require high accuracy geolocation fixes and, therefore, the implementation MAY avoid using geolocation providers that consume a significant amount of power (e.g. GPS).
The timeout member denotes the maximum length of time, expressed in milliseconds, before [=acquiring a position=] expires.
The time spent waiting for the document to become visible and for [=check permission|obtaining permission to use the API=] is not included in the period covered by the {{PositionOptions/timeout}} member. The {{PositionOptions/timeout}} member only applies when [=acquiring a position=] begins.
The maximumAge member indicates that the web application is willing to accept a cached position whose age is no greater than the specified time in milliseconds.
[Exposed=Window, SecureContext]
interface GeolocationPosition {
readonly attribute GeolocationCoordinates coords;
readonly attribute DOMTimeStamp timestamp;
};
The coords attribute contains geographic coordinates.
The timestamp attribute represents the time when the geographic position of the device was acquired.
Instances of {{GeolocationPositionError}} are created with the internal slots in the following table:
| Internal slot | Description |
|---|---|
| [[\isHighAccuracy]] | A {{boolean}} that records the value of the {{PositionOptions/enableHighAccuracy}} member when this {{GeolocationPosition}} is [=a new GeolocationPosition|created=]. |
[Exposed=Window, SecureContext]
interface GeolocationCoordinates {
readonly attribute double accuracy;
readonly attribute double latitude;
readonly attribute double longitude;
readonly attribute double? altitude;
readonly attribute double? altitudeAccuracy;
readonly attribute double? heading;
readonly attribute double? speed;
};
The latitude and longitude attributes are geographic coordinates specified in decimal degrees.
The accuracy attribute denotes the accuracy level of the latitude and longitude coordinates in meters (e.g., `65` meters).
The altitude attribute denotes the height of the position, specified in meters above the [[WGS84]] ellipsoid.
The altitudeAccuracy attribute represents the altitude accuracy in meters (e.g., `10` meters).
The heading attribute denotes the direction of travel of the hosting device and is specified in degrees, where 0° ≤ heading < 360°, counting clockwise relative to the true north.
The speed attribute denotes the magnitude of the horizontal component of the hosting device's current velocity in meters per second.
A new `GeolocationPosition` is constructed with {{DOMTimeStamp}} |timestamp:DOMTimeStamp| and boolean |isHighAccuracy| by performing the following steps:
[Exposed=Window]
interface GeolocationPositionError {
const unsigned short PERMISSION_DENIED = 1;
const unsigned short POSITION_UNAVAILABLE = 2;
const unsigned short TIMEOUT = 3;
readonly attribute unsigned short code;
readonly attribute DOMString message;
};
The code attribute returns the value it was [=call back with error|initialized to=] (see [[[#constants]]] for possible values).
The message attribute is a developer-friendly textual description of the {{GeolocationPositionError/code}} attribute.
The Geolocation API defines a [=policy-controlled feature=] identified by the string "geolocation". Its [=default allowlist=] is `["self"]`.
This specification builds upon earlier work in the industry, including research by Aza Raskin, Google Gears Geolocation API, and LocationAware.org.
Thanks also to Alec Berntson, Alissa Cooper, Steve Block, Greg Bolsinga, Lars Erik Bolstad, Aaron Boodman, Dave Burke, Chris Butler, Max Froumentin, Shyam Habarakada, Marcin Hanclik, Ian Hickson, Brad Lassey, Angel Machin, Cameron McCormack, Daniel Park, Stuart Parmenter, Olli Pettay, Chris Prince, Arun Ranganathan, Carl Reed, Thomas Roessler, Dirk Segers, Allan Thomson, Martin Thomson, Doug Turner, Erik Wilde, Matt Womer, and Mohamed Zergaoui.