HTML5地理位置定位Geolocation-API及Haversine地理空间距离算法

Posted 刻刻帝丶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HTML5地理位置定位Geolocation-API及Haversine地理空间距离算法相关的知识,希望对你有一定的参考价值。

tip:有问题或者需要大厂内推的+我脉脉哦:丛培森 ٩( ‘ω’ )و

【本文源址:http://blog.csdn.net/q1056843325/article/details/59115526 转载请添加该地址】

html5提供了Geolocation-API允许我们获取地理位置坐标
不过只有针对特定的需求才会用到
比如说地图应用

一般还是很少用到的

#Geolocation-API
使用的方法也很简单
API都存在于navigator.geolocation对象的原型上

核心的方法就是getCurrentPostion和watchPosition
##getCurrentPosition
navigator.geolocation.getCurrentPosition方法有三个参数

  • success 获取位置信息成功的回调函数(必须)
  • error 获取位置信息失败的回调函数
  • options 配置信息参数对象
navigator.geolocation.getCurrentPosition(function(pos)
  console.log(pos);//获取位置信息对象Geoposition
);

这时浏览器就会发起询问
因为毕竟位置信息也算是隐私信息

这里我们点击允许共享位置信息就可以了
然后Chrome就会向Google位置服务发送本地网络信息
(由于国内封杀了谷歌,所以我们只有翻墙才能获取到位置信息〒▽〒)

可以在控制台内给我们返回的位置信息

  • coord 坐标
    • accuracy 定位精准度(单位m)
    • altitude 海拔
    • altitudeAccuracy 海拔精准度(单位m)
    • heading 方向
    • latitude 纬度
    • longitude 经度
    • speed 速度
  • timestamp 时间戳

不过这个坐标并不是十分精确(特别是PC端)
它可能源于IP地址、GPS、Wifi定位等等


navigator.geolocation.getCurrentPosition(function(pos)
  console.log(pos);
,function(err)
  console.log(err);
);

我们可以设置第二个参数当获取地理位置信息错误时做出一些处理

navigator.geolocation.getCurrentPosition(function(pos)
  console.log(pos);
,function(err)
  console.log(err); //获取错误对象PositionError
);

比如我现在拒绝共享位置信息

  • code = 1 表示用户拒绝
  • code = 2 表示无法获取
  • code = 3 表示连接超时

第三个参数用于设置配置信息

navigator.geolocation.getCurrentPosition(function(pos)
  console.log(pos);
,function(err)
  console.log(err);
,
  enableHighAccuracy: true,
  timeout: 5000,
  maximumAge: 3000
);
  • enableHighAccuracy 是否需要高精度位置 默认false
  • timeout 设置请求超时时间(单位ms) 默认infinity不限时
  • maximumAge 位置信息过期时间(单位ms) 默认0:无条件获取新的地理位置信息
    • 在重复获取地理位置watchPosition时,该参数指定多久再次获取位置

##watchPosition
watchPosition与getCurrentPosition参数都是一样的
区别在于watchPosition是不停的获取位置信息
比如我们使用的定位软件
我们在跑步时位置不断变更,就需要不断的重绘定位
这样每当坐标发生变化,就会调用success回调函数

而且watchPosiiton会返回一个watchID
我们可以通过clearWatch(warchID)取消监听
类似于取消定时器

var ID = navigator.geolocation.watchPosition(function(pos)
  ...
,function(err)
  ...
,
  ...
);
navigator.geolocation.clearWatch(ID);

如果clearWatch不带参数
则清除所有watchPosition

#Haversine算法
我们有些时候
可能需要获取两点的距离
比如说订餐APP的获取附近商家
这时我们就可以利用Haversine算法来计算

function toRadians(degree) 
  return degree * Math.PI / 180;

function haversine(latitude1, longitude1, latitude2, longitude2) 
  var R = 6371;
  var deltaLatitude = toRadians(latitude2-latitude1);
  var deltaLongitude = toRadians(longitude2-longitude1);
  latitude1 = toRadians(latitude1);
  latitude2 = toRadians(latitude2);
  var a = Math.sin(deltaLatitude/2) * Math.sin(deltaLatitude/2) +
    Math.cos(latitude1) * Math.cos(latitude2) *
    Math.sin(deltaLongitude/2) * Math.sin(deltaLongitude/2);
  var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
  var d = R * c;
  return d;

传入两点的坐标就可以得到地理空间距离
其中var R = 6371;是地球半径6371km
当然了也存在一些其他算法
在时间和精确度上有所不同
关于Haversine可以查看Wiki百科:传送门

主页传送门

以上是关于HTML5地理位置定位Geolocation-API及Haversine地理空间距离算法的主要内容,如果未能解决你的问题,请参考以下文章

HTML5 Geolocation(地理定位)简介

前端HTML5 地理位置定位(HTML5 Geolocation)原理及应用

哪些网络浏览器支持通过 HTML5 进行地理定位?

基于浏览器的HTML5地理定位

捕获 html5 地理定位事件

HTML5 Geolocation位置信息定位总结