原文连接:
https://blog.csdn.net/michael_ouyang/article/details/54378338
--------------------------------------------------------------------
在上一篇文章,解决ios 10不能定位的问题,把navigator.geolocation.getCurrentPosition 改成使用第三方api进行定位
http://blog.csdn.net/michael_ouyang/article/details/54137709
本文继续讲述原生webkit内核的navigator.geolocation.getCurrentPosition获取到的坐标信息,并且如何解密。为什么要解密,原因下面会进行讲解!
首先讲解一下navigator.geolocation.getCurrentPosition的使用方法:
-
/**
-
* @param geolocationSuccess 定位成功的回调函数
-
* @param geolocationError 定位失败的回调函数
-
* @param [geolocationOptions]设置对象
-
*/
-
navigator.geolocation.getCurrentPosition(geolocationSuccess, geolocationError, [geolocationOptions]);
简单的使用示例:
-
// 定位成功的回调函数
-
var onSuccess = function(position) {
-
alert('Latitude: ' + position.coords.latitude + '\n' +
-
'Longitude: ' + position.coords.longitude + '\n' +
-
'Altitude: ' + position.coords.altitude + '\n' +
-
'Accuracy: ' + position.coords.accuracy + '\n' +
-
'Altitude Accuracy: ' + position.coords.altitudeAccuracy + '\n' +
-
'Heading: ' + position.coords.heading + '\n' +
-
'Speed: ' + position.coords.speed + '\n' +
-
'Timestamp: ' + position.timestamp + '\n');
-
};
-
// 定位失败的回调函数
-
function onError(error) {
-
alert('code: ' + error.code + '\n' + 'message: ' + error.message + '\n');
-
}
-
navigator.geolocation.getCurrentPosition(onSuccess, onError);
为什么获取到了坐标了还需要解密?
百度api对此进行了解释,链接:http://lbsyun.baidu.com/index.php?title=open/question
那么说明了一点:坐标都是经过加密处理的
如果直接使用navigator.geolocation.getCurrentPosition获取到的坐标信息,是加密的坐标信息,直接使用的话,会明显出现偏差,偏差范围大概在几公里左右!!!那么跟没定位有什么区别╮(╯_╰)╭
这里使用百度的api进行解密:
-
/**
-
* 真实经纬度转成百度坐标
-
* @param gpsPoint 传入百度BMap对象
-
* @param 0 0:代表GPS
-
* @param translateCallback 真实坐标转换成百度坐标的回调函数
-
*/
-
BMap.Convertor.translate(gpsPoint,0, translateCallback);
完整示例:
●注意:使用百度地图api,首要需要到百度api官网申请百度地图密钥
附申请方法:http://jingyan.baidu.com/article/363872eccda8286e4aa16f4e.html
1、在页面引入js
HTML:
-
<script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=6yAoynmTPNlTBa8z1X4LfwGE"></script>
-
<script type="text/javascript" src="http://developer.baidu.com/map/jsdemo/demo/convertor.js"></script>
2、这里已经已经封装好成函数,使用可以直接复制
js:
-
function getlocation() {
-
if (window.navigator.geolocation) {
-
//设置参数
-
var options = {
-
enableHighAccuracy: true,
-
timeout: 10000,
-
};
-
window.navigator.geolocation.getCurrentPosition(handleSuccess, handleError, options);
-
} else {
-
//alert("无法获取地理位置信息");
-
}
-
}
-
/**
-
* 执行window.navigator.geolocation.getCurrentPosition()函数后成功的回调
-
* @param position 返回一个真实坐标对象position
-
*/
-
function handleSuccess(position){
-
var lng = position.coords.longitude; //经度
-
var lat = position.coords.latitude; //纬度
-
//通过百度地图api对象封装真实的经纬度
-
var gpsPoint = new BMap.Point(lng,lat);
-
/ **
-
* 真实坐标转换成百度坐标的回调函数
-
* 通过百度坐标得到地址描述
-
* @param point 回调百度坐标对象point
-
*/
-
translateCallback = function (point){
-
var myGeo = new BMap.Geocoder();
-
// 根据百度坐标得到地址描述
-
myGeo.getLocation(new BMap.Point(point.lng,point.lat), function(result){
-
if (result){
-
// PS:改成你需要执行的函数
-
alert(result.address);
-
}
-
else{
-
// PS:改成你需要执行的函数
-
alert("定位失败,请重新定位");
-
}
-
});
-
}
-
setTimeout(function(){
-
/**
-
* 真实经纬度转成百度坐标
-
* @param gpsPoint 传入百度BMap对象
-
* @param 0 0:代表GPS,也可以是2:google坐标
-
* @param translateCallback 真实坐标转换成百度坐标的回调函数
-
*/
-
BMap.Convertor.translate(gpsPoint,0, translateCallback);
-
}, 2000);
-
}
-
/* 失败的回调 */
-
function handleError(error){
-
// PS:改成你需要执行的函数
-
alert("获取位置信息失败,请重新定位");
-
}