天天看點

打卡功能從分析到實作,地理圍欄,gps定位,百度地圖定位

 一,需求分析

 從思路分析,給定一個固定的打卡地點,綁定一個事件,觸發打卡。

首先,你需要查閱地圖,對經緯度有一定的了解,才友善以下操作。

  • 擷取你自身的位置,擷取固定打卡地點。地理圍欄簡單的了解就是判斷點是否在圓圈内。
  • 如何知道自身以及打卡地點的準确位置(誤差不是很大),
  • 對比自身位置到打卡地點的距離,進行判斷。

二,了解額外的知識

比如上面描述的經緯度概念,其次,說起定位,肯定第一時間去找百度地圖,高德地圖,騰訊地圖等等。

百度地圖和高德地圖都有各自的API,相信大家可以好好看看,我在這裡隻是簡單地應用,舉例為百度地圖。

H5有查詢地理位置的API,可以擷取到自身的經緯度。我們在百度地圖上可以找到自己的位置,但是H5擷取的經緯度放在百度地圖上 坐标反查 卻有很大的 誤差,因為什麼呢。

因為坐标系不一樣,我們自己擷取的坐标系是 火星坐标系 ! 百度坐标系上面是 把火星坐标系 經過一套算法(不知)加密而得到的 坐标系 ,那麼我們應該怎麼做呢。百度地圖  有自己的 API ,坐标轉換, 可以把其他的坐标系轉化為 百度坐标。 把轉化的坐标在坐标反查中的定位就很準确了,定位的誤差也會很大的減少。

三,代碼實作

<script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=你申請的密鑰"></script>

<body>
			<p id="demo">點選按鈕擷取您目前坐标(可能需要比較長的時間擷取):</p>
			<button onclick="getLocation()">點選打卡</button>
		</body>
		<script type="text/javascript">
			//擷取到自身經緯度
			var x = document.getElementById("demo");

			function getLocation() {
				if(navigator.geolocation) {
					navigator.geolocation.getCurrentPosition(showPosition);
				} else {
					x.innerHTML = "該浏覽器不支援擷取地理位置。";
				}
			}

			function showPosition(position) {
				//			x.innerHTML = "緯度: " + position.coords.latitude +
				//				"<br>經度: " + position.coords.longitude;
				$.get({
					url: 'http://api.map.baidu.com/geoconv/v1/?coords=' + position.coords.longitude + ',' + position.coords.latitude + '&from=1&to=5&ak=你申請的密鑰',
					type: 'get',
					dataType: 'jsonp',
					jsonp: 'callback',
					jsonpCallback: 'callback',
					contentType: 'application/json;charset=utf-8',
					success: function(result) {
						//得到的百度地圖
//						alert(result.result[0].x + ',' + result.result[0].y) 
						var bd_lng = result.result[0].x;//獲得自身所處位置的經度
						var bd_lat = result.result[0].y;//獲得自身所處位置的緯度
						alert(bd_lng+','+bd_lat)
					},
					error: function(err) {
						//				console.log(err)
					}
				})

			}
		</script>
           

得到了 自己 在百度地圖上的經緯度,再進行下一步

四,計算距離

借助百度地圖API,提供了計算兩個地點,經緯度距離的計算公式,帶入就得到 距離,誤差是有的,不會太大,親測。