W3C地理定位返回缓存的坐标

rok*_*rok 6 google-chrome google-chrome-extension w3c-geolocation

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

我注意到API似乎在大多数情况下返回相同的坐标(缓存?),即使我将maximumAge参数设置为0.我通过在位置#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));
Run Code Online (Sandbox Code Playgroud)

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

谢谢!

编辑:

要注意的是,浏览器传感器选项卡中的坐标更改每次都能正常工作,但在实际情况下,它似乎在大多数情况下都会返回缓存结果.

编辑(11月5日):

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

Din*_*har 1

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

首先,我运行了页面底部的维基百科示例代码。它与您的代码几乎相同,只是您使用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。另外,尝试搜索这两者之间的差异。希望这有任何帮助。

此致。