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;
|
}
|