天天看點

百度地圖- - - 鷹眼軌迹- - - 曆史軌迹和裡程查詢

    準備工作就不多說了,在之前的實時定位中已經提過,這裡就主要說下思路

    查詢曆史軌迹, 主要是要有時間段,并且這個時間段必須在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的方法 ,在前面的實時定位中已經貼出來了,需要的可以到那裡去看

版權聲明:本文為CSDN部落客「weixin_34378045」的原創文章,遵循CC 4.0 BY-SA版權協定,轉載請附上原文出處連結及本聲明。

原文連結:https://blog.csdn.net/weixin_34378045/article/details/91890400