zjk
2026-07-29 429208957f30ab9eedc5533a81aaa284048d09f5
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
import { normalizeDistanceKm, normalizeDurationSeconds } from '../../../utils/format';
import { TripStatus } from '../../../constants/trip-status';
 
export type RouteDistance = { value: number; unit: 'km' | 'm' };
 
export type RoutePoint = {
    latitude: number;
    longitude: number;
};
 
export type VehiclePointMode =
    | 'first'
    | 'last'
    | 'served_last_then_first'
    | 'first_then_served_last';
 
export type RouteSnapshot = {
    points: RoutePoint[];
    distance: RouteDistance | null;
    duration: number | null;
    direction: number | null;
    timestamp: number | null;
    routeKey: string;
    vehicleMoveAlongPoints: RoutePoint[];
    forceFullRedraw: boolean;
    eraseVehiclePointMode: VehiclePointMode;
    normalVehiclePointMode: VehiclePointMode;
};
 
// 归一化路线点。
export function normalizeRoutePoints(rawPoints: any): RoutePoint[] {
    if (!Array.isArray(rawPoints)) {
        return [];
    }
    return rawPoints
        .map((item: any) => ({
            longitude: Number(item?.longitude),
            latitude: Number(item?.latitude),
        }))
        .filter((item: RoutePoint) => Number.isFinite(item.longitude) && Number.isFinite(item.latitude));
}
 
// 归一化方向角到 0-359。
export function normalizeDirection(rawDirection: any) {
    const direction = Number(rawDirection);
    if (!Number.isFinite(direction)) {
        return null;
    }
    return ((direction % 360) + 360) % 360;
}
 
// 将分享页轮询返回的数据统一为路线快照。
export function buildShareRouteSnapshot(payload: {
    points: any[];
    servedPoints: any[];
    distance: any;
    duration: any;
    direction: any;
    timestamp?: any;
    routeKey?: any;
    forceFullRedraw?: boolean;
}): RouteSnapshot {
    const timestamp = Number(payload?.timestamp);
    return {
        points: normalizeRoutePoints(payload?.points),
        distance: normalizeDistanceKm(Number(payload?.distance)),
        duration: normalizeDurationSeconds(Number(payload?.duration)),
        direction: normalizeDirection(payload?.direction),
        timestamp: Number.isFinite(timestamp) ? timestamp : Date.now(),
        routeKey: String(payload?.routeKey || ''),
        vehicleMoveAlongPoints: normalizeRoutePoints(payload?.servedPoints),
        forceFullRedraw: payload?.forceFullRedraw === true,
        eraseVehiclePointMode: 'first_then_served_last',
        normalVehiclePointMode: 'served_last_then_first',
    };
}
 
// 判断当前状态是否属于平滑补帧态。
export function isSmoothMotionTripStatus(tripStatus: TripStatus | number) {
    return tripStatus === TripStatus.VehicleApproaching || tripStatus === TripStatus.InService;
}