HTML5 Geolocation

定位用户的位置

HTML5 Geolocation API 用于获得用户的地理位置。

鉴于该特性可能侵犯用户的隐私,除非用户同意,否则用户位置信息是不可用的。

注意: Geolocation(地理定位)对于拥有 GPS 的设备,比如 iPhone,地理定位更加精确。

geography 地理; location 位置; Geo+location 地理位置; current 现在;

getCurrentPosition() 方法 - 返回数据

T若成功,则 getCurrentPosition() 方法返回对象。始终会返回 latitude、longitude 以及 accuracy 属性。如果可用,则会返回其他下面的属性。

属性 描述
coords.latitude 十进制数的纬度
coords.longitude 十进制数的经度
coords.accuracy 位置精度
coords.altitude 海拔,海平面以上以米计
coords.altitudeAccuracy 位置的海拔精度
coords.heading 方向,从正北开始以度计
coords.speed 速度,以米/每秒计
timestamp 响应的日期/时间

HTML5 - 使用地理定位

请使用 getCurrentPosition() 方法来获得用户的位置。

下例是一个简单的地理定位实例,可返回用户位置的经度和纬度:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Geolocation</title>
</head>
<body>
<button onclick="getLocation()">点击获取地理位置</button>
<p>数据信息:</p>
<p id="demo"></p>
<script>
var x=document.getElementById("demo"); function getLocation()
{
//检测是否支持地理定位
if (navigator.geolocation)
{
navigator.geolocation.getCurrentPosition(updatPos,errorLoca);
}
else
{
x.innerHTML="该浏览器不支持获取地理位置。";
}
}
//处理数据并显示
function updatPos(position){
var latitude = position.coords.latitude;//十进制单位
var longitude = position.coords.longitude;//十进制单位
var accuracy = position.coords.accuracy;//以m为单位制定纬度和经度与实际位置的差距
var timestamp = position.timestamp;//时间戳
var date = new Date(timestamp);//时间格式 console.log('经度坐标' + latitude.toFixed(2)); //保留两位小数
console.log('纬度坐标' + longitude.toFixed(2));
console.log('准确度' + accuracy);
console.log('获取位置数据的时间' + date); x.innerHTML = "纬度: " + latitude.toFixed(2) + "<br>经度: " + longitude.toFixed(2);
}
function errorLoca(error){
var str = "";
switch(error.code){
case 0:
str ='位置信息获取失败,失败原因'+error.message;break;
case 1://错误编码 PERMISSION_DENIED
str ='用户拒绝共享其位置信息';break;
case 2://错误编码 POSITION_UNAVAILABLE
str = '尝试获取用户位置数据,但失败了' ;break;
case 3://错误编码 TIMEOUT
str = '尝试获取用户的位置数据超时' ;break;
}
console.log(str);
console.warn('ERROR(' + error.code + '): ' + error.message);
x.innerHTML = str;
}
</script>
</body>
</html>

实例解析:

  • 检测是否支持地理定位
  • 如果支持,则运行 getCurrentPosition() 方法。如果不支持,则向用户显示一段消息。
  • 如果getCurrentPosition()运行成功,则向参数updatPos中规定的函数返回一个position参数
  • 如果getCurrentPosition()运行失败,则向参数errorLoca中规定的函数返回一个error参数
  • updatPos() 函数获得并显示经度和纬度
  • errorLoca() 函数提示错误信息

Geolocation 对象 - 其他有趣的方法

watchPosition() - 返回用户的当前位置,并继续返回用户移动时的更新位置(就像汽车上的 GPS)。

clearWatch() - 停止 watchPosition() 方法

下面的例子展示 watchPosition() 方法。您需要一台精确的 GPS 设备来测试该例(比如 iPhone):

实例

var x=document.getElementById("demo");
function getLocation()
{
if (navigator.geolocation)
{
navigator.geolocation.watchPosition(showPosition);
}
else
{
x.innerHTML="该浏览器不支持获取地理位置。";
}
}
function updatPos(position)
{
x.innerHTML="纬度: " + position.coords.latitude +
"<br>经度: " + position.coords.longitude;
}

遇到问题以及解决方案

本机运行代码时,默认启动Chrome浏览器,每次点击获取地理位置按钮时,反应很慢需要等待许久。

得到报错如下图:

通过查阅资料了解到失败的几种原因。

Chrome控制台提示的错误:Network location provider at 'https://www.googleapis.com/' : No response received.

Chrome浏览器接入的定位服务在国外,有较大的限制,也会造成定位失败,且失败率较高。

换成系统自带的IE浏览器,完美运行

再尝试使用火狐浏览器运行,也成功定位

定位出现失败的原因

1. 第一种情况

浏览器不支持原生定位接口,如IE较低版本的浏览器,message字段包含Browser not Support html5 geolocation信息。

2. 第二种情况

用户禁用了定位权限,需要用户开启定位权限,message字段包含Geolocation permission denied

3. 第三种情况

浏览器禁止了非安全域的定位请求,比如Chrome、IOS10已经陆续禁止,需要升级站点到HTTPS,message字段包含Geolocation permission denied信息。注意:Chrome不会禁止localhost域名HTTP协议下的定位。

4. 第四种情况

浏览器定位超时,包括原生的超时,可以适当增加超时属性的设定值以减少这一现象。某个别浏览器本身对定位接口的友好程度较弱,也会超时返回失败,message字段包含Geolocation time out信息。

5. 第五种情况

Chrome、Firefox以及一些套壳浏览器接入的定位服务在国外,有较大的限制,也会造成定位失败,且失败率较高。

HTML5(五)Geolocation的更多相关文章

  1. 使用html5的Geolocation API实现定位

    公司有个需求,需要获取用户的位置,所以看了下html5的Geolocation 这个新东西,发现挺好用的. <!DOCTYPE html> <html> <body> ...

  2. HTML5 中 Geolocation 获取地理位置的原理是什么?

    http://www.zhihu.com/question/20473051?sort=created geolocation的位置信息来源包括GPS.IP地址.RFID.WIFI和蓝牙的MAC地址. ...

  3. HTML5五种客户端离线存储方案

    最近折腾HTML5游戏需要离线存储功能,便把目前可用的几种HTML5存储方式研究了下,基于HT for Web写了个综合的实例,分别利用了Cookie.WebStorage.IndexedDB以及Fi ...

  4. 玩转html5(五)---月球绕着地球转,地球绕着太阳转(canvas实现,同样可以动哦)

    关于运动速度的参数与真实速度有点差距,大家可以自行调整 <!DOCTYPE html> <html> <head> <meta http-equiv=&quo ...

  5. 开玩笑html5(五岁以下儿童)---绕地球月球,地球绕太阳运动(canvas实现,同样可以移动哦)

    请珍惜劳动小编成果,这篇文章是原来小编,转载请注明出处. 速度的參数与真实速度有点差距.大家能够自行调整 <!DOCTYPE html> <html> <head> ...

  6. HTML5(五)——Canvas API

    什么是 Canvas API? Canvas API(画布)提供了一个通过 javascript 和 html 的 canvas 元素来在网页上实时绘制图形的方式.可用于动画.游戏.图标.图片编辑等多 ...

  7. 基于 html5 geolocation来获取经纬度地址(copy)

    geolocation来获取经纬度地址 以前如果要获取互联网用户所在地都是根据用户的IP地址来获取地理位置,这样获取到的数据和真实数据有很大的偏差.为了获取更加精确的位置,可以使用了html5的geo ...

  8. HTML5 Geolocation用来定位用户的位置。

    HTML5 Geolocation用来定位用户的位置. 定位用户的位置 HTMl5 Geolocation API用来得到用户的地理位置. 由于这个可能和个人隐私相关.除非用户同意否则不能使用. 浏览 ...

  9. HTML5 Geolocation(地理位置)

    HTML5 Geolocation(地理位置).是用来定位用户的位置的. HTML5 Geolocation API 用于获得用户的地理位置,鉴于该特性可能侵犯用户的隐私权,除非用户同意,否则不能获取 ...

  10. 你必须知道的28个HTML5特征、窍门和技术

    注意:每周有那么几次,此列表会更新一些新的窍门,最终,本文会成为超级有用的资源.//zxx:丑话说在前头,我可没功夫更新,所以,即使到您女儿出嫁那天,本文还是28项内容 前端的发展如此之迅猛,一不留神 ...

随机推荐

  1. 信道估计(channel estimation)图解——从SISO到MIMO原理介绍

    1. 引言 在所有通信中,信号都会通过一个介质(称为信道),并且信号会失真,或者在信号通过信道时会向信号中添加各种噪声.正确解码接收到的信号而没有太多错误的方法是从接收到的信号中消除信道施加的失真和噪 ...

  2. kubernetes pod内抓包,telnet检查网络连接的几种方式

    背景 在日常kubernetes的运维中,经常遇到pod的网络问题,如pod间网络不通,或者端口不通,更复杂的,需要在容器里面抓包分析才能定位.而kubertnets的场景,pod使用的镜像一般都是尽 ...

  3. 搞清楚C语言指针

    Part 0:为什么要写这篇文章 C语言中的指针是C语言的精髓,也是C语言的重难点之一. 然而,很少有教程能把指针讲的初学者能听懂,还不会引起歧义. 本文章会尝试做到这一点,如有错误,请指出. Par ...

  4. iOS-Code Data的快速体验

    Code Data Core Data 是iOS SDK 里的一个很强大的框架,允许程序员以面向对象的方式储存和管理数据.使用Core Data框架,程序员可以很轻松有效地通过面向对象的接口管理数据 ...

  5. akka-typed(7) - cluster:sharding, 集群分片

    在使用akka-typed的过程中发现有很多地方都简化了不少,变得更方便了,包括:Supervision,只要用Behaviors.supervise()把Behavior包住,很容易就可以实现这个a ...

  6. activeMQ从入门到简单集群指南

    1.什么是amq MQ是消息中间件,基于JAVA的JMS消息服务机制来传递信息. 2.mq的作用 MQ给程序之间提供了一个缓冲,避免了在程序交互频繁的情况下,提高程序性能瓶颈和数据的可靠性 3.mq怎 ...

  7. uni-app动态修改顶部导航栏标题

    动态修改顶部导航栏标题有两种方法方式一.使用自定义到导航栏,覆盖原生导航栏 缺点:自定义到导航栏性能远远不如原生导航栏,手机顶部状态栏区域会被页面内容覆盖,这是因为窗体是沉浸式的原因,即全屏可写内容: ...

  8. css3动画的实例讲解

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  9. mingw32 exception在sjlj与dwarf差别-反汇编分析

    sjlj (setjump/longjump)与dwarf-2为mingw32两种异常处理模型的实现.sjlj有着开销,而随linux发行的mingw32开发库包都是用sjlj版编译的,而Qt却采用d ...

  10. Dubbo——服务调用过程

    文章目录 引言 服务的交互 服务降级 集群容错 服务调用 服务端接收请求 总结 引言 经过之前文章的铺垫,现在可以来分析服务的交互调用过程了. 服务的交互 服务降级 从名字上看我们不难理解MockCl ...