useMapTrackPlayback.ts
1.39 KB
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
import { Ref, unref } from 'vue';
export const useMapTrackPlayBack = (mapInstance: Ref<Nullable<Recordable>>) => {
const positionList: Record<'lng' | 'lat', number>[] = [];
const drawLine = (position: Record<'lng' | 'lat', number>) => {
try {
if (!position.lat || !position.lng) return;
positionList.push(position);
marketPoint(position);
if (positionList.length === 1) return;
const point: any[] = [];
const BMapGL = (window as any).BMapGL;
for (const { lng, lat } of positionList.slice(-2)) {
point.push(new BMapGL.Point(lng, lat));
}
const pl = new BMapGL.Polyline(point);
const BMapGLLib = (window as any).BMapGLLib;
const duration = 2000;
const delay = 300;
const trackAni = new BMapGLLib.TrackAnimation(unref(mapInstance), pl, {
overallView: true,
tilt: 30,
duration,
delay,
});
trackAni?.start?.();
} catch (error) {
throw error;
}
};
function marketPoint(params: Partial<Record<'lng' | 'lat', number>>) {
const { lng, lat } = params;
if (![lng, lat].every(Boolean)) return;
const BMap = (window as any).BMapGL;
if (!BMap) return;
const marker = new BMap.Marker(new BMap.Point(lng, lat));
unref(mapInstance)?.centerAndZoom(new BMap.Point(lng, lat));
unref(mapInstance)?.addOverlay(marker);
}
return { drawLine };
};