实现百度地图行驶轨迹功能

Video_2023-07-24_112432

<!doctype html>
<html lang="en">

	<head>
		<meta charset="UTF-8">
		<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
		<meta http-equiv="X-UA-Compatible" content="ie=edge">
		<title>百度地图的动态行驶轨迹</title>
		<style type="text/css">
			html,
			body {
				height: 100%;
			}
		</style>
		<script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=wIt2mDCMGWRIi2pioR8GZnfrhSKQHzLY"></script>
	</head>

	<body>
		<div id="mapId" style="height: 100%;"></div>
		<script>
			var PointArr = [{
				lat: 36.10339957700999,
				lng: 120.4207801005104
			}, {
				lat: 36.10349055332635,
				lng: 120.42113539348455
			}, {
				lat: 36.10452708476511,
				lng: 120.42076268466177
			}, {
				lat: 36.10480132817409,
				lng: 120.4196557913201
			}, {
				lat: 36.10560773716036,
				lng: 120.418951386886
			}, {
				lat: 36.10621159088823,
				lng: 120.41900182905378
			}, {
				lat: 36.1064641068988,
				lng: 120.41992809616544
			}, {
				lng: 120.42201589513277,
				lat: 36.10700627324672
			}, {
				lng: 120.42236704579075,
				lat: 36.10708566579729
			}, {
				lng: 120.42269817692573,
				lat: 36.107201270041955
			}, {
				lng: 120.42239277578172,
				lat: 36.10812797579566
			}, {
				lng: 120.42175457671763,
				lat: 36.10947659586882
			}, {
				lng: 120.42144906678747,
				lat: 36.11028554037044
			}, {
				lng: 120.42134433787885,
				lat: 36.110691285540966
			}, {
				lng: 120.42234193234574,
				lat: 36.110931417305515
			}];
			var map = new BMap.Map("mapId");
			map.centerAndZoom(PointArr, 15); // 根据经纬度显示地图的范围
			map.setViewport(PointArr); // 根据提供的地理区域或坐标设置地图视野

			addStartMarker(new BMap.Point(PointArr[0].lng, PointArr[0].lat), '起点', map);
			var carMk; //先将终点坐标展示的mark对象定义
			//小车行驶图标
			var drivingPoint = new BMap.Icon('http://developer.baidu.com/map/jsdemo/img/car.png', new BMap.Size(52, 26), {
				imageSize: new BMap.Size(52, 26)
			});
			//终点图标
			var terminalPoint = new BMap.Icon('./img/end.png', new BMap.Size(45, 45), {
				imageSize: new BMap.Size(45, 45)
			});
			var i = 0;
			var interval = setInterval(function() {
				if(i >= PointArr.length) {
					clearInterval(interval);
					return;
				}
				drowLine(map, PointArr[i], PointArr[i + 1]); //画线调用
				i = i + 1;
			}, 1000);

			// 划线
			function drowLine(map, PointArr, PointArrNext) {
				if(PointArrNext != undefined) {
					var polyline = new BMap.Polyline(
						[
							new BMap.Point(PointArr.lng, PointArr.lat),
							new BMap.Point(PointArrNext.lng, PointArrNext.lat)
						], {
							strokeColor: "green",
							strokeWeight: 7,
							strokeOpacity: 1
						}); //创建折线
					map.addOverlay(polyline);
					addMarkerEnd(new BMap.Point(PointArrNext.lng, PointArrNext.lat), '小车行驶', map, PointArrNext, new BMap.Point(PointArr.lng, PointArr.lat)); //添加图标
				} else {
					addMarkerEnd(new BMap.Point(PointArr.lng, PointArr.lat), '终点', map); //添加终点图标
				}
			}
			//添加起始图标
			function addStartMarker(point, name, mapInit) {
				if(name == "起点") {
					var myIcon = new BMap.Icon("./img/start.png", new BMap.Size(45, 45), {
						imageSize: new BMap.Size(45, 45) //图标所用的图片的大小,此功能的作用等同于CSS中的background-size属性。可用于实现高清屏的高清效果
					});
					window.marker = new BMap.Marker(point, {
						icon: myIcon
					}); // 创建标注
					mapInit.addOverlay(marker); // 将标注添加到地图中
				}
			}
			//添加行驶和终点图标
			function addMarkerEnd(point, name, mapInit, trackUnit, prePoint) {
				if(name == "小车行驶") {
					if(carMk) { //先判断第一次进来的时候这个值有没有定义,有的话就清除掉上一次的。然后在进行画图标。第一次进来时候没有定义也就不走这块,直接进行画图标
						mapInit.removeOverlay(carMk);
					}
					carMk = new BMap.Marker(point, {
						icon: drivingPoint
					}); // 创建标注
					carMk.setRotation(getAngle(point, prePoint) - 90); // 旋转的角度
					mapInit.addOverlay(carMk); // 将标注添加到地图中
				} else {
					mapInit.removeOverlay(carMk);
					carMk = new BMap.Marker(point, {
						icon: terminalPoint
					}); // 创建标注
					mapInit.addOverlay(carMk);
				}
			}
			//获得角度的函数
			function getAngle(n, next) {
				var ret
				var w1 = n.lat / 180 * Math.PI
				var j1 = n.lng / 180 * Math.PI

				var w2 = next.lat / 180 * Math.PI
				var j2 = next.lng / 180 * Math.PI

				ret = 4 * Math.pow(Math.sin((w1 - w2) / 2), 2) - Math.pow(Math.sin((j1 - j2) / 2) * (Math.cos(w1) - Math.cos(w2)), 2);
				ret = Math.sqrt(ret);

				var temp = Math.sin((j1 - j2) / 2) * (Math.cos(w1) + Math.cos(w2));
				console.log(temp)
				ret = ret / temp;
				ret = Math.atan(ret) / Math.PI * 180;
				ret += 90;

				// 这里用如此臃肿的if..else是为了判定追踪单个点的具体情况,从而调整ret的值
				if(j1 - j2 < 0) {
					if(w1 - w2 < 0) {
						ret;
					} else {
						ret = -ret + 180;
					}
				} else {
					if(w1 - w2 < 0) {
						ret = 180 + ret;
					} else {
						ret = -ret;
					}
				}
				return ret;
			}
		</script>
	</body>

</html>
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值