目录
一、前言
大家好,我是小五。前段时间,公司需要做和地图相关的业务,我们采用了高德地图进行开发,其中用到了历史轨迹、显示点、小车滑动、导航等功能。下面,我就使用中的问题,进行一下总结。
讲一下,总体来说,使用高德比百度要简单一些。其他的功能都挺好实现的,问题不大。唯独历史轨迹功能中的纠偏API,浪费了我很长时间。
最后也做了小车平滑移动,最后实现的效果同官方文档:https://lbs.amap.com/dev/demo/smooth-move#Android
二、官方文档
高德纠偏官方文档是这样写的:
地址:https://lbs.amap.com/dev/demo/path-record#Android
大家可以看到,上图中有两个SDK展示,第一个是: Android地图SDK;第二个是:Android定位SDK。
Android定位SDK 咱们不用管,因为定位SDK是为了采集坐标点。采集坐标点不一定非得通过高德实现,也可以使用其他的定位产品,只需要做好坐标系之间的转换即可。
这篇文章我们关心的是Android地图SDK 中的 addPolyline(PolylineOptions options)、queryProcessedTrace(int lineID, java.util.List locations, int type, TraceListener listener)、onFinished(int lineID, java.util.List linepoints, int distance, int waitingtime)这三个方法。
在地图上划线挺简单的,这里就不多说了。主要说一下下面这两个方法,都是关于轨迹纠偏的。
高德地图的文档写的很清楚:
三、具体实现
于是,我自然按照文档来实现了,下面是我写的代码:
传入原始坐标,对轨迹进行纠偏处理:
cutLatlng:纠偏前的轨迹坐标点
queryProcessedTrace(int lineID, java.util.List locations, int type, TraceListener listener)
lineID的意义:路线的编号,可以多条轨迹同时纠偏,具体用法可以看文档。一般都是一条轨迹纠偏,所以一般都填1;
locations的意义:路线轨迹点的集合;
type的意义:轨迹点集合(locations)中点的坐标系类型。比如:locations中坐标是百度坐标系下的点,那type =
LBSTraceClient.TYPE_BAIDU。我的代码里使用 AMapUtil.parseTraceLocationList()方法转换成了高德地图,所以我填的坐标点类型是LBSTraceClient.TYPE_AMAP(高德坐标系下的坐标);
listener:纠偏后的回调接口
if (!mActivity.cutLatlng.isEmpty()) {
// 调用轨迹纠偏,将mGraspTraceLocationList进行轨迹纠偏处理
mActivity.mTraceClient.queryProcessedTrace(1, AMapUtil.parseTraceLocationList(mActivity.cutLatlng),
LBSTraceClient.TYPE_AMAP, mActivity);
} else {
ToastUtil.showToast(mActivity, "暂无历史轨迹");
}
回调方法:
@Override
public void onFinished(int lineId, List<LatLng> list, int distance, int waitingTime) {
finishedLatLngs.addAll(list);
}
list是纠偏后的数据,然后拿着数据展示到地图上即可,完美!!!!!
四、问题
但是!
你会发现,你的轨迹始终只有一小段,而且无论你采集的轨迹有多远,纠偏之后,使用都只是同一小段。
五、解决方法
就是这个问题,困扰了我两天时间,最后终于发现问题所在了。高德的纠偏方法,每次只能纠偏30个点,无论你一次输入多少个点,都始终纠偏前30个点,后面的点会自动舍弃。这就是问题所在了,所以我就把所有的原始数据进行分割,30个点一段,然后逐段进行纠偏,然后再合并,最后实现了历史轨迹并将轨迹线纠正到路上!