另请参见 翻译。
Copyright © 2024 World Wide Web Consortium. W3C® liability, trademark and permissive document license rules apply.
地理位置提供与托管设备相关的地理位置信息访问。
本节描述了本文档在发布时的状态。当前 W3C 出版物的列表和本技术报告的最新修订版本可在 W3C 技术报告索引中找到 https://www.w3.org/TR/。
自从本规范于 2022 年 9 月 1 日成为 W3C 推荐以来,已提出以下实质性新增和/或修正:
更详细的变更列表可在 D. 变更记录部分找到。文档的审阅者可以通过文档中的特殊样式标识候选新增和/或修正。
本文档由设备与传感器工作组和Web 应用工作组根据 推荐路线发布为推荐标准。 自上次推荐以来,本文档包含了实质性更改和新功能。
W3C 推荐广泛部署本规范,作为 Web 标准。
W3C 推荐是经过广泛共识建立后,由 W3C 及其成员认可的规范,并且工作组成员承诺对实现 免版税许可。 本推荐的未来更新可能会引入 新功能。
候选新增在文档中标注。
候选修正在文档中标注。
本文档由根据 W3C 专利政策运作的工作组生成。 W3C 维护着 任何专利披露的公共列表(设备与传感器工作组)和 任何专利披露的公共列表(Web 应用工作组), 这些页面还包括专利披露的相关指引。如果个人了解某专利且认为其包含 必要声明,则必须按照 W3C 专利政策第 6 节披露相关信息。
本文档受 2023年11月03日 W3C 流程文件管理。
本节为非规范性内容。
地理位置 定义了一个与托管实现的设备相关的位置信息的高级接口。常见的位置信息来源包括全球定位系统(GPS)和从网络信号(如 IP 地址、RFID、WiFi 和蓝牙 MAC 地址以及 GSM/CDMA 小区 ID)推断出的位置信息,以及用户输入。API 本身对底层位置信息来源不加区分,且不能保证 API 返回设备的实际位置。
如果最终用户授予权限, 地理位置:
GeolocationPosition
接口提供位置数据,如纬度、经度、海拔、速度和航向,以及获取到的位置数据的精度和获取该位置的近似时间。
getCurrentPosition
()
方法进行 "一次性" 位置更新,并支持通过 watchPosition
()
方法,在托管设备的位置显著变化时接收更新。
PositionOptions
的 maximumAge
,允许应用请求一个不超过指定时间的缓存位置(只缓存最后一个位置)。
GeolocationPositionError
,这些错误发生在获取位置期间。
enableHighAccuracy
,支持请求 "高精度"
位置数据,尽管此请求可能会被用户代理忽略。
本节为非规范性内容。
本规范仅限于提供一个脚本 API,用于检索与托管设备相关的地理位置信息。地理位置信息根据世界大地测量系统坐标 [WGS84] 提供。它不包括提供任何形式的标记语言,也不包括定义用于构建标识地理位置的 URL 的新 URL 方案。
本节为非规范性内容。
API 旨在支持“一次性”位置请求和重复位置更新。以下示例展示了常见的用例。
本节为非规范性内容。
请求用户的当前位置。如果用户允许,您将收到一个位置对象。
本节为非规范性内容。
请求监听用户的当前位置。如果用户允许,您将收到用户位置的连续更新。
本节为非规范性内容。
通过调用clearWatch
()
方法,停止监听位置变化。
本节为非规范性内容。
当发生错误时,watchPosition
()
或
getCurrentPosition
()
方法的第二个参数会收到一个
GeolocationPositionError
错误,
这可以帮助您弄清楚可能出了什么问题。
本节为非规范性内容。
默认情况下,只要 API 有先前获取的位置,它总是尝试返回缓存的位置。在此示例中,我们接受年龄不超过 10 分钟的位置。如果用户代理没有足够新鲜的缓存位置对象,它将自动获取一个新位置。
本节为非规范性内容。
如果您需要时间敏感的位置信息,您可以使用PositionOptions
的 timeout
成员来限制您愿意等待获取位置的时间。
本节为非规范性内容。
默认允许列表的
'self'
允许在同源嵌套框架中使用 API,但阻止第三方内容使用 API。
可以通过在
allow
="geolocation"
属性添加到
iframe
元素中,选择性地启用第三方使用:
或者,可以通过指定 HTTP 响应头在第一方上下文中禁用 API:
有关 Permissions-Policy
HTTP 标头的更多详细信息,请参见 权限策略。
本节为非规范性内容。
本规范中定义的 API 用于检索托管设备的地理位置信息。在几乎所有情况下,这些信息也会泄露设备用户的位置,从而可能会损害用户的隐私。
本节为非规范性内容。
地理位置 是一项 强大功能,需要最终用户的明确许可后才能与 Web 应用共享任何位置信息。该要求在检查权限步骤中得到规范性执行,getCurrentPosition
()
和
watchPosition
()
方法依赖于此。
最终用户通常通过用户界面给予明确许可,该界面通常提供一系列许可 有效期供用户选择。不同用户代理的许可 有效期有所不同,但通常基于时间(例如“一天”),或直到浏览器关闭,甚至可能允许用户选择无限期授予权限。许可 有效期决定了用户代理在该权限自动恢复为默认权限状态之前授予该权限的时间长度,随后在再次使用时提示最终用户做出新选择。
尽管权限有效期的粒度因用户代理而异,本规范建议用户代理默认将有效期限制为单个浏览会话(参见 3.4 检查使用 API 的权限 以获取规范要求)。
本节为非规范性内容。
本节适用于“接收者”,通常是指利用 地理位置 的开发者。虽然用户代理或本规范无法强制执行这些要求,但开发者需要仔细阅读本节,并尽最大努力遵守以下建议。开发者还需了解其管辖范围内可能有管理用户位置信息使用和访问的隐私法律。
接收者应仅在必要时请求位置信息,并且仅将位置信息用于提供该信息的任务。除非用户明确许可,任务完成后应处理位置信息。接收者还应采取措施防止未经授权访问此信息。如果存储位置信息,应允许用户更新和删除这些信息。
位置信息的接收者应避免在未经用户明确许可的情况下重新传输位置信息。重新传输时应小心,并鼓励使用加密。
接收者应清楚并显著地披露他们正在收集位置信息的事实、收集的目的、数据的保留时间、数据的安全性、数据共享情况(如果有)以及用户可以访问、更新和删除数据的方式,并说明用户对数据的其他选择。该披露应包括对上述指南的任何例外情况的说明。
本节为非规范性内容。
建议实施者考虑以下可能对用户隐私产生负面影响的方面:在某些情况下,用户可能无意中授予用户代理向网站披露其位置的权限。在其他情况下,某个 URL 托管的内容可能发生变化,以至于用户先前授予的位置权限不再适用。或者用户可能会改变主意。
预测或防止这些情况本质上是困难的。缓解和深入防御措施是实施者的责任,本规范未作规定。然而,在设计这些措施时,建议实施者使用户意识到位置共享的情况,并提供可撤销权限的用户界面。
地理位置 是一种默认强大功能,由 名称
"geolocation"
标识。
当检查使用 API 的权限时,用户代理可能会建议基于时间的权限有效期,例如“24 小时”或“1 周”,或者选择无限期记住该许可。但是,建议用户代理优先将权限有效期限制为单一会话:例如,直到环境被销毁、最终用户导航离开来源,或相关浏览器选项卡被关闭。
截至发布时,地理位置与安全性没有相关考虑。然而,建议读者阅读3. 隐私考虑。
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
);
Geolocation
的实例创建时带有以下表中的内部槽:
内部槽 | 描述 |
---|---|
[[cachedPosition]] |
一个 GeolocationPosition ,初始值为
null。它是对最后获取位置的引用,作为缓存使用。用户代理
可能会通过将[[cachedPosition]] 重置为 null 来逐出缓存中的位置。
|
[[watchIDs]] |
初始化为一个 列表,该列表包含unsigned long 类型的项。
|
getCurrentPosition
(successCallback,
errorCallback, options)
方法的步骤如下:
Document
不是
完全活动的:Document
不是
完全活动的:
POSITION_UNAVAILABLE
。
watchPosition
(successCallback,
errorCallback,options)
方法的步骤如下:
Document
不是
完全活动的:Document
不是
完全活动的:
POSITION_UNAVAILABLE
。
unsigned long
,其值大于 0。
[[watchIDs]]
。
要获取位置,传递 PositionCallback
successCallback,
PositionErrorCallback?
errorCallback,
PositionOptions
options,以及一个可选的
watchId。
[[watchIDs]]
不包含 watchId,
终止该算法。
EpochTimeStamp
。
timeout
的和。
[[cachedPosition]]
。
"geolocation"
的权限状态。
maximumAge
大于 0:
maximumAge
成员的值。
timestamp
的值大于
cacheTime,且
cachedPosition 的[[isHighAccuracy]]
等于
options 的 enableHighAccuracy
enableHighAccuracy
值在获取过程中。
double
,
表示地球表面的经度坐标,以度为单位,使用 [WGS84] 坐标系统。
经度衡量一个点距离本初子午线的远近。
double?
,
表示海拔高度,以米为单位,参考 [WGS84]
椭球,或如果不可用则为 null
。
海拔高度衡量海平面以上的高度。
double
,
表示以米为单位的 95% 置信度的精度值。精度衡量测得的坐标与真实位置的接近程度。
double?
,
表示海拔高度的精度,或如果不可用则为 null
,以米为单位,表示 95% 的置信度。
海拔精度衡量测得的海拔高度与真实海拔的接近程度。
double?
,
表示速度,以米每秒为单位,或如果不可用则为 null
。速度衡量设备的移动速度。
double?
,
表示航向,以度为单位,或如果不可用或设备静止不动则为 null
。航向衡量设备相对于真北的移动方向。
GeolocationPosition
,传递 positionData,acquisitionTime 和
options 的enableHighAccuracy
。
[[cachedPosition]]
设置为
position。
GeolocationPosition
,传递 acquisitionTime 和
options。enableHighAccuracy
。
[[cachedPosition]]
设置为 position。
report
"。
调用错误回调,传递
errorCallback 和
PERMISSION_DENIED
。
TIMEOUT
。
POSITION_UNAVAILABLE
。
当被指示 调用错误回调 时,给定一个
PositionErrorCallback?
callback 和一个
unsigned short
code:
GeolocationPositionError
实例,
其 code
属性初始化为 code。
report
" 一起 调用。
WebIDLdictionary PositionOptions
{
boolean enableHighAccuracy
= false;
[Clamp] unsigned long timeout
= 0xFFFFFFFF;
[Clamp] unsigned long maximumAge
= 0;
};
enableHighAccuracy
成员提供了一个提示,
表示应用程序希望接收最准确的位置信息。
该成员的预期用途是允许应用程序通知实现它们不需要高精度的地理位置数据,因此实现 可以 避免使用消耗大量电力的地理定位提供商
(例如 GPS)。
timeout
成员表示在获取位置超时前的最大时间,
以毫秒为单位。
等待文档变为可见以及
获取使用 API 的权限的时间不包括在
timeout
成员覆盖的时间内。
timeout
成员仅在开始获取位置时适用。
maximumAge
成员指示 Web 应用程序愿意接受的缓存位置的最大时间,
以毫秒为单位。
WebIDL[Exposed=Window, SecureContext]
interface GeolocationPosition
{
readonly attribute GeolocationCoordinates
coords
;
readonly attribute EpochTimeStamp timestamp
;
[Default] object toJSON
();
};
coords
属性包含地理坐标信息。
timestamp
属性表示设备获取地理位置的时间。
toJSON()
方法返回 GeolocationPosition
对象的 JSON 表示。
实例 GeolocationPositionError
具有以下表中所示的内部槽:
内部槽 | 描述 |
---|---|
[[isHighAccuracy]] |
一个 boolean 值,记录
enableHighAccuracy
成员的值,
当 GeolocationPosition 被创建时。
|
本规范定义了以下 任务源。
PositionCallback
和 PositionErrorCallback
。
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
;
[Default] object toJSON
();
};
属性 latitude 和 longitude 是以十进制度数表示的地理坐标。
latitude
和
longitude
属性表示根据 [WGS84] 坐标系统以度数表示的位置。
属性 accuracy
表示以米为单位的位置精度半径。
altitude
属性表示位置的高度,以米为单位,相对于 [WGS84] 椭球体。
altitudeAccuracy
属性表示高度精度,以米为单位(例如,10
米)。
heading
属性表示设备的行驶方向,以度为单位,0° ≤ heading <
360°,相对于真北顺时针计算。
speed
属性表示设备当前水平速度的大小,以米/秒为单位。
toJSON()
方法返回 GeolocationCoordinates
对象的 JSON 表示。
一个新的
GeolocationPosition
使用 映射
positionData, EpochTimeStamp
timestamp 和布尔值 isHighAccuracy 通过以下步骤构造:
GeolocationCoordinates
实例。
GeolocationPosition
实例,
其 coords
属性初始化为
coords,
timestamp
属性初始化为
timestamp, 其 [[isHighAccuracy]]
内部槽设置为
isHighAccuracy。
一个新的 GeolocationPosition
通过以下步骤使用
EpochTimeStamp
timestamp
和布尔值 isHighAccuracy 构造:
GeolocationCoordinates
实例:
latitude
属性为以十进制度数表示的地理坐标。
longitude
属性为以十进制度数表示的地理坐标。
accuracy
属性为非负实数。该值 应 对应于经纬度值的 95% 置信区间。
altitude
属性为 [WGS84] 椭球体以上的高度(以米为单位),
或者如果实现不能提供该信息,则为 null
。
altitudeAccuracy
属性为非负实数,如果实现无法提供高度信息,则为 null
。如果提供了高度精度信息,
它 应 对应于 95% 的置信水平。
speed
属性为非负实数,或如果实现无法提供速度信息,则为 null
。
heading
属性为度数,或如果实现无法提供航向信息,则为 null
。如果托管设备处于静止状态
(即 speed
属性的值为 0),则初始化
heading
为
NaN
。
GeolocationPosition
实例,
其 coords
属性初始化为
coords,timestamp
属性初始化为 timestamp,并且其 [[isHighAccuracy]]
内部槽设置为
isHighAccuracy。
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
(数值 1)
POSITION_UNAVAILABLE
(数值 2)
TIMEOUT
(数值 3)
message
属性是关于
code
属性的开发者友好型文本描述。
本规范定义了由标识符字符串 "geolocation"
表示的 策略控制特性。它的 默认许可列表 是 'self'。
除了标记为非规范性的章节外,所有的编写指南、图示、示例和注释在本规范中均为非规范性。规范中的其他内容为规范性。
本文档中的关键词 MAY、MUST、RECOMMENDED 和 SHOULD 应按 BCP 14 [RFC2119] [RFC8174] 中的解释进行理解, 且仅当它们以大写形式出现时,才按此解释。
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 EpochTimeStamp timestamp
;
[Default] object toJSON
();
};
[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
;
[Default] object toJSON
();
};
[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
属性,属于 GeolocationCoordinates
§9.1
altitude
属性,属于 GeolocationCoordinates
§9.2
altitudeAccuracy
属性,属于
GeolocationCoordinates
§9.2
[[cachedPosition]]
内部槽,属于
Geolocation
§6.1
clearWatch()
方法,属于
Geolocation
§6.4
code
属性,属于
GeolocationPositionError
§10.2
coords
属性,属于
GeolocationPosition
§8.1
enableHighAccuracy
成员,属于
PositionOptions
§7.1
geolocation
属性,属于
Navigator
§5.
Geolocation
接口
§6.
"geolocation"
§3.4
GeolocationCoordinates
接口
§9.
GeolocationPosition
接口
§8.
GeolocationPositionError
接口
§10.
getCurrentPosition
方法,属于 Geolocation
§6.2
heading
属性,属于
GeolocationCoordinates
§9.3
[[isHighAccuracy]]
内部槽,属于
GeolocationPosition
§8.4
latitude
属性,属于 GeolocationCoordinates
§9.1
longitude
属性,属于 GeolocationCoordinates
§9.1
maximumAge
成员,属于
PositionOptions
§7.3
message
属性,属于 GeolocationPositionError
§10.3
PERMISSION_DENIED
§10.1
POSITION_UNAVAILABLE
§10.1
PositionCallback
§6.
PositionErrorCallback
§6.
PositionOptions
字典
§7.
speed
属性,属于
GeolocationCoordinates
§9.4
timeout
成员,属于
PositionOptions
§7.2
TIMEOUT
§10.1
timestamp
属性,属于
GeolocationPosition
§8.2
[[watchIDs]]
内部槽,属于
Geolocation
§6.1
watchPosition
方法,属于
Geolocation
§6.3
EpochTimeStamp
allow
属性(针对 iframe
元素)
Document
)
iframe
元素
Document
)
list
)
list
)
map
)
list
)
list
)
boolean
类型
[Clamp]
扩展属性
[Default]
扩展属性
DOMString
接口
double
类型
[Exposed]
扩展属性
long
类型
object
类型
[SameObject]
扩展属性
[SecureContext]
扩展属性
undefined
类型
unsigned long
类型
unsigned short
类型
本部分为非规范性内容。
本规范基于业界的早期研究成果,包括 Aza Raskin、Google Gears Geolocation API 和 LocationAware.org 的研究工作。
同时也感谢 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 和 Mohamed Zergaoui 的贡献。
本部分为非规范性内容。
自2021年首次公开工作草案发布以来,地理位置 规范已做出了以下规范性更改:
自2016年第二版发布以来,本规范进行了以下实质性更改:
errorCallback
现在是可空的。callbacks
不再被视为 "EventHandler" 对象,而是仅作为 IDL 回调函数处理。[NoInterfaceObject]
,因此本规范中的
Geolocation
和其他接口现在位于全局作用域。此外,接口名称从 NavigatorGeolocation*
更改为
Geolocation*
。
有关更改的完整列表,请参见 提交历史。
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:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in: