首页 > 解决方案 > W3C 地理定位返回缓存坐标

问题描述

我有一个 Chrome 扩展程序,它使用 W3C Geolocation API 来获取用户的位置。该扩展主要用于 Chromebook。

我注意到,即使我将 maximumAge 参数设置为 0,API 似乎大多数时候都返回相同的坐标(缓存?)。我通过在位置 #1 的 Chromebook 上部署扩展来测试这一点,然后使用设备到位置 #2,大约 1 公里外。在那里再次调用 API 并返回与以前相同的坐标。过了一会儿(我每隔 10 分钟就有一次)它返回了正确的坐标,但是当我回到位置 #1 时,我再次从位置 #2 获得了缓存坐标。

我尝试了getCurrentPosition,watchPosition和选项对象的几种组合,但它似乎总是产生相同的结果。

我目前的代码如下:

function getGeolocation() {
  return new Promise((resolve, reject) => {
    const options = { enableHighAccuracy: true, timeout: 30000, maximumAge: 0 };
    navigator.geolocation.getCurrentPosition(resolve, reject, options);
  });
}

getGeolocation()
  .then(position => handler(position))
  .catch(err => console.error(err));

我需要它在第一次尝试时或在合理的短时间内返回正确的坐标。有什么建议吗?

谢谢!

编辑:

请注意,在浏览器的传感器选项卡中更改坐标每次都能完美运行,但在实际情况下,它似乎在大多数情况下只是返回缓存的结果。

编辑(11 月 5 日):

经过更多测试后,这似乎只发生在 Chrome OS 上。我们无法在 PC 上重现相同的行为(有或没有扩展)。

标签: google-chromegoogle-chrome-extensionw3c-geolocation

解决方案


这是我在探索W3C Geolocation API 时收集的一些信息。

首先,我在页面底部运行了Wikipedia示例代码。它与您的代码几乎相同,只有您使用Promise。从那里,我使用getCurrentPosition()方法获得了位置、纬度经度。方法watchPosition()也有效。

我在我的 PC 上对此进行了测试,并在 Chrome 开发者控制台中显示了结果。它也可以在我的手机上四处走动(最后几位数字随着纬度和经度而变化)。

关于PositionOptions 接口,从您的选项中读取,允许从调用 getCurrentPosition() 或 watchPosition() 直到调用 successCallback 的等待时间为 30000 毫秒(30 秒),并且因为 maximumAge 为 0,它不会使用缓存相反,它必须立即尝试获取新的位置对象。

现在是重要的部分。


enableHighAccuracy提供应用程序希望获得最佳结果的提示。但是有一些方法可以确定(查看开头的维基百科文章,滚动到“位置来源”):

  1. GPS(全球定位系统) - 它具有最高的精度;在大多数 Android 智能手机中,精度可达 10 米。

  2. 手机跟踪- 如果使用没有内置 GPS 芯片的手机或无线调制解调器,则使用此功能。

  3. WiFi定位系统

  4. IP 地址位置

还有位置精度,它给出了以为单位的精度。在我的电脑上,我得到了大约 100 000 米的精度,因此它不是有效的纬度和经度(在谷歌地图上搜索,输入“纬度,经度”并查看标记指向的位置。另外,console.log(position.coords.accuracy ))。在我的手机上,我得到了大约 15 - 50 米。

智能手机使用 GPS 位置信息,而 PC 使用网络位置。我不是很喜欢 Chromebook,但我找到了这个答案:

当前的 Chromebook 没有 GPS 功能。但是您可以让网站知道您的位置。如果您将 Google 用作手机上的默认搜索引擎,则默认情况下您的位置将用于您在 Google 上的搜索。如果您让 Chrome 与某个网站共享您的位置,Chrome 会向 Google 位置服务发送信息以估计您的位置。然后,Chrome 可以与需要您位置的网站共享该信息。

还有其他收集位置的方法,请参阅Google Maps Geolocation API。另外,尝试搜索这两者之间的差异。希望这对您有所帮助。

此致。


推荐阅读