历史轨迹代码参考自:官方demo:AMap3DDemo. (PolylineActivity)
高德地图纠偏地址:https://lbs.amap.com/api/android-sdk/guide/draw-on-map/track-sdk/
业务流程
取自TSP的GPS数据,在APP端要进行轨迹纠偏,纠偏后的坐标点,进行路线描画。
代码部分
1.首先,将TSP返回的点数据,进行类型转换,需要的详细如下,只有包含如下轨迹纠偏才更准确:
2.将多余的点去重
同样的坐标点会影响纠偏结果
3.时间点排序
以上三点可以保证纠偏的准确率
private void trace(List<GpsBean> gpsBeanList) {
if (DataUtil.isListNotEmpty(gpsBeanList)) {
Observable.fromIterable(gpsBeanList)
.map(new Function<GpsBean, TraceLocation>() {
@Override
public TraceLocation apply(GpsBean gpsBean) throws Exception {
TraceLocation traceLocation = new TraceLocation();
if (gpsBean != null) {
if (RegexUtils.isDouble(gpsBean.getLon()) && RegexUtils.isDouble(gpsBean.getLat())) {
double var1 = Double.valueOf(gpsBean.getLon());
double var3 = Double.valueOf(gpsBean.getLat());
traceLocation.setLongitude(var1);
traceLocation.setLatitude(var3);
} else {
traceLocation.setLongitude(0);
traceLocation.setLatitude(0);
}
if (RegexUtils.isDouble(gpsBean.getSpeed())) {
float var1 = Float.valueOf(gpsBean.getSpeed());
traceLocation.setSpeed(var1);
} else {
traceLocation.setSpeed(0);
}
if (RegexUtils.isDouble(gpsBean.getHead())) {
float var1 = Float.valueOf(gpsBean.getHead());
traceLocation.setBearing(var1);
} else {
traceLocation.setBearing(0);
}
traceLocation.setTime(DateUtils.parseTimeMillis(gpsBean.getTime()));
}
return traceLocation;
}
}).observeOn(Schedulers.io())
.distinct(new Function<TraceLocation, String>() {
@Override
public String apply(TraceLocation traceLocation) throws Exception {
return String.valueOf(traceLocation.getTime()) +
traceLocation.getLatitude() +
traceLocation.getLongitude() +
traceLocation.getSpeed() +
traceLocation.getBearing();
}
})
.toSortedList(new Comparator<TraceLocation>() {
@Override
public int compare(TraceLocation o1, TraceLocation o2) {
if (o1.getTime() > o2.getTime()) {
return 1;
} else if (o1.getTime() < o2.getTime()) {
return -1;
} else {
return 0;
}
}
})
.subscribeOn(AndroidSchedulers.mainThread())
.subscribe(new SingleObserver<List<TraceLocation>>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onSuccess(List<TraceLocation> traceLocations) {
LogUtils.i(TAG, "traceLocations ===" + new Gson().toJson(traceLocations));
LogUtils.i(TAG, "traceLocations ===" + traceLocations.size());
if (traceLocations.size() == 1) {
List<LatLng> latLngs = new ArrayList<>();
latLngs.add(new LatLng(traceLocations.get(0).getLatitude(), traceLocations.get(0).getLongitude()));
addPolylinesWithColors(latLngs);
} else {
mTraceClient.queryProcessedTrace(lineID, traceLocations, LBSTraceClient.TYPE_AMAP, HistoricalScoreDetailActivity.this);
}
}
@Override
public void onError(Throwable e) {
}
});
} else {
LogUtils.e(TAG, "列表是空");
}
}
4.轨迹纠偏的回调有如下,三个
//轨迹纠偏失败回调。
@Override
public void onRequestFailed(int i, String s) {
LogUtils.i(TAG, "onRequestFailed i ===" + i);
if (lineID == i) {
//当传入的轨迹点数据出现以下几种情况,会因为参数错误导致纠偏失败,进入 onRequestFailed 回调。
//网络不连通。
//原始轨迹数据只有1个点。
}
}
@Override
public void onTraceProcessing(int i, int i1, List<LatLng> list) {
LogUtils.i(TAG, "onTraceProcessing i ===" + i);
if (lineID == i) {
}
}
@Override
public void onFinished(int i, List<LatLng> list, int i1, int i2) {
LogUtils.i(TAG, "onFinished i ===" + i);
if (lineID == i) {
addPolylinesWithColors(list);
}
}
5.在轨迹纠偏结束时,onFinished()方法会被调用,参考官方demo
private void addPolylinesWithColors(List<LatLng> list) {
LogUtils.i(TAG, "addPolylinesWithColors");
if (!DataUtil.isListNotEmpty(list)) {
LogUtils.e(TAG, "路线纠偏后,列表是null");
return;
}
List<LatLng> markers = new ArrayList<>();
markers.add(list.get(0));
if (list.size() > 1) {
markers.add(list.get(list.size() - 1));
}
//用一个数组来存放颜色,四个点对应三段颜色
List<Integer> colorList = new ArrayList<Integer>();
colorList.add(getResources().getColor(R.color.app_blue));
PolylineOptions options = new PolylineOptions();
options.width(10);//设置宽度
options.addAll(list);
//加入对应的颜色,使用colorValues 即表示使用多颜色,使用color表示使用单色线
options.colorValues(colorList);
aMap.addPolyline(options);
markerModel.setMarker(markers);
NaviTools.zoomToSpan2(aMap, list, 100);
}