首页 > 编程语言 >微信小程序实现跑步轨迹回放入门教程

微信小程序实现跑步轨迹回放入门教程

时间:2024-11-19 17:50:38浏览次数:3  
标签:return 程序实现 微信 入门教程 let result coordinate end Math

一、先看效果

<iframe allowfullscreen="true" data-mediaembed="csdn" frameborder="0" id="D4Hu0gLa-1732008554157" src="https://live.csdn.net/v/embed/434765"></iframe>

跑步轨迹回放

二、实现功能

【跑步运动助手】是一款微信小程序,主要实现了跑步轨迹记录、历史轨迹、轨迹纠偏、轨迹回放和轨迹排名等功能。本文主要讲如何实现轨迹动画回放功能。更多干货请关注公众号:小蝇工作室

1.获取GPS数据

queryData = function(url, data) {
    var p = new Promise(function(resolve, reject) {
	    $.post(url, data, function(data) {
		     resolve(data)
	     })
    })
    return p;
}

2.优化GPS数据

//计算距离
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) {
			//将当前点加入到过滤数组中
			result.push(coordinate[currentIndex]);
			//将原来的线段以当前点为中心拆成两段,分别进行递归处理
			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;
}

3.加载地图

var center = new TMap.LatLng(paths[0].latitude, paths[0].longitude);
// 初始化地图
var map = new TMap.Map("container", {
							zoom: 17,
							pitch: 50,
							mapStyleId: 'style4',
							baseMap: {
								type: "satellite",
								features: ["base",
									"building3d"
								],
							},
							center,
						});

map.removeControl(TMap.constants.DEFAULT_CONTROL_ID.ZOOM);

4.回放轨迹数据

marker.on('move_ended', function() {
	isMoving = false;
	marker.updateGeometries([{
		id: "end",
		styleId: "end",
		position: new TMap
			.LatLng(
				paths[
					paths
					.length -
					1]
				.latitude,
				paths[
					paths
					.length -
					1]
				.longitude
			),
	}, ]);

	//创建LatLngBounds实例
	var latlngBounds = new TMap
		.LatLngBounds();
	//将坐标逐一做为参数传入extend方法,latlngBounds会根据传入坐标自动扩展生成
	for (var i = 0; i < path
		.length; i++) {
		latlngBounds.extend(path[i]);
	}
	//调用fitBounds自动调整地图显示范围
	map.easeTo({
		rotation: 0,
		pitch: 0
	}, {
		duration: 450,
	});

	setTimeout(() => {
		map.fitBounds(latlngBounds);
		marker.remove("whiteDot")
	}, 500)
});

标签:return,程序实现,微信,入门教程,let,result,coordinate,end,Math
From: https://blog.csdn.net/u014791094/article/details/143890861

相关文章

  • 网络安全入门教程(非常详细)从零基础入门到精通_网路安全 教程
     前言1.入行网络安全这是一条坚持的道路,三分钟的热情可以放弃往下看了。2.多练多想,不要离开了教程什么都不会了,最好看完教程自己独立完成技术方面的开发。3.有时多百度,我们往往都遇不到好心的大神,谁会无聊天天给你做解答。4.遇到实在搞不懂的,可以先放放,以后再来解决。→【......
  • 12个微信号同时开聊?聚合技巧大揭秘!
    点击关注免费试用12个微信号同时开聊?聚合技巧大揭秘!你是不是也有这种烦恼?微信有好多号,聊天信息永远都在不同的界面来回切换,搞得自己一头雾水,沟通效率大打折扣?!别急,今天就来给大家分享一下让你瞬间变身沟通达人、消息管理大咖的微信聚合技巧!如果你有多个微信号,想同时聊......
  • HarmonyOS-Chat聊天室|纯血鸿蒙Next5 api12聊天app|ArkUI仿微信
    自研原生鸿蒙NEXT5.0API12ArkTS仿微信app聊天模板HarmonyOSChat。harmony-wechat原创重磅实战纯血鸿蒙OSArkUI+ArkTs仿微信App聊天实例。包括聊天、通讯录、我、朋友圈等模块,实现类似微信消息UI布局、编辑器光标处输入文字+emo表情图片/GIF动图、图片预览、红包、语音/位置UI......
  • 微信小程序开发环境准备
    导入项目运行小程序准备 Windows环境安装配置nodejs详细教程 原文地址https://www.cnblogs.com/xianz666/p/18433144下载地址:https://www.nodejs.com.cn/download.html 微信开发者工具官网 https://developers.weixin.qq.com/miniprogram/dev/devtools/stable.html......
  • 大学生就业平台微信小程序ssm+论文源码调试讲解
    第2章关键技术简介2.1微信小程序微信小程序,简称小程序,英文名MiniProgram,是一种全新的连接用户与服务的方式,可以快速访问、快速传播,并具有良好的使用体验。小程序的主要开发语言是JavaScript,它与普通web的开发有很多相似之处。小程序和普通网页开发并不是相同的东西,是有......
  • 【微信批量群发】想要一次性给所有好友发送消息?这里有最简单的方法!
    点击关注免费试用【微信批量群发】想要一次性给所有好友发送消息?这里有最简单的方法!有没有遇到过这种情况?每次发个重要通知,想一口气通知所有微信好友,却得一个一个手动发,累得想哭!有时候还可能漏掉某个好友,简直要崩溃。是不是很烦恼?其实,批量发送微信消息超级简单,只需要......
  • 基于微信小程序的场地预约系统设计与实现(源码+论文+部署讲解等)
    博主介绍:✌全网粉丝60W+,csdn特邀作者、Java领域优质创作者、csdn/掘金/哔哩哔哩/知乎/道客/小红书等平台优质作者,计算机毕设实战导师,目前专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌技术栈范围:SpringBoot、Vue、SSM、Jsp、HLMT、Nodejs......
  • Gemini 发布 iOS app,Live 语音聊天免费用;微信公众号上线 AI 音色克隆功能丨 RTE 开发
       开发者朋友们大家好: 这里是「RTE开发者日报」,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享RTE(Real-TimeEngagement)领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「有看点的会议」,但内容仅代表编......
  • 基于微信小程序的体育课评分系统设计与实现(源码+论文+部署讲解等)
    博主介绍:✌全网粉丝60W+,csdn特邀作者、Java领域优质创作者、csdn/掘金/哔哩哔哩/知乎/道客/小红书等平台优质作者,计算机毕设实战导师,目前专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌技术栈范围:SpringBoot、Vue、SSM、Jsp、HLMT、Nodejs......
  • 基于微信小程序的宠物店商城系统设计与实现(源码+论文+部署讲解等)
    博主介绍:✌全网粉丝60W+,csdn特邀作者、Java领域优质创作者、csdn/掘金/哔哩哔哩/知乎/道客/小红书等平台优质作者,计算机毕设实战导师,目前专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌技术栈范围:SpringBoot、Vue、SSM、Jsp、HLMT、Nodejs......