您的位置:首页 > Web前端 > HTML5

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

2017-03-01 19:00 906 查看
【本文源址: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 地图