google-chrome - 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 上重现相同的行为(有或没有扩展)。
解决方案
这是我在探索W3C Geolocation API 时收集的一些信息。
首先,我在页面底部运行了Wikipedia示例代码。它与您的代码几乎相同,只有您使用Promise。从那里,我使用getCurrentPosition()方法获得了位置、纬度和经度。方法watchPosition()也有效。
我在我的 PC 上对此进行了测试,并在 Chrome 开发者控制台中显示了结果。它也可以在我的手机上四处走动(最后几位数字随着纬度和经度而变化)。
关于PositionOptions 接口,从您的选项中读取,允许从调用 getCurrentPosition() 或 watchPosition() 直到调用 successCallback 的等待时间为 30000 毫秒(30 秒),并且因为 maximumAge 为 0,它不会使用缓存相反,它必须立即尝试获取新的位置对象。
现在是重要的部分。
enableHighAccuracy提供应用程序希望获得最佳结果的提示。但是有一些方法可以确定(查看开头的维基百科文章,滚动到“位置来源”):
GPS(全球定位系统) - 它具有最高的精度;在大多数 Android 智能手机中,精度可达 10 米。
手机跟踪- 如果使用没有内置 GPS 芯片的手机或无线调制解调器,则使用此功能。
WiFi定位系统
- 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。另外,尝试搜索这两者之间的差异。希望这对您有所帮助。
此致。
推荐阅读
- python - 推送通知不适用于推送通知时间
- c# - c#为较小的图像生成缩略图
- less - 使用 extract-text-webpack-plugin,样式(less,scss)不起作用
- c++ - C++ - 俄罗斯方块碎片(使用数组)
- verilog - Verilog 测试台中的信号未从初始状态继续前进
- typo3 - Typo3:控制器和 HTML 模板之间的缓存
- vba - 关闭工作簿会破坏变量吗?
- android - Android Facebook Login Sdk:getActivity().getCallingActivity() 从他们的 LoginFragment.class 返回 null
- javascript - 提交功能上的 Ajax 不起作用
- vba - 在与“Dim”相同的行上使用“=”时预期语句结束