温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

地理定位(一)

发布时间:2020-04-09 06:24:04 来源:网络 阅读:535 作者:ghcomeon 栏目:移动开发

Geolocation可以实现对访客地理定位,当然,这种定位并不是说判断用户在那个国家,或是哪个国家的哪个城市,而是确定用户在城市的那个街道上,甚至是用户正在拿着手机在哪里上网,给出这个地点的坐标位置。

下面列出了支持地理定位的浏览器


IE
Firefox
Chrome
Safari
Opera
Safari iOS
Andriod
最低版本
9
3.5
5
3
10.6
3.2
2.1

问题最严重仍然是IE“老大哥”,比如IE7、IE8,要想在浏览器上实现地理定位功能,可以借助Google Gears,Google Gears只是对老版本浏览器的一个补救措施,Google现放弃对它的维护。补救的方法是:像安装其它浏览器插件一样,让访客在自己的浏览器上安装Google Gears。如果访客计算机中没有安装Google Gears,还可以使用Chrome Fram,或是让访客自己输入当前位置。

地理定位的基本原理

   为了得到用户的位置信息,浏览器会争取位置提供商(location provider)的帮助。比如Firefox浏览器使用的是Google Location Services。当然,即使浏览器支持地理定位功能,如果你不允许,也不会把你的位置透漏给浏览器。

   对于通过网线(不是无线)上网的桌面计算机来说,办法很简单,就是定位不太准确。用户一上网,他的信息就会通过双绞线在计算机或本地网上传输。这个设备有唯一的IP地址(注意地理定位不使用局域网内的私有IP地址),靠这个IP就能在Internet上找到他。与IP地址对应,还有一个现实中的邮政编码。

   位置提供商会把这两个信息综合起来。首先,找到你连接的IP地址,然后,确定使用该IP地址的路由器的位置。因为这个信息是间接的,所以使用桌面计算机的地理定位并不准确,但毕竟可以确定你所在的街道的位置。

   如果使用笔记本或是移动设备无线上网,位置提供商会寻找你附近的无线接入点。理想情况下,位置提供商会查询一个大型数据库,以确定你周围几个接入点的确切位置,然后再使用三角测量法算出你的位置。

   如果是使用手机上网,位置提供商还会采用类似的三角测量法,但是使用的信号发射塔的位置。经过迅速而相对准确的计算,最终得到的位置误差大约在1000米左右。如果在高楼林立的市中心,由于信号发射塔相对较多,地理定位的结果也会更准确。

   还有很多的移动设备都配有专用的GPS组件,GPS使用的是卫星定位,误差只有几米。但GPS速度慢,耗电多。而且GPS在高楼林立的地区不好使,因为高大的建筑会屏蔽信号。

   另外还有其它的技术可以用于地理定位。位置提供商会想更多的办法获得位置信息,比如RFID芯片、蓝牙设备以及Google Maps设置的cookie等。

   注意,无论你通过什么方式上网—就算是台式机,地理定位都可以大概找到你。而如果使用能接受电话信号或是配有GPS芯片的设备,地理定位的坐标的准确性更是惊人。

查找访客的坐标

地理定位的功能实际上是非常简单的,主要就是navigator.geolocation对象的三个方法:

  • getCurrentPosition();

  • watchPosition();

  • clearWatch();

getCurrentPosition()方法取得访客的位置。当然,查找位置不会立即返回结果,浏览器也不想锁定页面等待位置数据。所以getCurrentPosition()方法是异步,它会立即执行,但不会阻塞其它的代码。完成地理定位后,它会触发另一段代码来处理返回的结果。

   测试地理定位的时候,需要使用支持地理定位的浏览器(我使用的Firefox),并且允许网页访问你的数据。在学会使用错误处理和地理定位设置的知识。

错误处理

如果访客不愿意共享他们的位置数据,那地理定位就不会返回位置信息。在这样的情况下,根本不会调用完成函数,而页面也没有办法告诉你浏览器是在继续挖掘数据,还是遇到了错误。为解决这个问题,可以在调用getCurrentPosition()时传入两个参数,第一个是函数在页面成功取得数据时调用,第二个函数在地理定位因错误而终止时调用。

以下是一个同时传入完成函数和错误函数的例子:

window.onload = function() {
  results = document.getElementById("results");
  var myOptions = {
    zoom: 13,
    mapTypeId: google.maps.MapTypeId.ROADMAP
  };
  map = new google.maps.Map(document.getElementById("mapSurface"), myOptions);
  if (navigator.geolocation) {
    navigator.geolocation.getCurrentPosition(
      geolocationSuccess, geolocationFailure
    );
    results.innerHTML = "定位已开始.";
  } else {
    results.innerHTML = "该浏览器不支持地理定位";
  }
};
function geolocationSuccess(position) {
results.innerHTML = "你的位置("+position.coords.latitude+","+position.coords.longitude+")";
}
function geolocationFailure(positionError) {
    results.innerHTML =
     "地理定位失败";
}

   调用错误函数时,浏览器会给错误函数传入一个错误对象,这个对象有两个属性:code和message。code属性是一个数值,表示问题类型;message中包含着对问题的简短描述。一般来说,message属性多用于测试,而code属性用于确定如何进行下一步的处理。下面是修改后的错误函数,检测了code属性所有可能的值:

function geolocationFailure(positionError) {
  if (positionError.code == 1) {
    results.innerHTML =
     "你已拒绝位置信息共享";
  }
  else if (positionError.code == 2) {
    results.innerHTML =
     "网络连接失败或位置服务不可用。";
  }
  else if (positionError.code == 3) {
    results.innerHTML =
     "获取位置超时,请重试。";
  }
  else {
    results.innerHTML =
     "Sorry !发生未知的错误。";
  }
}


向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI