百度地图- - - 鹰眼轨迹- - - 历史轨迹和里程查询

    准备工作就不多说了,在之前的实时定位中已经提过,这里就主要说下思路

    查询历史轨迹, 主要是要有时间段,并且这个时间段必须在24小时之内,而且传入的时间参数居然是int的,为毛百度就不能用long呢,坑爹的,将long转化为int有时候会报错,就不多说,截取吧...

    

//选择交通方式
			if (!radiobutton_drive.isChecked() && !radiobutton_walk.isChecked() && !radiobutton_ride.isChecked()) {
				MyToastUtils.show(MainActivity.this, "请选择交通方式");
				return;
			}
			if (radiobutton_drive.isChecked()) {
				Log.i(TAG, "选中方式"+radiobutton_drive.getText());
				transport_modes = "transport_mode=1";
			}else if (radiobutton_ride.isChecked()) {
				Log.i(TAG, "选中方式"+radiobutton_ride.getText());
				transport_modes = "transport_mode=2";
			}else if (radiobutton_walk.isChecked()) {
				Log.i(TAG, "选中方式"+radiobutton_walk.getText());
				transport_modes = "transport_mode=3";
			}
			StringBuffer startBuffer = new StringBuffer();
			startBuffer.append(input_starttime_year)
					.append("-")
					.append(input_starttime_month)
					.append("-")
					.append(input_starttime_day)
					.append(" ")
					.append(input_starttime_hour);
			StringBuffer endBuffer = new StringBuffer();
			endBuffer.append(input_endtime_year)
					.append("-")
					.append(input_endtime_month)
					.append("-")
					.append(input_endtime_day)
					.append(" ")
					.append(input_endtime_hour);
				startTimeStamp = DateUtils.getTimeToStamp(startBuffer.toString());
				endTimeStamp = DateUtils.getTimeToStamp(endBuffer.toString());
				Log.i(TAG, startTimeStamp+"---"+endTimeStamp);
				if (endTimeStamp >= startTimeStamp) {
					checkHistoryLineHandler.sendEmptyMessage(222);

handler发送完后就,直接查询历史轨迹,也可以查询里程

checkHistoryLineThread = new HandlerThread("checkHistoryLine");
		checkHistoryLineThread.start();
		checkHistoryLineHandler = new Handler(checkHistoryLineThread.getLooper()){
			@Override
			public void handleMessage(Message msg) {
				super.handleMessage(msg);
				if (null != msg) {
					if (msg.what == 222) {
						//查询的dialog取消掉
						mHandler.obtainMessage(DIALOG_DISMISS).sendToTarget();
                                                 //查历史轨迹
						queryHistoryLine();
						//查里程
						queryDistances(startTimeStamp,endTimeStamp);
					}
				}
			}
		};
/**
	 * 查询历史轨迹
	 */
	protected void queryHistoryLine() {
		//轨迹服务ID
		long serviceId = mApp.getServiceId();
		 // entity标识列表(多个entityName,以英文逗号"," 分割)
        String entityName = mApp.getName();
        // 是否返回精简结果 (0 : 返回全部结果,1 : 返回精简结果)
        int simpleReturn = 1;
        /* 1 返回纠偏轨迹,为0则返回原始轨迹      
         * 当设置为 1 时 , 默认仅进行去噪和抽稀处理,并不作绑路处理
         * */
        int isProcessed = 1;
        /* 纠偏选项  
         *  ①need_denoise:去噪,默认为1
        	②need_vacuate:抽稀,默认为1
        	③need_mapmatch:绑路,之前未开通绑路的service,默认值为0;之前已开通绑路的service,默认值为1。 
        	transport_mode:交通方式, 1: 驾车,2: 骑行,3: 步行。默认为1:驾车。
        	设置该参数后,系统将根据所选的交通方式,进行适应该方式的去噪、抽稀、绑路处理(注:目前仅影响绑路策略)
        */
        String processOption = "need_denoise=1,need_vacuate=1,need_mapmatch=1,"+transport_modes;
        //开始查询的时间点
        int startTimes = startTimeStamp;
        //结束的时间点
        int endTimes = endTimeStamp;
        //分页大小, 每页有几条记录,默认100 ,最大5000
        int pageSize = 4000;
        //分页索引, 代表返回第几页, 默认是1 
        int pageIndex = 1; 
        
		traceClient.queryHistoryTrack(serviceId , entityName, simpleReturn, isProcessed,   
				  processOption, startTimes, endTimes, pageSize, pageIndex, myHistoryTrace);
	}
/**
	 * 查询里程
	 */
	public void queryDistances(int startTime,int endTime){
		//轨迹服务ID
		long serviceId = mApp.getServiceId();
		 // entity标识列表(多个entityName,以英文逗号"," 分割)
        String entityName = mApp.getName();
        /* 1 返回纠偏轨迹,为0则返回原始轨迹      
         * 当设置为 1 时 , 默认仅进行去噪和抽稀处理,并不作绑路处理
         * */
        int isProcessed = 1;
        /* 纠偏选项  
         *  ①need_denoise:去噪,默认为1
        	②need_vacuate:抽稀,默认为1
        	③need_mapmatch:绑路,之前未开通绑路的service,默认值为0;之前已开通绑路的service,默认值为1。 
        	transport_mode:交通方式, 1: 驾车,2: 骑行,3: 步行。默认为1:驾车。
        	设置该参数后,系统将根据所选的交通方式,进行适应该方式的去噪、抽稀、绑路处理(注:目前仅影响绑路策略)
        */
//        String processOption = "need_denoise=1,need_vacuate=1,need_mapmatch=1,"+transport_modes;
        String processOption = "need_denoise=1,need_vacuate=1,need_mapmatch=1";
        /**
         *  里程补充 ,当轨迹中断5分钟以上,会被认为是一段中断轨迹 
         *  driving:使用最短驾车路线距离补充 
         *  riding:使用最短骑行路线距离补充 
         *  walking:使用最短步行路线距离补充 
         *  straight:使用直线距离补充 
         *  no_supplement:不补充,中断两点间距离不记入里程。 
         */
        String supplementMode = null;
        if (radiobutton_drive.isChecked()) {
			supplementMode = "driving";
		}else if (radiobutton_ride.isChecked()) {
			supplementMode = "riding";
		}else if (radiobutton_walk.isChecked()) {
			supplementMode = "walking";
		}else if (isLoca) {
			supplementMode = "no_supplement";
		}
		traceClient.queryDistance(serviceId, entityName, isProcessed,processOption, supplementMode, startTime,endTime, myHistoryTrace);
	}
	private void initHistoryTrcak() {
		myHistoryTrace = new OnTrackListener(){
			public void onQueryHistoryTrackCallback(String message) {
				//返回的是json的字符串
				Log.i(TAG, message+"-!!!------哈");
				try {
					JSONObject obje = new JSONObject(message);
					Log.i(TAG, obje+"历史轨迹的");
					if (null != obje) {
						if ((Integer)obje.get("status") == 0) {
							/*
							 * 这里start_point和end_point这两个字段返回的是对象{} ,所以用getJSONObject
							 * obj.getJSONObject("start_point")
							 * 这里point这个字段返回的是数组[] ,所以用getJSONArray
							 * obj.getJSONArray("points")
							 */
							//这个是返回的轨迹点的集合, 每个点 有经纬度
							JSONArray array = obje.getJSONArray("points");
							Log.i(TAG, array.length()+"----array");
							if (null != array || array.length() == 0) {
								LatLng ll = null;
								for (int i = 0; i < array.length(); i++) {
									JSONArray array2 = array.getJSONArray(i);
									 ll = new LatLng(array2.getDouble(1),array2.getDouble(0));
									 pointList.add(ll);
							//画线	
	                                   mHandler.obtainMessage(DRAW_HISTORY_LINE,ll).sendToTarget();
								}
							}else{
								//没有轨迹
								mHandler.obtainMessage(TRACE_NOT).sendToTarget();
							}
							
							//这是开始位置
							JSONObject startLocal = obje.getJSONObject("start_point");
								double startLocal_longitude = Double.parseDouble(startLocal.get("longitude").toString());
								double startLocal_latitude = Double.parseDouble(startLocal.get("latitude").toString());
							//结束位置
							JSONObject endLocal = obje.getJSONObject("end_point");
								double endLocal_longitude = Double.parseDouble(endLocal.get("longitude").toString());
								double endLocal_latitude = Double.parseDouble(endLocal.get("latitude").toString());
								
							if (startLocal_longitude == 0.0 ||startLocal_latitude == 0.0
										||endLocal_longitude == 0.0 || endLocal_latitude == 0.0) {
									Log.i(TAG, "没有轨迹点");
									mHandler.obtainMessage(TRACE_NOT).sendToTarget();
							}else{
									LatLng startlocal_ll = new LatLng(startLocal_latitude,startLocal_longitude);
									mHandler.obtainMessage(DRAW_HISTORY_LINE_START, startlocal_ll).sendToTarget();
									LatLng endlocal_ll = new LatLng(endLocal_latitude,endLocal_longitude);
									mHandler.obtainMessage(DRAW_HISTORY_LINE_END, endlocal_ll).sendToTarget();
							}
							
							
						}else if ((Integer)obje.get("status") == 2) { //开始结束时间间隔不能超过24小时
							mHandler.obtainMessage(ERROR_MESSAGE, obje.get("message")).sendToTarget();;
						}
					}
				} catch (JSONException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
					Log.i(TAG, "解析失败----");
				}
				mHandler.obtainMessage(PROGRESS_DIALOG_DISMISS).sendToTarget();
			}

			//返回路程的监听回调
			@Override
			public void onQueryDistanceCallback(String msg) {
				super.onQueryDistanceCallback(msg);
				Log.i(TAG, "查询里程"+msg);
				try {
					JSONObject o = new JSONObject(msg);
					double s = Double.parseDouble(o.get("distance").toString());
					Log.i(TAG, "里程msg"+o+"距离"+s);
					if (isLoca) { //如果实时定位开着, 这时候 要把每次获取出的距离都累加起来
						totalDistance += s;
						totalDistance = MathUtils.convert(totalDistance);
						Log.i(TAG, totalDistance+"--实时定位的距离--"+s);
						mHandler.obtainMessage(SHOW_DISTANCE, totalDistance).sendToTarget();
					}else{
						mHandler.obtainMessage(SHOW_HISTORY_DISTANCE, MathUtils.convert(s)).sendToTarget();
					}
				} catch (JSONException e) {
					e.printStackTrace();
				}
			}
			@Override
			public void onRequestFailedCallback(String arg0) {
				// TODO Auto-generated method stub
				Log.i(TAG, arg0+"-!!!------噶");
				
			};
		};
	}
case DRAW_HISTORY_LINE: //历史轨迹
				LatLng ll = (LatLng) msg.obj;
				drawLineOrTimeLoca(ll,true);
				break;
case DRAW_HISTORY_LINE_START:
				LatLng loca_start = (LatLng) msg.obj;
				setMarker(loca_start, "start");
				break;
case DRAW_HISTORY_LINE_END:
				LatLng loca_end = (LatLng) msg.obj;
				setMarker(loca_end, "end");
				break;
/**
	 * 绘制历史轨迹路线或者 实时定位
	 * 传true 表示需要绘制历史轨迹
	 * 传false 表示不需要绘制历史轨迹
	 */
	protected void drawLineOrTimeLoca(LatLng point,boolean lineOrLoca) {
		if (lineOrLoca) {
			if (pointList.size() >= 2 && pointList.size() <= 10000) {
				// 添加路线(轨迹)
				polyline = new PolylineOptions().width(10).color(Color.RED).points(pointList);
			}else{
				pointList = pointList.subList(10000, pointList.size());
				polyline = new PolylineOptions().width(10).color(Color.RED).points(pointList);
			}
		}
		setMarker(point, "routeline");
	}

设置覆盖物setMarker的方法 ,在前面的实时定位中已经贴出来了,需要的可以到那里去看

转载于:https://my.oschina.net/fbf8866/blog/853349

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值