百度地图——覆盖物在多条轨迹上循环移动

1 需求:界面呈现多条路线(此处3条)。点击相应路线地图上出现相应路线。并有小车图标在轨迹上移动。小车图标能随轨迹旋转保证车头始终指向路线前进方向。不点击路线事件时。地图上多条轨迹自动循环播放。

2 js主要代码:

var polylinex=null;
var roadNum = 2;

var timer =null;

// 线路排行点击事件,3条线路。openLine(i)为线路名的div点击事件
function openLine(i) {
map.clearOverlays();
clearTimeout(timer);
roadNum = i+1;
if(roadNum>3){
roadNum = 1;
}

//改变线路div样式
var lines = [" ","#line1","#line2","#line3"];
$(lines[1]).removeClass(‘big‘); 
$(lines[2]).removeClass(‘big‘); 
$(lines[3]).removeClass(‘big‘); 
$(lines[i]).addClass(‘big‘);
if (i == 1)
{
getWeight(p1,p2,10);  //改变地图中路线样式
run(p1,p2); //添加覆盖物(小车图标)并让小车图标沿路线移动
getWeight(p1,p3,5);
getWeight(p4,p2,5);
markerLabel() 
}
else if (i == 2)
{
getWeight(p1,p2,5);
getWeight(p1,p3,10);
getWeight(p4,p2,5);
markerLabel();
run(p1,p3);

}
else
{
getWeight(p1,p2,5);
getWeight(p1,p3,5);
getWeight(p4,p2,10);
markerLabel();
run(p4,p2);

}

//改变地图中轨迹(线路)样式
getWeight(p1,p2,10);
function getWeight(point1,point2,weight){

var driving1 = new BMap.DrivingRoute(map);
driving1.search(point1, point2);
driving1.setSearchCompleteCallback(function() {
var pts1 = driving1.getResults().getPlan(0).getRoute(0).getPath(); //得到一个数组
polylinex = new BMap.Polyline(pts1, {
strokeColor: "#765af9",
strokeWeight: weight,
strokeOpacity: 0.9
});
map.addOverlay(polylinex);

}); 
}

// 传入起终点画线并让覆盖物在轨迹上移动
function run(p1, p2) {
var driving1 = new BMap.DrivingRoute(map);
driving1.search(p1, p2);
driving1.setSearchCompleteCallback(function() {
var pts1 = driving1.getResults().getPlan(0).getRoute(0).getPath(); //得到一个数组
var polyline1 = new BMap.Polyline(pts1, {
strokeColor: "#765af9",
strokeWeight: 10,
strokeOpacity: 0.9
});
map.addOverlay(polyline1);
setTimeout(function() {
map.setViewport([p1, p2]);
jumps(pts1);
}, 0);
});
}

// 传入数组就可以跑
function jumps(pts) {
/* var lushu = new BMapLib.LuShu(map,pts,{
defaultContent:"",//"从天安门到百度大厦"
autoView:true,//是否开启自动视野调整,如果开启那么路书在运动过程中会根据视野自动调整
icon : new BMap.Icon(‘http://lbsyun.baidu.com/jsdemo/img/car.png‘, new BMap.Size(52,26),{anchor : new BMap.Size(27, 13)}),
speed: 4500,
enableRotation:true,//是否设置marker随着道路的走向进行旋转
landmarkPois: [{lng:30.277072,lat:120.076409,html:‘ <script>openLine(roadNum);</script>‘,pauseTime:2}
]});
lushu.start();*/

// 运动图片
var myIcon = new BMap.Icon("./img/arrow.png", new BMap.Size(58, 53), { //小车图片
offset: new BMap.Size(0, -5), //相当于CSS精灵
imageOffset: new BMap.Size(0, 0) //图片的偏移量。为了是图片底部中心对准坐标点。
});

var carMk = new BMap.Marker(pts[0], {
icon: myIcon
});
map.addOverlay(carMk);
var i = 0;

function resetMkPoint(i) {
carMk.setPosition(pts[i]);
if (i < pts.length) {
timer = setTimeout(function() {
i++;
if(i+1 < pts.length){
carMk.setRotation(findRotation(pts[i],pts[i+1]));//设置旋转角度
//carMk.setRotation(180);
}
resetMkPoint(i);
}, 100);
} else {
openLine(roadNum);
}
}
setTimeout(function() {
resetMkPoint(5);
}, 100)
}
setTimeout(function() {
run();
}, 10);
run(p1, p2); // 默认跑线路1

//找到每一次小车运动,需要偏移的角度
function findRotation(startPoint,endPoint){
var x = endPoint.lng-startPoint.lng;//lng-经度,lat-纬度
var y = endPoint.lat-startPoint.lat;
if(x==0){
return 0;
}
if(x>0){
var z=Math.sqrt(x*x+y*y);
var jiaodu=Math.round((Math.asin(y/z)/Math.PI*180));//最终角度
if(jiaodu>=0){
return 90-jiaodu;
}else{
return 90+Math.abs(jiaodu);
}
}
if(x<0){
var z=Math.sqrt(x*x+y*y);
var jiaodu=Math.round((Math.asin(y/z)/Math.PI*180));//最终角度
if(jiaodu>=0){
return 360+jiaodu;
}else{
return 360-Math.abs(jiaodu);
}
}

}

// 标轨迹的注起点终点
function markerLabel(){
map.addOverlay(marker01);
marker01.setLabel(label1);
map.addOverlay(marker02);
marker02.setLabel(label2);
}

var iconImg1 = new BMap.Icon("img/start.png", new BMap.Size(40, 48));
var iconImg2 = new BMap.Icon("img/end.png", new BMap.Size(40, 48));
// 起点坐标打点标注
var marker01 = new BMap.Marker(p1, {
icon: iconImg1
});
label1 = new BMap.Label("起点:西湖音乐喷泉", {
offset: new BMap.Size(45, 18)
});
label1.setStyle({
color: "#ffffff",
fontSize: "18px",
lineHeight: "40px",
fontFamily: "微软雅黑",
height: "40px",
border: "0",
padding: "0 15px",
textShadow: "0",
backgroundColor: "#274359",
borderRadius: "10px",
cursor: "pointer"
});
// 终点坐标打点标注
var marker02 = new BMap.Marker(p2, {
icon: iconImg2
});
label2 = new BMap.Label("终点:西溪国家湿地公园", {
offset: new BMap.Size(45, -58)
});
label2.setStyle({
color: "#ffffff",
fontSize: "18px",
lineHeight: "40px",
fontFamily: "微软雅黑",
height: "40px",
border: "0",
padding: "0 15px",
textShadow: "0",
backgroundColor: "#274359",
borderRadius: "10px",
cursor: "pointer"
});

原文地址:https://www.cnblogs.com/creatqgap/p/10789637.html

时间: 2024-08-29 16:52:39

百度地图——覆盖物在多条轨迹上循环移动的相关文章

百度地图覆盖物信息显示和隐藏

<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><style type="text/css">body, html,#allmap {width: 100%;height: 100%;overflow: hidden;hidden;margin:

百度地图覆盖物多边形拖动,点击,生成新的覆盖物

<html><head><meta http-equiv="Content-Type" content="text/html; charset=gb2312" /><meta name="viewport" content="initial-scale=1.0, user-scalable=no" /><style type="text/css">

03.(最新版)百度地图&#167;覆盖物OverlayOptions

转载请标明:http://blog.csdn.net/u012637501 目前百度地图SDK所提供的地图等级为3-19级,所包含的信息有建筑物.道路.河流.学校.公园等内容.所有叠加或覆盖到地图的内容,我们统称为地图覆盖物.如标注.矢量图形元素(包括:折线.多边形和圆等).定位图标等.覆盖物拥有自己的地理坐标,当您拖动或缩放地图时,它们会相应的移动.我们可根据自己实际的业务需求,利用标注覆盖物,在地图指定的位置上添加标注信息. 一.APIs 1.LatLng类 (1)作用:地理坐标基本数据结构

百度地图api描绘车辆历史轨迹图

最近公司在做项目需需求:车辆定位后在地图显示历史轨迹的功能 一开始使用了google的地图api,但是发现会一直关闭,索性支持下国产,使用了百度地图api search方法把两个点连接成线后,会出现起点和终点的图标,但是需要要求只有第一个点和最后一个点是起点和终点,中间的全是小车的图案 我画点的功能是为了覆盖掉 search连线的起始点,但是覆盖后悬浮弹出层会出现问题,所以我就写把存放起点和终点的层去掉, 但是地图渲染时需要时间的,我采取了2秒后执行,把存放起点和终点icon的div清空了,这样

【07】覆盖物(百度地图覆盖物笔记)

[07]覆盖物 地图覆盖物概述 所有叠加或覆盖到地图的内容,我们统称为地图覆盖物.如标注.矢量图形元素(包括:折线和多边形和圆).信息窗口等.覆盖物拥有自己的地理坐标,当您拖动或缩放地图时,它们会相应的移动. 地图API提供了如下几种覆盖物: Overlay:覆盖物的抽象基类,所有的覆盖物均继承此类的方法. Marker:标注表示地图上的点,可自定义标注的图标. Label:表示地图上的文本标注,您可以自定义标注的文本内容. Polyline:表示地图上的折线. Polygon:表示地图上的多边

iOS成长之路 百度地图覆盖物

导入百度地图 初始化百度地图 mapView  = [[BMKMapView alloc]initWithFrame:(CGRect){0,0,ViewWith,ViewHight}]; [self.view addSubview:mapView]; mapView.delegate = self; 添加线和坐标物 allarray  里面是 经纬度 if (allarray.count > 2) { CLLocationCoordinate2D coords[2]; for (NSIntege

使用百度地图API实现轨迹回放

调用百度地图API实现路线的轨迹回放功能其实很简单,只要搞懂以下几点即可: 1.需要用Polyline方法先绘制好路线图 2.用Marker添加标注点 3.关键一步,通过结合定时器,使用Marker创建的标注点实例的setPosition改变标注点位置,实现播放功能 代码分享,直接复制即可使用 [html] view plaincopy <!DOCTYPE html> <html> <head> <meta name="viewport" co

Vue项目引用百度地图并实现搜索定位等功能

Tip:本篇文章为案例分析,技术点较多,所以篇幅较长,认真阅览的你一定会学到很多知识. 前言:百度地图开放平台 给开发者们提供了丰富的地图功能与服务,使我们的项目中可以轻松地实现地图定位.地址搜索.路线导航等功能.本文给大家介绍如何在vue项目中引用百度地图,并设计实现简单的地图定位.地址搜索功能. 一.效果图及功能点 先来看一下效果图 效果图看不够? 点此 试试在线操作!(初次进入加载较慢,请耐心等待) 功能点: 挂载百度地图 封装逆地址解析函数(根据坐标点获取详细地址) 设置图像标注并绑定拖

使用百度地图API制作线路轨迹播放

1.使用百度地图API制作轨迹播放: 可应用于车辆跟踪.行驶线路回放.跑步行程的记录等地图应用场景, 1.1绘制静态轨迹图 获取多个轨迹点point(必须包含经度.纬度) 使用polyline对象依次连接相邻的2个点(注意polyline的个数比point的少1) 1.2绘制动态轨迹图(固定间隔时间) 每隔500毫秒读取一个轨迹点,实现a,b两个功能 a增加一条polyline b将marker从先前的point移到当前点 主方法使用setTimeout方法迭代来实现动态循环 Polyline在