準備工作就不多說了,在之前的實時定位中已經提過,這裡就主要說下思路
查詢曆史軌迹, 主要是要有時間段,并且這個時間段必須在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