1. 程式人生 > >ios如何獲取gps座標(定位第二節)

ios如何獲取gps座標(定位第二節)

在上一篇文章,解決ios 10不能定位的問題,把navigator.geolocation.getCurrentPosition 改成使用第三方api進行定位

本文繼續講述原生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);


為什麼獲取到了座標了還需要解密?


那麼說明了一點:座標都是經過加密處理的

如果直接使用navigator.geolocation.getCurrentPosition獲取到的座標資訊,是加密的座標資訊,直接使用的話,會明顯出現偏差,偏差範圍大概在幾公里左右!!!那麼跟沒定位有什麼區別╮(╯_╰)╭

這裡使用百度的api進行解密:

/**
 * 真實經緯度轉成百度座標
 * @param gpsPoint		傳入百度BMap物件
 * @param 0			0:代表GPS
 * @param translateCallback	真實座標轉換成百度座標的回撥函式
 */
BMap.Convertor.translate(gpsPoint,0, translateCallback); 


完整示例:

●注意:使用百度地圖api,首要需要到百度api官網申請百度地圖金鑰

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("獲取位置資訊失敗,請重新定位"); 
}