Copyright © 2021 W3C ® ( MIT , ERCIM , Keio , Beihang ). W3C liability , trademark and permissive document license rules apply.
The Geolocation API provides access to geographical location information associated with the hosting device.
This section describes the status of this document at the time of its publication. Other documents may supersede this document. A list of current W3C publications and the latest revision of this technical report can be found in the W3C technical reports index at https://www.w3.org/TR/.
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.
This document was published by the Devices and Sensors Working Group as an Editor's Draft.
GitHub Issues are preferred for discussion of this specification.
Publication as an Editor's Draft does not imply endorsement by the W3C Membership.
This is a draft document and may be updated, replaced or obsoleted by other documents at any time. It is inappropriate to cite this document as other than work in progress.
This document was produced by a group operating under the W3C Patent Policy . W3C maintains a public list of any patent disclosures made in connection with the deliverables of the group; that page also includes instructions for disclosing a patent. An individual who has actual knowledge of a patent which the individual believes contains Essential Claim(s) must disclose the information in accordance with section 6 of the W3C Patent Policy .
This document is governed by the 15 September 2020 W3C Process Document .
This section is non-normative.
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 grants permission , the Geolocation API :
GeolocationPosition
interface.
getCurrentPosition
()
method
and
the
ability
to
receive
updates
for
when
the
position
of
the
hosting
device
significantly
changes
via
the
watchPosition
()
method.
PositionOptions
's
maximumAge
,
allows
an
application
to
request
a
cached
position
whose
age
is
no
greater
than
a
specified
value
(only
the
last
position
is
cached).
GeolocationPositionError
,
that
have
occurred
while
acquiring
a
position
.
enableHighAccuracy
,
supports
requesting
"high
accuracy"
position
data,
though
the
request
can
be
ignored
by
the
user
agent.
This section is non-normative.
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.
This section is non-normative.
Since publication of the Second Edition in 2016, this specification has received the following changes:
errorCallback
is
now
nullable.
callbacks
are
no
longer
treated
as
"EventHandler"
objects
(i.e.,
objects
that
have
a
.handleEvent()
method),
but
are
now
exclusively
treated
as
IDL
callback
functions.
[NoInterfaceObject]
,
so
Geolocation
and
other
interface
of
this
spec
are
now
in
the
global
scope.
Also,
the
interfaces
were
renamed
from
NavigatorGeolocation*
to
just
Geolocation*
.
See the commit history for a complete list of changes.
This section is non-normative.
The API is designed to enable both "one-shot" position requests and repeated position updates. The following examples illustrate common use cases.
This section is non-normative.
Request the user's current location. If the user allows it, you will get back a position object.
This section is non-normative.
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.
This section is non-normative.
Stop
watching
for
position
changes
by
calling
the
clearWatch
()
method.
This section is non-normative.
When
an
error
occur,
the
second
argument
of
the
watchPosition
()
or
getCurrentPosition
()
method
gets
called
with
a
GeolocationPositionError
error,
which
can
help
you
figure
out
what
might
have
gone
wrong.
maximumAge
as
cache
control
This section is non-normative.
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.
timeout
If
you
require
location
information
in
a
time
sensitive
manner,
you
can
use
the
PositionOptions
timeout
member
to
limit
the
amount
of
time
you
are
willing
to
wait
to
acquire
a
position
.
This section is non-normative.
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
the
allow
="geolocation"
attribute
to
an
iframe
element:
Alternatively, the API can be disabled in a first-party context by specifying an HTTP response header:
See
Permissions
Policy
for
more
details
about
the
Permissions-Policy
HTTP
header.
This section is non-normative.
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 is non-normative.
This section applies to "recipients", which generally means developers utilizing the Geolocation API . Although it's impossible for the 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 recipients 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.
This section is non-normative.
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.
Geolocation
interface
and
callbacks
WebIDL[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
[[cachedPosition]]
by
resetting
it
to
null
at
any
time
for
any
reason.
|
[[watchTasks]] |
Initialized
as
an
empty
set
of
unsigned
long
items
,
which
represent
the
identifier
for
timed
task
.
|
getCurrentPosition()
method
The
getCurrentPosition
(
successCallback
,
errorCallback
,
options
)
method
steps
are:
Document
is
not
fully
active
,
call
back
with
error
errorCallback
and
POSITION_UNAVAILABLE
.
undefined
.
watchPosition()
method
The
watchPosition
(
successCallback
,
errorCallback
,
options
)
method
steps
are:
Document
is
not
fully
active
:
POSITION_UNAVAILABLE
.
clearWatch()
method
When
clearWatch()
is
invoked,
the
user
agent
MUST
:
[[watchTasks]]
[
watchId
]
exists
,
remove
this
's
[[watchTasks]]
[
watchId
].
Request
position
by
passing
a
PositionCallback
successCallback
,
a
PositionErrorCallback
?
errorCallback
,
PositionOptions
options
,
a
boolean
repeats
,
and
optionally
(and
only
if
repeats
is
true)
a
previousId
.
[[watchTasks]]
.
long
that
is
greater
than
or
equal
to
zero.
PERMISSION_DENIED
.
DOMTimeStamp
that
represents
now
in
milliseconds,
using
01
January,
1970
UTC
as
the
epoch.
maximumAge
is
greater
than
0,
and
cachedPosition
is
not
null:
[[cachedPosition]]
.
maximumAge
member.
timestamp
's
value
is
greater
than
cacheTime
,
and
cachedPosition
.
[[isHighAccuracy]]
equals
options
.
enableHighAccuracy
:
timeout
milliseconds
after
acquisitionTime
,
which
performs
the
following
sub-steps:
TIMEOUT
.
enableHighAccuracy
:
GeolocationPosition
passing
acquisitionTime
and
options
.
enableHighAccuracy
.
[[cachedPosition]]
to
position
.
POSITION_UNAVAILABLE
.
When
instructed
to
check
permission
,
given
a
PositionErrorCallback
?
errorCallback
:
denied
",
then:
PERMISSION_DENIED
.
When
instructed
to
call
back
with
error
,
given
an
PositionErrorCallback
?
callback
and
an
unsigned
short
code
:
GeolocationPositionError
instance
whose
code
attribute
is
initialized
to
code
.
PositionOptions
dictionary
WebIDLdictionary PositionOptions
{
boolean enableHighAccuracy
= false;
[Clamp] unsigned long timeout
= 0xFFFFFFFF;
[Clamp] unsigned long maximumAge
= 0;
};
enableHighAccuracy
member
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).
timeout
member
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
obtaining
permission
to
use
the
API
is
not
included
in
the
period
covered
by
the
timeout
member.
The
timeout
member
only
applies
when
acquiring
a
position
begins.
maximumAge
member
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.
GeolocationPosition
interface
WebIDL[Exposed=Window, SecureContext]
interface GeolocationPosition
{
readonly attribute GeolocationCoordinates
coords
;
readonly attribute DOMTimeStamp timestamp
;
};
coords
attribute
The
coords
attribute
contains
geographic
coordinates.
timestamp
attribute
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
enableHighAccuracy
member
when
this
GeolocationPosition
is
created
.
|
The following task source is defined by this specifications.
PositionCallback
and
PositionErrorCallback
when
performing
position
requests
.
GeolocationCoordinates
interface
WebIDL[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
;
};
latitude
,
longitude
,
and
accuracy
attributes
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).
altitude
and
altitudeAccuracy
attributes
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).
heading
attribute
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.
speed
attribute
The
speed
attribute
denotes
the
magnitude
of
the
horizontal
component
of
the
hosting
device's
current
velocity
in
meters
per
second.
GeolocationPosition
A
new
GeolocationPosition
is
constructed
with
DOMTimeStamp
timestamp
and
boolean
isHighAccuracy
by
performing
the
following
steps:
GeolocationCoordinates
instance:
latitude
attribute
to
a
geographic
coordinate
in
decimal
degrees.
longitude
attribute
to
a
geographic
coordinate
in
decimal
degrees.
accuracy
attribute
to
a
non-negative
real
number.
The
value
SHOULD
correspond
to
a
95%
confidence
level
with
respect
to
the
longitude
and
latitude
values.
altitude
attribute
in
meters
above
the
[
WGS84
]
ellipsoid,
or
null
if
the
implementation
cannot
provide
altitude
information.
altitudeAccuracy
attribute
as
non-negative
real
number,
or
to
null
if
the
implementation
cannot
provide
altitude
information.
If
the
altitude
accuracy
information
is
provided,
it
SHOULD
correspond
to
a
95%
confidence
level.
speed
attribute
to
a
non-negative
real
number,
or
as
null
if
the
implementation
cannot
provide
speed
information.
heading
attribute
in
degrees,
or
null
if
the
implementation
cannot
provide
heading
information.
If
the
hosting
device
is
stationary
(i.e.,
the
value
of
the
speed
attribute
is
0),
then
initialize
the
heading
to
NaN
.
GeolocationPosition
instance
with
its
coords
attribute
initialized
to
coords
and
timestamp
attribute
initialized
to
timestamp
,
and
its
[[isHighAccuracy]]
internal
slot
set
to
isHighAccuracy
.
GeolocationPositionError
interface
WebIDL[Exposed=Window]
interface GeolocationPositionError
{
const unsigned short PERMISSION_DENIED
= 1;
const unsigned short TIMEOUT
= 3;
readonly attribute unsigned short code
;
readonly attribute DOMString message
;
};
PERMISSION_DENIED
(numeric
value
1)
POSITION_UNAVAILABLE
(numeric
value
2)
TIMEOUT
(numeric
value
3)
timeout
member
has
elapsed
before
the
user
agent
could
successfully
acquire
a
position
.
code
attribute
The
code
attribute
returns
the
value
it
was
initialized
to
(see
§
9.1
Constants
for
possible
values).
message
attribute
The
message
attribute
is
a
developer-friendly
textual
description
of
the
code
attribute.
The
Geolocation
API
defines
a
policy-controlled
feature
identified
by
the
string
"geolocation".
Its
default
allowlist
is
["self"]
.
As well as sections marked as non-normative, all authoring guidelines, diagrams, examples, and notes in this specification are non-normative. Everything else in this specification is normative.
The key words MAY , MUST , and SHOULD in this document are to be interpreted as described in BCP 14 [ RFC2119 ] [ RFC8174 ] when, and only when, they appear in all capitals, as shown here.
WebIDLpartial interface Navigator {
[SameObject] readonly attribute Geolocation
geolocation
;
};
[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
);
dictionary PositionOptions
{
boolean enableHighAccuracy
= false;
[Clamp] unsigned long timeout
= 0xFFFFFFFF;
[Clamp] unsigned long maximumAge
= 0;
};
[Exposed=Window, SecureContext]
interface GeolocationPosition
{
readonly attribute GeolocationCoordinates
coords
;
readonly attribute DOMTimeStamp timestamp
;
};
[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
;
};
[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
;
};
accuracy
attribute
for
GeolocationCoordinates
§8.1
altitude
attribute
for
GeolocationCoordinates
§8.2
altitudeAccuracy
attribute
for
GeolocationCoordinates
§8.2
[[cachedPosition]]
internal
slot
for
Geolocation
§5.1
clearWatch()
method
for
Geolocation
§5.4
code
attribute
for
GeolocationPositionError
§9.2
coords
attribute
for
GeolocationPosition
§7.1
enableHighAccuracy
member
for
PositionOptions
§6.1
geolocation
attribute
for
Navigator
§4.
Geolocation
interface
§5.
GeolocationCoordinates
interface
§8.
GeolocationPosition
interface
§7.
GeolocationPositionError
interface
§9.
getCurrentPosition
method
for
Geolocation
§5.2
heading
attribute
for
GeolocationCoordinates
§8.3
[[isHighAccuracy]]
internal
slot
for
GeolocationPosition
§7.3
latitude
attribute
for
GeolocationCoordinates
§8.1
longitude
attribute
for
GeolocationCoordinates
§8.1
maximumAge
member
for
PositionOptions
§6.3
message
attribute
for
GeolocationPositionError
§9.3
PERMISSION_DENIED
§9.1
POSITION_UNAVAILABLE
§9.1
PositionCallback
§5.
PositionErrorCallback
§5.
PositionOptions
dictionary
§6.
speed
attribute
for
GeolocationCoordinates
§8.4
timeout
member
for
PositionOptions
§6.2
TIMEOUT
§9.1
timestamp
attribute
for
GeolocationPosition
§7.2
watchPosition
method
for
Geolocation
§5.3
[[watchTasks]]
internal
slot
for
Geolocation
§5.1
allow
attribute
(for
iframe
element)
Document
)
iframe
element
Window
interface
set
)
list
)
map
)
list
)
map
)
list
)
Document
)
denied
(for
PermissionState
)
boolean
type
[Clamp]
extended
attribute
DOMString
interface
DOMTimeStamp
double
type
[Exposed]
extended
attribute
long
type
[SameObject]
extended
attribute
[SecureContext]
extended
attribute
undefined
type
unsigned
long
type
unsigned
short
type
This section is non-normative.
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.
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in: