准备工作就不多说了,在之前的实时定位中已经提过,这里就主要说下思路
查询历史轨迹, 主要是要有时间段,并且这个时间段必须在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