百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 文章教程 > 正文

让 HTML5 来为你定位

yund56 2025-04-26 20:23 19 浏览

Geolocation

HTML5 的 geolocation是一个令人兴奋的 API,通过这套 API,Javascript 代码就能够访问到用户的当前位置。当然,访问之前必须得到用户的明确认可,即同意在页面共享位置。如果页面尝试访问地理位置信息,浏览器就会显示一个对话框,请求用户许可共享其地理位置信息,比如这样:

用户同意(允许)之后,Geolocation 的 api 就能起作用了。

getCurrentPosition 方法

Geolocation API 在浏览器中的实现是 navigator.geolocation对象,这个对象包含 3 个方法。第一个方法是 getCurrentPosition,调用这个方法就会触发请求用户共享地理定位信息的对话框。这个方法接收 3 个参数:成功回调函数,可选的失败回调函数和可选的选项对象。

其中,成功回调函数会接收到一个 Position 对象参数,该对象有两个属性:coords 和 timestamp。而 coords 对象中将包含下列与位置相关的信息。

  • latitude:以十进制度数表示的维度
  • longtitude:以十进制度数表示的经度
  • accuracy:经纬度坐标的精度,以米为单位

有些浏览器可能会在 coords 对象中提供如下属性。

  • altitude:以米为单位的海拔高度,如果没有相关数据则值为 null
  • altitudeAccuracy:海拔高度的精度,以米为单位,数值越大越不精确
  • heading:指南针的方向,0°表示正北,值为 NaN 表示没有检测到数据
  • speed:速度,即每秒移动多少米,如果没有相关数据则值为 null

说了这么多,我们来简单应用下,写一段代码获取当前的经纬度,然后输出:

navigator.geolocation.getCurrentPosition(geo_success, geo_error);

function geo_success(position) {
  console.log(position.coords.latitude, position.coords.longitude);
}

function geo_error(msg) {
  console.log(msg.code, msg.message);
}

代码很简单,如果请求成功了就执行 geo_success 函数,打印经纬度,如果失败了,输出一些信息(失败回调)。

getCurrentPosition 的第二个参数,即失败回调函数,在被调用的时候也会接收到一个参数。这个参数是一个对象,包含两个属性:message 和 code。其中,message 属性中保存着给人看的文本消息,解释为什么会出错,而 code 属性中保存着一个数值,表示错误的类型:用户拒绝共享(1),位置无效(2)或者超时(3)。实际开发中,大多数 Web 应用只会讲错误消息保存到日志文件中,而不一定会修改用户界面。

我们在 PC 端的 chrome 浏览器中执行这段代码,结果是令人遗憾的:

掐指一算,估计是被墙了... 事实上,以 Chrome 浏览器为例,如果您允许 Chrome 浏览器与网站共享您的位置,Chrome 浏览器会向 Google 位置服务(此环节被墙)发送本地网络信息,估计您所在的位置。然后,浏览器会与请求使用您位置的网站共享您的位置。

接着在 Android 机上测试了下,没被墙,毕竟谷歌是 Android 的亲爹啊。打印出来的信息如下:

31.188199 121.632919

当然只是知道经纬度或许不太那么直观,如果能把位置显示在地图上那就直观多了!这里我用了高德地图的API(猛戳这里看效果):




  
  
  
  

在手机上打开后:

我的天哪!实在是太准了!如果我把代码里的 zoom 参数再加大点,能精确到小区了...当然,这并不奇怪,因为这本来就是高德地图百度地图定位的一部分嘛。

事实上,getCurrentPosition 还有第三个参数,该参数是一个选项对象,用于设定信息的类型。可以设置的选项有三个:enableHighAccuracy 是一个布尔值,表示必须尽可能使用最精确的位置信息;timeout 是以毫秒数表示的等待位置信息的最长时间;maximumAge 表示上一次取得的坐标信息的有效时间,以毫秒表示,如果时间到则重新取得新坐标信息。

除非确实需要非常精确的信息,否则建议保持 enableHighAccuracy 的 false 值(默认值)。将这个选项设置为 true 需要更长的时候,而且在移动设备上更耗电。类似的,如果不需要频繁更新用户的位置信息,那么可以将 maximumAge 设置为 Infinity,从而始终都使用上一次的坐标信息。

navigator.geolocation.getCurrentPosition(locationSuccess, locationError, {
  // 指示浏览器获取高精度的位置,默认为false
  enableHighAcuracy: true,
  // 指定获取地理位置的超时时间,默认不限时,单位为毫秒
  timeout: 5000,
  // 最长有效期,在重复获取地理位置时,此参数指定多久再次获取位置。
  maximumAge: 3000
});

watchPosition 方法

如果要跟踪用户的位置,那么可以使用 watchPosition 方法。这个方法的使用和 getCurrentPosition 完全相同。实际上 watchPosition 与定时调用 getCurrentPosition 能得到相同效果。在第一次调用 watchPosition 方法后,会取得当前位置,执行成功回调或者错误回调。然后,watchPosition 就地等待系统发出位置已改变的信号。

调用 watchPosition 会返回一个数值标识符,用于跟踪监控的操作。基于这个返回值可以取消监控操作,只要将其传递给 clearWatch 方法即可(与使用 setTimeout() 和 clearTimeout() 类似),例如:

var watchId = navigator.geolocation.watchPosition(geo_success, geo_error);
clearWatch(watchId);

Geolocation 定位原理

Geolocation API 的数据来源可能是 GPS、IP 地址、RFID、WiFi、蓝牙 MAC 地址、GSM/CDMA 卡 ID 等。因为 Geolocation API 是运行在你本地设备上的。所以,在使用 VPN 或代理的情况下,Geo API 仍能获得你准确的 IP 地址信息(除非因为某些因素浏览器获取不到这些信息)。

在HTML5的实现中,手机等移动设备当然优先使用GPS定位,而笔记本和部分平板,最准的定位是WIFI,至于网线上网的台式机,一般就只能使用IP来定位了,这个准确度最低。

相关推荐

了解计算机网络90个常见概念

计算机网络系列篇第一篇:90个常见概念定义如下:主机:计算机网络上任何一种能够连接网络的设备都被称为主机或者说端系统,比如手机、平板电脑、电视、游戏机、汽车等,随着5G的到来,将会有越来越多的终...

数控技巧:数控常用工艺术语(英文名称)

1工艺基本概念1.1一般概念1.1.1数控加工:numericalcontrolmachining根据被加工零件图样和工艺要求,编制成以数码表示的程序输入到机床的数控装置或控制计算机中,以...

常用模具零件广东术语,不会怎么混天下?

广东属最早引进模具工业地方之一,在工业界模具被称为永不衰败的行业,由于各师各法,广东各地对模具称呼的术语很多,有些不知怎译!!!为方便大家对模具术语交流,小编给大家整理了模具零件在广东的常用术语。深圳...

开发人员自我提升 - 软件开发技术术语表

开发工具与环境IDE(集成开发环境)VisualStudioCodeIntelliJIDEAEclipsePyCharmVersionControl(版本控制)GitSVNMercuria...

程序员术语趣味解释(1)

1.hotfixhotfix通常指的是一种紧急修复措施,用于解决已知的、严重的问题,比如安全漏洞、程序崩溃等。hotfix并不会包含任何新的功能或升级,它只是一个小型的程序补丁,能够快速而且有针对性地...

挑战 50 年霸主 C 语言:新语言 Hare,“异端”中的保守派

Hare原意为野兔,它的开发者希望这种编程语言能够如野兔般拥有顽强的生命力。本周,软件开发者DrewDeVault公布了一种名为Hare的全新系统编程语言,并用“简单、稳定和健壮”作为核心...

Python必须掌握的核心术语和概念,涵盖语法、编程范式和常用工具

以下是学习**Python**必须掌握的核心术语和概念,涵盖语法、编程范式和常用工具:---###**一、基础语法**1.**变量(Variable)**-存储数据的容器,无需声明类型,如...

编程中最难的事:如何命名

如何命名,其实是编程中最难的事。乔治·奥威尔的命名规范如何命名?简言之,根据语意来选择词汇,别无它法……然而,有时我们会不知用什么词汇更合适。当你想到某个抽象的东西,你更倾向于最先想到的词语,除非你故...

计算机网络的 166 个核心概念,你知道吗?

上回我整理了一下计算机网络中所有的关键概念,很多小伙伴觉得很有帮助,但是有一个需要优化的点就是这些概念不知道出自哪里,所以理解起来像是在云里穿梭,一会儿在聊应用层的概念,一会儿又跑到网络层协议了。针对...

黑客主要术语?什么是木马?什么是肉鸡?

本节将对常见的一些黑客术语进行简单的介绍1.肉鸡所谓肉鸡是一种很形象的比喻,比喻那些可以随意被控制的电脑,对方可以是各种电脑包括但不限于个人电脑,服务器等,在某种情况黑客进攻时会用他们干扰敌人。对直接...

计算机网络的 89 个核心概念

计算机网络中的概念也是非常庞杂,理解起来比较困难,所以这里,我给大家汇总了计算机网络中89个常见的概念,希望对你有所帮助。主机:计算机网络上任何一种能够连接网络的设备都被称为主机或者说端系统,比如...

开发人员自我提升 - 软件开发专业术语表

AAbstractClass(抽象类)-一种不能被实例化的类,用作其他类的模板Agile(敏捷开发)-一种迭代的软件开发方法论Algorithm(算法)-解决特定问题的一系列明确的...

Python编程术语词汇表(一)

这是一个非官方的Python编程术语表,是日常编程实践以及网络收藏所得的内容集合。Iteration迭代Loopingoveraniterableobject.遍历可迭代对象。Afor...

计算机领域有哪些高大上的术语描述的是很简单的事物?

云计算说白了就是服务器租赁,服务器在网线另一头,你也不用知道具体在哪,如远在天边的云。好比你想打网页小游戏,只想玩一次。你不会为此买个电脑、耳麦,再开通个宽带。你可能会去网吧,按时付费。网吧有按小时...

AI能代替你阅读吗

来源:科技日报原标题:AI能代替你阅读吗信息爆炸的当下,高校学生的阅读场景正经历着颠覆性变革——借助AI工具,他们不仅可以快速拓展通识阅读知识面,还可以轻松完成课堂上的深度思考作业,不用翻开书页就能...