安卓关于在百度地图上实现轨迹回放的处理

一、需求

  为了把一个人一段时间内的历史轨迹在地图上描绘出来,并实现按时间顺序回放。

二、唠叨

关于描点和描线,百度地图都有自己的API,大家都应该会了;至于播放动画,肯定不止一种方法,如果大家有好的方法,分享出来,小弟感激不尽。


三、说明

我的方法是:在一个线程里,开始播放后,遍历存放item的list,找到当前的item,移除他的marker,然后给他换一个marker,再添加到list里面,然后睡眠;接着就判断,如果不是当前item,该什么样子就什么样子,如此迭代就可以了。



                         小弟菜鸟一枚,代码质量不高,高手勿喷,谢谢。

主要的片段如下:

1、主要的逻辑

/** 轨迹回放逻辑处理 **/
	private Runnable rz = new Runnable()
	{
		@Override
		public synchronized void run()
		{
			while (isStartRun)
			{
				for (int i = index; i < mGeoList.size(); i++)
				{
					OverlayItem item = mGeoList.get(i);
					flag = index;
					sendMsg(MapApplication.LOCATEOVER_NOTICE_ADAPTER);
					mOverlayGraphic.removeItem(item);
					item.setMarker(res.get(3));
					if (!isBcak)
					{
						break;
					}
					mOverlayGraphic.addItem(item);
					mMapView.refresh();
					SystemUtils.sleep(1000);
					mOverlayGraphic.removeItem(item);
					if (index == 0)
					{
						item.setMarker(res.get(1));
					}
					else if (index == mGeoList.size() - 1)
					{
						item.setMarker(res.get(2));
						isStartRun = false;
						isFinish = false;
					}
					else
					{
						View view = mInflater.inflate(R.layout.overlay_item, null);
						TextView userItemTv1 = (TextView) view.findViewById(R.id.item_tv1);
						userItemTv1.setText(index + 1 + "");
						Bitmap bmp = userLocateUtil.createNewBitmap(view);
						Drawable drawable = new BitmapDrawable(bmp);
						item.setMarker(drawable);
					}
					if (!isBcak)
					{
						break;
					}
					mOverlayGraphic.addItem(item);
					mMapView.refresh();
					index++;
					if (!isFinish)
					{
						index = 0;
						sendMsg(MapApplication.LOCATEOVER_PLAY_FINISH);
						break;
					}
				}
			}
		}
	};

2、操作处理

	/** 轨迹回放 **/
	private void playTrajectory()
	{

		play.setOnClickListener(new OnClickListener()
		{
			@Override
			public void onClick(View v)
			{
				if (!"开始回放".equals(play.getText().toString()))
				{
					isStartRun = false;
					isBcak = false;
					play.setText("开始回放");
				}
				else
				{
					play.setText("暂停回放");
					isFinish = true;
					isStartRun = true;
					isBcak = true;
					thread = new Thread(rz);
					if (!thread.isAlive())
					{
						thread.start();
					}
				}
			}
		});
	}

3.UI处理

	private Handler handler = new Handler()
	{
		public void handleMessage(Message msg)
		{
			switch (msg.what)
			{
				case MapApplication.LOCATEOVER_CHANGE_MAPVIEW:
					changeMapView();
					break;
				case MapApplication.LOCATE_MAPVIEW_REFRESH:
					mMapView.refresh();
					mMapView.getController().zoomToSpan(mOverlayGraphic.getLatSpanE6(), mOverlayGraphic.getLonSpanE6());
					mMapView.getController().setCenter(mOverlayGraphic.getCenter());
					PocProgressDialog.cancel();
					break;
				case MapApplication.LOCATEOVER_PLAY_FINISH:
					Toast.makeText(MainActivity.mainActivity, "播放完毕", Toast.LENGTH_SHORT).show();
					flag = 99999;
					adapter.notifyDataSetChanged();
					play.setText("开始回放");
					break;
				case MapApplication.LOCATEOVER_NOTICE_ADAPTER:
					adapter.notifyDataSetChanged();
					// mListView.setSelection(flag);备用
					break;
			}
		}
	};

最后,无图无真相啊,上图;










实现车辆轨迹回放,你需要先获取车辆行驶轨迹的数据,可以通过GPS或其他位置数据采集设备获取。接下来,你可以使用百度地图API提供的Polyline类来绘制轨迹线路,使用Marker类来标注车辆行驶的起点和终点,使用DrivingRoute类来绘制车辆行驶的路线。最后,你可以使用定时器或其他方式来控制车辆行驶过程中的速度和动画效果。 下面是一个使用百度地图API实现车辆轨迹回放的示例代码: ```javascript //创建地图实例 var map = new BMap.Map("container"); //设置地图中心点和缩放级别 map.centerAndZoom(new BMap.Point(116.404, 39.915), 15); //开启鼠标滚轮缩放 map.enableScrollWheelZoom(true); //定义轨迹数据 var path = [ {"lng":116.404,"lat":39.915}, {"lng":116.415,"lat":39.915}, {"lng":116.425,"lat":39.915}, {"lng":116.435,"lat":39.915}, {"lng":116.445,"lat":39.915}, {"lng":116.455,"lat":39.915}, {"lng":116.465,"lat":39.915}, {"lng":116.475,"lat":39.915}, {"lng":116.485,"lat":39.915}, {"lng":116.495,"lat":39.915} ]; //绘制轨迹线路 var polyline = new BMap.Polyline(path, {strokeColor:"blue", strokeWeight:6, strokeOpacity:0.5}); map.addOverlay(polyline); //标注起点和终点 var startMarker = new BMap.Marker(path[0]); var endMarker = new BMap.Marker(path[path.length-1]); map.addOverlay(startMarker); map.addOverlay(endMarker); //绘制车辆行驶路线 var driving = new BMap.DrivingRoute(map, {renderOptions:{map: map, autoViewport: true}}); driving.search(new BMap.Point(path[0].lng, path[0].lat), new BMap.Point(path[path.length-1].lng, path[path.length-1].lat)); //控制车辆行驶过程中的速度和动画效果 var index = 0; var timer = setInterval(function(){ if(index < path.length-1){ var p1 = new BMap.Point(path[index].lng, path[index].lat); var p2 = new BMap.Point(path[index+1].lng, path[index+1].lat); var angle = getAngle(p1, p2); startMarker.setRotation(angle); startMarker.setPosition(p2); index++; }else{ clearInterval(timer); } }, 1000); //计算两点之间的方向角度 function getAngle(p1, p2){ var dx = p2.lng - p1.lng; var dy = p2.lat - p1.lat; var angle = 0; if(dx == 0){ angle = dy > 0 ? 90 : 270; }else if(dy == 0){ angle = dx > 0 ? 0 : 180; }else{ angle = Math.atan(dy/dx) * 180 / Math.PI; if(dx < 0){ angle += 180; }else if(dy < 0){ angle += 360; } } return angle; } ``` 在上面的示例代码中,我们先定义了一个包含轨迹数据的数组path,然后创建了一个地图实例,并设置了地图中心点和缩放级别。接下来,我们使用Polyline类来绘制轨迹线路,使用Marker类来标注车辆行驶的起点和终点,使用DrivingRoute类来绘制车辆行驶的路线。最后,我们使用定时器来控制车辆行驶过程中的速度和动画效果。 需要注意的是,上面的示例代码中并没有使用实际的GPS或位置数据,而是直接使用了一个包含经纬度坐标的数组。在实际应用中,你需要根据实际情况获取真实的位置数据,并将其转换为经纬度坐标,然后再进行轨迹回放的绘制。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值