地理位置

W3C 推荐

关于本文档的更多详细信息
当前版本:
https://www.w3.org/TR/2024/REC-geolocation-20240815/
最新发布版本:
https://www.w3.org/TR/geolocation/
最新编辑草案:
https://w3c.github.io/geolocation/
历史记录:
https://www.w3.org/standards/history/geolocation/
提交历史
测试套件:
https://wpt.live/geolocation/
实现报告:
https://w3c.github.io/geolocation/reports/implementation.html
编辑:
Marcos Cáceres (Apple Inc.)
Reilly Grant (Google)
前编辑:
Andrei Popescu (Google Inc.)
反馈:
GitHub w3c/geolocation (拉取请求新问题开放问题)
勘误表:
存在勘误
浏览器支持:
caniuse.com

另请参见 翻译


摘要

地理位置提供与托管设备相关的地理位置信息访问。

本文档状态

本节描述了本文档在发布时的状态。当前 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 流程文件管理。

1. 引言

本节为非规范性内容。

地理位置 定义了一个与托管实现的设备相关的位置信息的高级接口。常见的位置信息来源包括全球定位系统(GPS)和从网络信号(如 IP 地址、RFID、WiFi 和蓝牙 MAC 地址以及 GSM/CDMA 小区 ID)推断出的位置信息,以及用户输入。API 本身对底层位置信息来源不加区分,且不能保证 API 返回设备的实际位置。

如果最终用户授予权限地理位置

1.1 范围

本节为非规范性内容。

本规范仅限于提供一个脚本 API,用于检索与托管设备相关的地理位置信息。地理位置信息根据世界大地测量系统坐标 [WGS84] 提供。它不包括提供任何形式的标记语言,也不包括定义用于构建标识地理位置的 URL 的新 URL 方案。

2. 示例

本节为非规范性内容。

API 旨在支持“一次性”位置请求和重复位置更新。以下示例展示了常见的用例。

2.1 获取当前位置

本节为非规范性内容。

请求用户的当前位置。如果用户允许,您将收到一个位置对象。

2.2 监听位置

本节为非规范性内容。

请求监听用户的当前位置。如果用户允许,您将收到用户位置的连续更新。

2.3 停止监听位置

本节为非规范性内容。

通过调用clearWatch() 方法,停止监听位置变化。

2.4 处理错误

本节为非规范性内容。

当发生错误时,watchPosition()getCurrentPosition() 方法的第二个参数会收到一个 GeolocationPositionError 错误, 这可以帮助您弄清楚可能出了什么问题。

2.5 使用 maximumAge 作为缓存控制

本节为非规范性内容。

默认情况下,只要 API 有先前获取的位置,它总是尝试返回缓存的位置。在此示例中,我们接受年龄不超过 10 分钟的位置。如果用户代理没有足够新鲜的缓存位置对象,它将自动获取一个新位置。

2.6 使用 timeout

本节为非规范性内容。

如果您需要时间敏感的位置信息,您可以使用PositionOptionstimeout 成员来限制您愿意等待获取位置的时间。

2.7 在第三方上下文中启用 API

本节为非规范性内容。

默认允许列表'self' 允许在同源嵌套框架中使用 API,但阻止第三方内容使用 API。

可以通过在 allow="geolocation" 属性添加到 iframe 元素中,选择性地启用第三方使用:

或者,可以通过指定 HTTP 响应头在第一方上下文中禁用 API:

有关 Permissions-Policy HTTP 标头的更多详细信息,请参见 权限策略

3. 隐私考虑

本节为非规范性内容。

本规范中定义的 API 用于检索托管设备的地理位置信息。在几乎所有情况下,这些信息也会泄露设备用户的位置,从而可能会损害用户的隐私。

3.2 位置信息接收者的隐私考虑

本节为非规范性内容。

注意:开发者对该敏感数据的责任

本节适用于“接收者”,通常是指利用 地理位置 的开发者。虽然用户代理或本规范无法强制执行这些要求,但开发者需要仔细阅读本节,并尽最大努力遵守以下建议。开发者还需了解其管辖范围内可能有管理用户位置信息使用和访问的隐私法律。

接收者应仅在必要时请求位置信息,并且仅将位置信息用于提供该信息的任务。除非用户明确许可,任务完成后应处理位置信息。接收者还应采取措施防止未经授权访问此信息。如果存储位置信息,应允许用户更新和删除这些信息。

位置信息的接收者应避免在未经用户明确许可的情况下重新传输位置信息。重新传输时应小心,并鼓励使用加密。

接收者应清楚并显著地披露他们正在收集位置信息的事实、收集的目的、数据的保留时间、数据的安全性、数据共享情况(如果有)以及用户可以访问、更新和删除数据的方式,并说明用户对数据的其他选择。该披露应包括对上述指南的任何例外情况的说明。

3.3 实施考虑

本节为非规范性内容。

建议实施者考虑以下可能对用户隐私产生负面影响的方面:在某些情况下,用户可能无意中授予用户代理向网站披露其位置的权限。在其他情况下,某个 URL 托管的内容可能发生变化,以至于用户先前授予的位置权限不再适用。或者用户可能会改变主意。

预测或防止这些情况本质上是困难的。缓解和深入防御措施是实施者的责任,本规范未作规定。然而,在设计这些措施时,建议实施者使用户意识到位置共享的情况,并提供可撤销权限的用户界面。

3.4 检查使用 API 的权限

地理位置 是一种默认强大功能,由 名称 "geolocation" 标识。

检查使用 API 的权限时,用户代理可能会建议基于时间的权限有效期,例如“24 小时”或“1 周”,或者选择无限期记住该许可。但是,建议用户代理优先将权限有效期限制为单一会话:例如,直到环境被销毁、最终用户导航离开来源,或相关浏览器选项卡被关闭。

4. 安全性考虑

截至发布时,地理位置与安全性没有相关考虑。然而,建议读者阅读3. 隐私考虑

6. Geolocation 接口与回调

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
);

6.1 内部槽

Geolocation 的实例创建时带有以下表中的内部槽:

内部槽 描述
[[cachedPosition]] 一个 GeolocationPosition,初始值为 null。它是对最后获取位置的引用,作为缓存使用。用户代理 可能会通过将[[cachedPosition]]重置为 null 来逐出缓存中的位置。
[[watchIDs]] 初始化为一个 列表,该列表包含unsigned long 类型的

6.2 getCurrentPosition() 方法

getCurrentPosition(successCallback, errorCallback, options) 方法的步骤如下:

  1. 如果 当前设置对象相关全局对象关联的Document 不是 完全活动的 如果 this相关全局对象关联的Document 不是 完全活动的
    1. 调用错误回调,传递 errorCallbackPOSITION_UNAVAILABLE
    2. 终止该算法。
  2. 请求位置,传递 thissuccessCallbackerrorCallback,和 options

6.3 watchPosition() 方法

watchPosition(successCallbackerrorCallbackoptions) 方法的步骤如下:

  1. 如果 当前设置对象相关全局对象关联的 Document 不是 完全活动的 如果 this相关全局对象关联的 Document 不是 完全活动的
    1. 调用错误回调,传递 errorCallbackPOSITION_UNAVAILABLE
    2. 返回 0。
  2. watchId 为一个 实现定义unsigned long,其值大于 0。
  3. watchId 附加到 this[[watchIDs]]
  4. 请求位置,传递 thissuccessCallbackerrorCallbackoptions,以及 watchId
  5. 返回 watchId

6.6 获取位置

获取位置,传递 PositionCallback successCallbackPositionErrorCallback? errorCallbackPositionOptions options,以及一个可选的 watchId

  1. 如果传递了 watchId,且 this[[watchIDs]] 不包含 watchId, 终止该算法。
  2. acquisitionTime 成为一个表示当前时间的新的 EpochTimeStamp
  3. timeoutTime 设置为 acquisitionTimeoptionstimeout 的和。
  4. cachedPosition 设置为 this[[cachedPosition]]
  5. 创建一个特定于实现的 timeout 任务,该任务在 timeoutTime 到期时尝试通过运行以下步骤获取设备的位置:
    1. permission 设置为获取当前权限状态"geolocation" 的权限状态。
    2. 如果 permission 为 "denied":
      1. 停止 timeout
      2. 执行用户或系统拒绝权限的失败处理步骤。
    3. 如果 permission 为 "granted":
      1. position 设置为 null。
      2. 如果 cachedPosition 不为 null,且 optionsmaximumAge 大于 0:
        1. cacheTime 设置为 acquisitionTime 减去 optionsmaximumAge 成员的值。
        2. 如果 cachedPositiontimestamp 的值大于 cacheTime,且 cachedPosition[[isHighAccuracy]] 等于 optionsenableHighAccuracy, 将 position 设置为 cachedPosition :
          1. 地理定位任务源上排队一个任务, 其步骤是调用 successCallback 并传递 « cachedPosition » 和 "report"。
          2. 终止该算法。
      3. 否则,如果 position 不为 cachedPosition,则尝试从底层系统获取位置信息,选择性地考虑 optionsenableHighAccuracy 值在获取过程中。
      4. 如果在获取过程中 timeout 到期或获取设备位置信息失败:
        1. 停止 timeout
        2. 转到处理失败
        3. 终止该算法。
      5. 如果从系统获取位置信息成功:
        1. positionData 设置为根据获取的位置信息数据创建的一个有序映射,其包含以下名称/值对:
          "longitude"
          一个double, 表示地球表面的经度坐标,以度为单位,使用 [WGS84] 坐标系统。 经度衡量一个点距离本初子午线的远近。
          "altitude"
          一个double?, 表示海拔高度,以米为单位,参考 [WGS84] 椭球,或如果不可用则为 null。 海拔高度衡量海平面以上的高度。
          "accuracy"
          一个非负的double, 表示以米为单位的 95% 置信度的精度值。精度衡量测得的坐标与真实位置的接近程度。
          "altitudeAccuracy"
          一个非负的double?, 表示海拔高度的精度,或如果不可用则为 null,以米为单位,表示 95% 的置信度。 海拔精度衡量测得的海拔高度与真实海拔的接近程度。
          "speed"
          一个非负的double?, 表示速度,以米每秒为单位,或如果不可用则为 null。速度衡量设备的移动速度。
          "heading"
          一个double?, 表示航向,以度为单位,或如果不可用或设备静止不动则为 null。航向衡量设备相对于真北的移动方向。
        2. position 设置为一个新的 GeolocationPosition,传递 positionDataacquisitionTimeoptionsenableHighAccuracy
        3. this[[cachedPosition]] 设置为 position
        1. position 设置为新的 GeolocationPosition,传递 acquisitionTimeoptionsenableHighAccuracy
        2. 当前对象[[cachedPosition]] 设置为 position
      6. 停止 timeout
      7. 地理定位任务源上排队一个任务, 其步骤是调用successCallback 并传递 « position » 和 "report"。
    处理失败:
    • 如果获取位置失败,则根据匹配失败的条件执行以下操作之一:
      用户或系统拒绝权限:

      调用错误回调,传递 errorCallbackPERMISSION_DENIED

      注意: 浏览器权限 VS 操作系统权限
      超时已到:
      调用错误回调,传递 errorCallbackTIMEOUT
      数据获取错误或任何其他原因:
      调用错误回调,传递 errorCallbackPOSITION_UNAVAILABLE

6.7 调用错误回调

当被指示 调用错误回调 时,给定一个 PositionErrorCallback? callback 和一个 unsigned short code

  1. 如果 callback 为 null,返回。
  2. error 成为一个新创建的 GeolocationPositionError 实例, 其 code 属性初始化为 code
  3. 地理定位任务源排队一个任务,该任务包含一个步骤, 该步骤将 callback 与 « error » 和 "report" 一起 调用

7. PositionOptions 字典

WebIDLdictionary PositionOptions {
      boolean enableHighAccuracy = false;
      [Clamp] unsigned long timeout = 0xFFFFFFFF;
      [Clamp] unsigned long maximumAge = 0;
    };

7.1 enableHighAccuracy 成员

enableHighAccuracy 成员提供了一个提示, 表示应用程序希望接收最准确的位置信息。 该成员的预期用途是允许应用程序通知实现它们不需要高精度的地理位置数据,因此实现 可以 避免使用消耗大量电力的地理定位提供商 (例如 GPS)。

注意:关于 enableHighAccuracy 的警告

7.2 timeout 成员

timeout 成员表示在获取位置超时前的最大时间, 以毫秒为单位。

注意:超时时间何时计算?

等待文档变为可见以及 获取使用 API 的权限的时间不包括在 timeout 成员覆盖的时间内。 timeout 成员仅在开始获取位置时适用。

注意:立即取消

7.3 maximumAge 成员

maximumAge 成员指示 Web 应用程序愿意接受的缓存位置的最大时间, 以毫秒为单位。

8. GeolocationPosition 接口

WebIDL[Exposed=Window, SecureContext]
    interface GeolocationPosition {
      readonly attribute GeolocationCoordinates coords;
      readonly attribute EpochTimeStamp timestamp;
      [Default] object toJSON();
    };

8.1 coords 属性

coords 属性包含地理坐标信息。

8.2 timestamp 属性

timestamp 属性表示设备获取地理位置的时间。

8.3 toJSON() 方法

toJSON() 方法返回 GeolocationPosition 对象的 JSON 表示。

8.4 内部槽

实例 GeolocationPositionError 具有以下表中所示的内部槽:

内部槽 描述
[[isHighAccuracy]] 一个 boolean 值,记录 enableHighAccuracy 成员的值, 当 GeolocationPosition创建时。

8.5 任务源

本规范定义了以下 任务源

geolocation 任务源
本规范用于在执行 位置请求时, 排队处理非阻塞的 PositionCallbackPositionErrorCallback

9. GeolocationCoordinates 接口

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

9.1 latitude, longitudeaccuracy 属性

属性 latitudelongitude 是以十进制度数表示的地理坐标。 latitudelongitude 属性表示根据 [WGS84] 坐标系统以度数表示的位置。 属性 accuracy 表示以米为单位的位置精度半径。

9.2 altitudealtitudeAccuracy 属性

altitude 属性表示位置的高度,以米为单位,相对于 [WGS84] 椭球体。

altitudeAccuracy 属性表示高度精度,以米为单位(例如,10 米)。

9.3 heading 属性

heading 属性表示设备的行驶方向,以度为单位,0° ≤ heading < 360°,相对于真北顺时针计算。

9.4 speed 属性

speed 属性表示设备当前水平速度的大小,以米/秒为单位。

9.5 toJSON() 方法

toJSON() 方法返回 GeolocationCoordinates 对象的 JSON 表示。

9.6 构造 GeolocationPosition

一个新的 GeolocationPosition 使用 映射 positionData, EpochTimeStamp timestamp 和布尔值 isHighAccuracy 通过以下步骤构造:

  1. coords 是一个新创建的 GeolocationCoordinates 实例。
  2. 对于每一个 keyvaluepositionData 中:
    1. coords 的名为 key 的属性设置为 value
  3. 返回一个新创建的 GeolocationPosition 实例, 其 coords 属性初始化为 coordstimestamp 属性初始化为 timestamp, 其 [[isHighAccuracy]] 内部槽设置为 isHighAccuracy

一个新的 GeolocationPosition 通过以下步骤使用 EpochTimeStamp timestamp 和布尔值 isHighAccuracy 构造:

  1. coords 是一个新创建的 GeolocationCoordinates 实例:
    1. 初始化 coordlatitude 属性为以十进制度数表示的地理坐标。
    2. 初始化 coordlongitude 属性为以十进制度数表示的地理坐标。
    3. 初始化 coordaccuracy 属性为非负实数。该值 对应于经纬度值的 95% 置信区间。
    4. 初始化 coordaltitude 属性为 [WGS84] 椭球体以上的高度(以米为单位), 或者如果实现不能提供该信息,则为 null
    5. 初始化 coordaltitudeAccuracy 属性为非负实数,如果实现无法提供高度信息,则为 null。如果提供了高度精度信息, 它 对应于 95% 的置信水平。
    6. 初始化 coordspeed 属性为非负实数,或如果实现无法提供速度信息,则为 null
    7. 初始化 coordheading 属性为度数,或如果实现无法提供航向信息,则为 null。如果托管设备处于静止状态 (即 speed 属性的值为 0),则初始化 headingNaN
  2. 返回一个新创建的 GeolocationPosition 实例, 其 coords 属性初始化为 coordstimestamp 属性初始化为 timestamp,并且其 [[isHighAccuracy]] 内部槽设置为 isHighAccuracy

10. GeolocationPositionError 接口

WebIDL[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;
    };

10.1 常量

PERMISSION_DENIED (数值 1)
请求位置失败,原因是用户拒绝了使用 API 的权限 或请求是在 非安全上下文 中发出的
POSITION_UNAVAILABLE (数值 2)
获取位置失败。
TIMEOUT (数值 3)
用户代理在指定的时间内未能成功 获取位置,超时。

10.2 code 属性

code 属性返回其被初始化时的值(见10.1 常量了解可能的值)。

10.3 message 属性

message 属性是关于 code 属性的开发者友好型文本描述。

注意: 不要将 .message 显示给用户!

11. 权限策略

本规范定义了由标识符字符串 "geolocation" 表示的 策略控制特性。它的 默认许可列表'self'

12. 一致性

除了标记为非规范性的章节外,所有的编写指南、图示、示例和注释在本规范中均为非规范性。规范中的其他内容为规范性。

本文档中的关键词 MAYMUSTRECOMMENDEDSHOULD 应按 BCP 14 [RFC2119] [RFC8174] 中的解释进行理解, 且仅当它们以大写形式出现时,才按此解释。

A. IDL 索引

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;
};

B. 索引

B.1 本规范定义的术语

B.2 引用定义的术语

C. 鸣谢

本部分为非规范性内容。

本规范基于业界的早期研究成果,包括 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 的贡献。

D. 变更日志

本部分为非规范性内容。

自2021年首次公开工作草案发布以来,地理位置 规范已做出了以下规范性更改:

自2016年第二版发布以来,本规范进行了以下实质性更改:

有关更改的完整列表,请参见 提交历史

E. 参考文献

E.1 规范性参考文献

[hr-time]
高精度时间. Yoav Weiss. W3C. 2023年7月19日. W3C 工作草案. URL: https://www.w3.org/TR/hr-time-3/
[html]
HTML 标准. Anne van Kesteren; Domenic Denicola; Ian Hickson; Philip Jägenstedt; Simon Pieters. WHATWG. 现行标准. URL: https://html.spec.whatwg.org/multipage/
[infra]
基础设施标准. Anne van Kesteren; Domenic Denicola. WHATWG. 现行标准. URL: https://infra.spec.whatwg.org/
[Permissions]
权限. Marcos Caceres; Mike Taylor. W3C. 2024年3月19日. W3C 工作草案. URL: https://www.w3.org/TR/permissions/
[permissions-policy]
权限策略. Ian Clelland. W3C. 2024年7月24日. W3C 工作草案. URL: https://www.w3.org/TR/permissions-policy-1/
[RFC2119]
在RFC中使用的指示要求等级的关键词. S. Bradner. IETF. 1997年3月. 最佳当前实践. URL: https://www.rfc-editor.org/rfc/rfc2119
[RFC8174]
RFC 2119中大写与小写关键词的歧义. B. Leiba. IETF. 2017年5月. 最佳当前实践. URL: https://www.rfc-editor.org/rfc/rfc8174
[webidl]
Web IDL 标准. Edgar Chen; Timothy Gu. WHATWG. 现行标准. URL: https://webidl.spec.whatwg.org/
[WGS84]
世界大地测量系统 1984 (WGS 84). 国家地理空间情报局测绘办公室. 2008年. URL: https://earth-info.nga.mil/index.php?dir=wgs84&action=wgs84