最近闲的没事干,发现滴滴出行的app,地图上的小汽车可以跑,很炫是不是,我们公司也是做车辆监控的app的,我就一直揣摩着怎么也让我们的小汽车在地图上跑来跑去啊,这样给人感觉好点,废话不说了,先看下滴滴出行的界面;

1.我们的gps数据是车辆10秒上报一次位置数据;前端请求数据获取当前最新的gps位置;
2.第一次请求到数据后我把所有的车辆先标记到地图上,高德地图有标记方法;
3.标记到地图上以后,需要把marker存放到list记录下来(为了更新移动使用);
4.当再次请求道新的gps数据的时候,我们需要平滑的移动到最新的位置,关键问题是再这里;怎么样在才能平滑移动呢,无非就是需要不断的移动从当前位置到最新的位置,这里就当时从A点移动到B点,无非就是marker.setPosition(),不断的调用知道B点,
List<Marker> markersMap = new ArrayList(Marker);
private void addMarkToMap(List<MarkerCarOptions> markerCarOptions){
if(markersMap.size()!=0){
for (Marker marker : markersMap) {
for (MarkerCarOptions options : markerCarOptions) {
if(marker.getObject().equals(options.car.getBusid())){
moverCar(marker, options);
break;
}
}
}
}
/**
* 更新地图车辆位置
* @param markerCarOptions
*/
private void moverCar(final Marker marker,final MarkerCarOptions options){
final List<LatLng> roads = new ArrayList<LatLng>();
LatLng startLatLng = marker.getPosition();
LatLng endLatLng = options.markerOptions.getPosition();
LatLng latLng_2 = new LatLng((startLatLng.latitude+endLatLng.latitude)/2, (startLatLng.longitude+endLatLng.longitude)/2);
LatLng latLng_1 = new LatLng((startLatLng.latitude+latLng_2.latitude)/2, (startLatLng.longitude+latLng_2.longitude)/2);
LatLng latLng_3 = new LatLng((latLng_2.latitude+endLatLng.latitude)/2, (latLng_2.longitude+endLatLng.longitude)/2);
roads.add(latLng_1);
roads.add(latLng_2);
roads.add(latLng_3);
roads.add(endLatLng);
Thread t =new Thread(new Runnable() {
@Override
public void run() {
try {
for (int i = 0; i < roads.size(); i++) {
marker.setPosition(roads.get(i));
Thread.sleep(200);
}
marker.setIcon(options.markerOptions.getIcon());
} catch (Exception e) {
e.printStackTrace();
}
}
});
t.start();
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
5,最后需要说明的是,大家问平均获取的中间点这样获取到底对不对,我告诉你确切的说是不准确的,但是在10秒每次上报的数据之间来这样算是没错的;具体大家可以测下下就知道了,稍后再上了例子好了