原文連接:
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("獲取位置信息失敗,請重新定位");
-
}
?
?