国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Uniapp實現(xiàn)微信小程序跑步運動軌跡、歷史軌跡和軌跡回放等功能

這篇具有很好參考價值的文章主要介紹了Uniapp實現(xiàn)微信小程序跑步運動軌跡、歷史軌跡和軌跡回放等功能。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

一、先看效果

【跑跑步】微信小程序


二、實現(xiàn)功能

? ? ? ? 【跑跑步】是一款基于Uniapp開發(fā)的微信小程序,主要實現(xiàn)了跑步軌跡記錄、歷史軌跡、軌跡糾偏、軌跡回放和軌跡排名等功能。室內(nèi)跑步記錄正在開發(fā),還沒有發(fā)布,主要利用手機(jī)加速度傳感器實現(xiàn)計步功能。更多干貨請關(guān)注公眾號:小蠅工作室

1、軌跡記錄

????????軌跡記錄主要用到微信小程序的startLocationUpdateBackground和onLocationChange兩個API接口,該接口實現(xiàn)了前后臺GPS定位,連續(xù)采集用戶的跑步定位信息,然后通過map組件把軌跡繪制出來。

//前后臺定位接口
wx.startLocationUpdateBackground(callback) {
    var that = this;
    success(res) {
        //開始監(jiān)聽GPS數(shù)據(jù)
        that.onLocationChange();
    },
    fail(res) {
        //授權(quán)失敗后引導(dǎo)用戶打開定位信息
		...				
    }
})

//監(jiān)聽GPS數(shù)據(jù)的變化
onLocationChange() {
	var that = this;
	var points = [];
	var paths = [];
	wx.onLocationChange(function(res) {
		res.time = Date.now();
		points.push(res);
		that.latitude = res.latitude;
		that.longitude = res.longitude;
		if (that.scale = 3) {
			that.scale = 18;
		}

		paths = filterGPSPoints(points);
		paths = douglasPeucker(paths, 3);
		that.playRunAudio();
		uni.setStorage({
			key: 'gps',
			data: JSON.stringify(paths),
			success: function(e) {
				//console.log(e);
			},
			fail: function(e) {
				console.log(e)
			}
		});
	});
}

//繪制跑步軌跡
addLine(points) {
	var that = this;
	//計算距離
	function calculationDistance(ps) {
		var LC = 0;
		ps.forEach(function(f, index) {
			let lng1 = f.longitude;
			let lat1 = f.latitude;
			let lng2 = f.longitude;
			let lat2 = f.latitude;
			if (ps[index + 1]) {
				lng2 = ps[index + 1].longitude;;
				lat2 = ps[index + 1].latitude;
			}
			let radLat1 = lat1 * Math.PI / 180.0;
			let radLat2 = lat2 * Math.PI / 180.0;
			let a = radLat1 - radLat2;
			let b = (lng1 * Math.PI / 180.0) - (lng2 * Math.PI / 180.0);
			let s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) +
				Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(b / 2), 2)));
			LC = LC + s * 6370996.81
		})
		that.LC = (LC / 1000).toFixed(3);
		that.SD = (LC * 3.6 / (that.time)).toFixed(2);
	};

	calculationDistance(points);

	const taskLine = { //路線
		points: points, //經(jīng)緯度數(shù)組
		color: '#00ff00', //線的顏色
		width: 5, //線的寬度
		borderWidth: 1, //線的厚度
		dottedLine: false, //是否虛線
		arrowLine: true //帶箭頭的線 開發(fā)者工具暫不支持該屬性
	}
	this.polyline[0] = taskLine;
}

其中:filterGPSPoints方法用于過濾GPS飄逸點數(shù)據(jù),douglasPeucker方法用于抽稀GPS數(shù)據(jù),addLine方法繪制跑步軌跡。

2、軌跡回放

軌跡回放功能的實現(xiàn)主要通過moveAlong方法實現(xiàn),設(shè)置的參數(shù)包括marker點的ID,軌跡線路和動畫長度。本文實現(xiàn)了在軌跡回放時候切換三維場景,然后自動旋轉(zhuǎn)等特效。

moveAlong() {
	var that = this;
	var duration = 10000;
	var durationMove = 50;
	var markerId = 10;

	var js = TimeTotimestamp(that.JS);
	var sd = that.SD;
	var lc = that.LC;

	that.startNum = 2;
	that.isShowMyRunRecord = false;
	that.isShowMyWeRun = false;

	if (this.MapContext) {
		this.MapContext.moveAlong({
			markerId: markerId,
			autoRotate: false,
			path: this.polyline[0].points,
			duration: duration, //假設(shè)動畫執(zhí)行5秒
			success(res) { // ios是開始動畫就會執(zhí)行,安卓手機(jī)是在動畫結(jié)束后執(zhí)行success 

				that.removeAlong();
				that.startName = "開始";
				that.startNum = 0;
				that.isShowMyRunRecord = true;
				that.isShowMyWeRun = true;
				that.isShowShare = true;
			}
		});

		var i = 0;
		var tt = 10;
		that.startName = tt;
		that.endS = setInterval(function() {
			tt--;
			that.startName = tt;
		}, 1000);

		var durationZH = duration / durationMove;
		that.rotateDH = setInterval(function() {
			i++;
			if (i < 40) {
				that.skew = i;
			}
			that.rotate = (270 / durationZH) * i;
			that.startName = tt;
			that.LC = ((js / durationZH) * i * (sd / 3600)).toFixed(3);
			that.JS = TimeToHFS((js / durationZH) * i);
		}, durationMove);
	}
}
3、核心算法

filterGPSPoints算法過濾GPS飄逸點數(shù)據(jù):

// 定義閾值
const speedThreshold = 40; // 速度閾值,單位為m/s
const accelerationThreshold = 4; // 加速度閾值,單位為m/s^2

// 過濾GPS飄逸點的函數(shù)
function filterGPSPoints(points) {
	// 如果點的數(shù)量小于等于2,直接返回原始點集合
	if (points.length <= 2) {
		return points;
	}

	// 過濾后的點集合
	const filteredPoints = [points[0]];

	// 遍歷原始點集合
	for (let i = 1; i < points.length - 1; i++) {
		const prevPoint = points[i - 1];
		const currentPoint = points[i];
		const nextPoint = points[i + 1];
		// 計算當(dāng)前點的速度和加速度
		const speed = calculateSpeed(prevPoint, currentPoint);
		const acceleration = calculateAcceleration(prevPoint, currentPoint, nextPoint);

		// 如果速度和加速度都低于閾值,認(rèn)為是有效點,加入過濾后的點集合
		if (speed <= speedThreshold && acceleration <= accelerationThreshold) {
			filteredPoints.push(currentPoint);
		}
	}

	// 加入最后一個點
	filteredPoints.push(points[points.length - 1]);

	return filteredPoints;
}

// 計算兩個點之間的速度
function calculateSpeed(prevPoint, currentPoint) {
	const distance = calculateDistance(prevPoint, currentPoint);
	const time = (currentPoint.time - prevPoint.time)/1000; // 假設(shè)timestamp是時間戳
	return distance / time;
}

// 計算三個點之間的加速度
function calculateAcceleration(prevPoint, currentPoint, nextPoint) {
	const speed1 = calculateSpeed(prevPoint, currentPoint);
	const speed2 = calculateSpeed(currentPoint, nextPoint);
	const time = (nextPoint.time - prevPoint.time)/1000; // 假設(shè)timestamp是時間戳

	return (speed2 - speed1) / time;
}

// 計算兩個點之間的距離
function calculateDistance(point1, point2) {
	const lat1 = point1.latitude;
	const lon1 = point1.longitude;
	const lat2 = point2.latitude;
	const lon2 = point2.longitude;

	const R = 6371; // 地球半徑,單位為km

	const dLat = deg2rad(lat2 - lat1);
	const dLon = deg2rad(lon2 - lon1);

	const a =
		Math.sin(dLat / 2) * Math.sin(dLat / 2) +
		Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) * Math.sin(dLon / 2) * Math.sin(dLon / 2);

	const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));

	const distance = R * c * 1000; // 轉(zhuǎn)換為米
	
	return distance;
}

// 將角度轉(zhuǎn)換為弧度
function deg2rad(deg) {
	return deg * (Math.PI / 180);
}

module.exports = filterGPSPoints;

抽稀GPS數(shù)據(jù):文章來源地址http://www.zghlxwxcb.cn/news/detail-709254.html

//計算距離
function calculationDistance(point1, point2) {

	let lat1 = point1.latitude;
	let lat2 = point2.latitude;
	let lng1 = point1.longitude;
	let lng2 = point2.longitude;
	let radLat1 = lat1 * Math.PI / 180.0;
	let radLat2 = lat2 * Math.PI / 180.0;
	let a = radLat1 - radLat2;
	let b = (lng1 * Math.PI / 180.0) - (lng2 * Math.PI / 180.0);
	let s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) +
		Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(b / 2), 2)));
	return s * 6370996.81;
};
//計算垂距
function distToSegment(start, end, center) {
	//下面用海倫公式計算面積
	let a = Math.abs(calculationDistance(start, end));
	let b = Math.abs(calculationDistance(start, center));
	let c = Math.abs(calculationDistance(end, center));
	let p = (a + b + c) / 2.0;
	let s = Math.sqrt(Math.abs(p * (p - a) * (p - b) * (p - c)));
	return s * 2.0 / a;
};
//遞歸方式壓縮軌跡
function compressLine(coordinate, result, start, end, dMax) {
	if (start < end) {
		let maxDist = 0;
		let currentIndex = 0;
		let startPoint = coordinate[start];
		let endPoint = coordinate[end];
		for (let i = start + 1; i < end; i++) {
			let currentDist = distToSegment(startPoint, endPoint, coordinate[i]);
			if (currentDist > maxDist) {
				maxDist = currentDist;
				currentIndex = i;
			}
		}
		if (maxDist >= dMax) {
			//將當(dāng)前點加入到過濾數(shù)組中
			result.push(coordinate[currentIndex]);
			//將原來的線段以當(dāng)前點為中心拆成兩段,分別進(jìn)行遞歸處理
			compressLine(coordinate, result, start, currentIndex, dMax);
			compressLine(coordinate, result, currentIndex, end, dMax);
		}
	}
	return result;
};
/**
 *
 *@param coordinate 原始軌跡Array<{latitude,longitude}>
 *@param dMax 允許最大距離誤差
 *@return douglasResult 抽稀后的軌跡
 *
 */
function douglasPeucker(coordinate, dMax) {
	if (!coordinate || !(coordinate.length > 2)) {
		return null;
	}
	coordinate.forEach((item, index) => {
		item.key = index;
	});
	let result = compressLine(coordinate, [], 0, coordinate.length - 1, dMax);
	result.push(coordinate[0]);
	result.push(coordinate[coordinate.length - 1]);
	let resultLatLng = result.sort((a, b) => {
		if (a.key < b.key) {
			return -1;
		} else if (a.key > b.key)
			return 1;
		return 0;
	});
	resultLatLng.forEach((item) => {
		item.key = undefined;
	});
	return resultLatLng;
}

module.exports = douglasPeucker;

到了這里,關(guān)于Uniapp實現(xiàn)微信小程序跑步運動軌跡、歷史軌跡和軌跡回放等功能的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • uniapp運動課程健身打卡系統(tǒng)微信小程序

    uniapp運動課程健身打卡系統(tǒng)微信小程序

    考慮到實際生活中在我來運動管理方面的需要以及對該系統(tǒng)認(rèn)真的分析,將系統(tǒng)分為小程序端模塊和后臺管理員模塊,權(quán)限按管理員和用戶這兩類涉及用戶劃分。 (a) 管理員;管理員使用本系統(tǒng)涉到的功能主要有:首頁、個人中心、用戶管理、課程類別管理、運動課程管理、課

    2024年02月21日
    瀏覽(23)
  • uniapp微信小程序獲取微信運動步數(shù)(保姆級教程)

    uniapp微信小程序獲取微信運動步數(shù)(保姆級教程)

    官方文檔 https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/signature.html 可以先了解一下,然后下載對應(yīng)的解密文件 找到對應(yīng)的解密語言版本,老師這里用的uniapp,只能選擇node版 這里有具體的案例,可以參考一下,直接在代碼中導(dǎo)入,在上面的getStepInfo方法中直接實例化

    2024年02月06日
    瀏覽(94)
  • 基于微信小程序地圖組件實現(xiàn)行車軌跡

    基于微信小程序地圖組件實現(xiàn)行車軌跡

    微信小程序是一款能夠開發(fā)出各種功能的便捷工具,其中內(nèi)置的地圖組件,為我們提供了強(qiáng)大的地圖展示和交互的能力,為我們的開發(fā)節(jié)約了不少時間和精力。同時,利用微信小程序內(nèi)置的定時器,我們也能夠簡單地實現(xiàn)經(jīng)緯度軌跡移動的效果。 在這個程序中,我們需要用到

    2024年02月03日
    瀏覽(22)
  • 微信小程序原生使用map組件實現(xiàn)軌跡、多邊形

    使用地圖本身的map組件實現(xiàn)地圖 初始化地圖: map組件的屬性 longitude 必須 Number 中心點經(jīng)度 latitude 必須 Number 中心點緯度 scale 選填 Number 地圖的縮放級別(縮放切換時使用) include-points 選填 Array. 縮放視野以展示所有坐標(biāo)點 markers 選填 Array. 地圖展示的坐標(biāo)點集合 polyline 選填

    2024年02月03日
    瀏覽(101)
  • 微信小程序校園運動場地預(yù)約系統(tǒng)設(shè)計與實現(xiàn)

    微信小程序校園運動場地預(yù)約系統(tǒng)設(shè)計與實現(xiàn)

    ?博主介紹 :黃菊華老師《Vue.js入門與商城開發(fā)實戰(zhàn)》《微信小程序商城開發(fā)》圖書作者,CSDN博客專家,在線教育專家,CSDN鉆石講師;專注大學(xué)生畢業(yè)設(shè)計教育和輔導(dǎo)。 所有項目都配有從入門到精通的基礎(chǔ)知識視頻課程,免費 項目配有對應(yīng)開發(fā)文檔、開題報告、任務(wù)書、

    2024年02月04日
    瀏覽(19)
  • 基于Springboot+Mybatis+微信小程序?qū)崿F(xiàn)小型運動管理平臺

    基于Springboot+Mybatis+微信小程序?qū)崿F(xiàn)小型運動管理平臺

    此文主要功能包括:運動健康平臺登錄注冊、了解健康知識、查看管理運動的文章與詳情、每日登錄打卡、系統(tǒng)通知、留言管理、提交運動功能。使用Java作為后端語言進(jìn)行支持,界面友好,開發(fā)簡單。 2.1、下載安裝IntelliJ IDEA(后端語言開發(fā)工具),Mysql數(shù)據(jù)庫,微信Web開發(fā)者工

    2024年02月02日
    瀏覽(21)
  • 基于php微信小程序運動場地預(yù)約系統(tǒng)設(shè)計與實現(xiàn)

    基于php微信小程序運動場地預(yù)約系統(tǒng)設(shè)計與實現(xiàn)

    開發(fā)概要 開發(fā)操作系統(tǒng):windows10 + 4G內(nèi)存 + 500G 小程序開發(fā):微信開發(fā)者工具(MINA框架) 后臺環(huán)境:IIS +PHP 后臺開發(fā)語言:PHP 后臺開發(fā)工具:Dreamweaver +PhpStorm 數(shù)據(jù)庫:mysql8 數(shù)據(jù)庫管理工具:navicat 其他開發(fā)語言:html + css +javascript

    2024年02月11日
    瀏覽(25)
  • 微信小程序畢業(yè)設(shè)計作品成品(07)微信小程序校園體育館運動場地預(yù)約系統(tǒng)設(shè)計與實現(xiàn)

    微信小程序畢業(yè)設(shè)計作品成品(07)微信小程序校園體育館運動場地預(yù)約系統(tǒng)設(shè)計與實現(xiàn)

    博主介紹: 《Vue.js入門與商城開發(fā)實戰(zhàn)》《微信小程序商城開發(fā)》圖書作者,CSDN博客專家,在線教育專家,CSDN鉆石講師;專注大學(xué)生畢業(yè)設(shè)計教育和輔導(dǎo)。 所有項目都配有從入門到精通的基礎(chǔ)知識視頻課程,免費 項目配有對應(yīng)開發(fā)文檔、開題報告、任務(wù)書、PPT、論文模版

    2024年02月08日
    瀏覽(97)
  • 基于JSP微信小程序校園運動會報名系統(tǒng)設(shè)計與實現(xiàn)

    基于JSP微信小程序校園運動會報名系統(tǒng)設(shè)計與實現(xiàn)

    【后臺管理員功能】 錄入資訊:錄入資訊標(biāo)題、內(nèi)容等信息 管理資訊:查看已錄入資訊列表,支持刪除和修改 會員列表:查看所有注冊會員信息,支持刪除 廣告設(shè)置:上傳圖片和設(shè)置小程序首頁輪播圖廣告地址 留言列表:所有用戶留言信息列表,支持刪除 錄入比賽項目:

    2024年02月12日
    瀏覽(92)
  • 基于微信小程序的高校運動會管理系統(tǒng)設(shè)計與實現(xiàn)

    基于微信小程序的高校運動會管理系統(tǒng)設(shè)計與實現(xiàn)

    ??博主介紹:?全網(wǎng)粉絲10W+,CSDN全棧領(lǐng)域優(yōu)質(zhì)創(chuàng)作者,博客之星、掘金/華為云/阿里云等平臺優(yōu)質(zhì)作者。 ???? 精彩專欄 推薦訂閱???? 計算機(jī)畢業(yè)設(shè)計精品項目案例(持續(xù)更新) ?? 文末獲取源碼+數(shù)據(jù)庫+文檔 ?? 感興趣的可以先收藏起來,還有大家在畢設(shè)選題,項目以及

    2024年01月20日
    瀏覽(31)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包