/** * 获取两个时间之间的时间间隔 * @param time1 * @param time2 * @returns {number} */ export function getTimeInterval(time1, time2) { if (time1 == null || time2 == null) return 0 let t1 = Number(time1) let t2 = Number(time2) // 秒级 → 转毫秒 if (t1 < 1e12) t1 *= 1000 if (t2 < 1e12) t2 *= 1000 return Math.abs(t2 - t1) } /** * 格式化时间为 HH:mm:ss */ export function formatTime(time) { if (time == null) return '' let timestamp = Number(time) if (timestamp < 1e12) timestamp *= 1000 const date = new Date(timestamp) const hh = String(date.getUTCHours()).padStart(2, '0') const mm = String(date.getUTCMinutes()).padStart(2, '0') const ss = String(date.getUTCSeconds()).padStart(2, '0') return `${hh}:${mm}:${ss}` } /** * 轨迹分组 * @param trajectory * @param {object} options * @returns {*} */ export function trajectoryGrouping(trajectory, options) { if (Array.isArray(trajectory) && trajectory.length === 0) { console.warn('分组失败:无有效轨迹数据') return [] } // 排序轨迹 const sortedPath = trajectory.sort((a, b) => new Date(a.tm).getTime() - new Date(b.tm).getTime(), ) const result = [] let currentGroup = { startTime: null, endTime: null, path: [], } for (let i = 0; i < sortedPath.length; i++) { const point = sortedPath[i] if (currentGroup.path.length === 0) { // 初始化分组 currentGroup.startTime = point.tm currentGroup.endTime = point.tm currentGroup.path.push(point) continue } const prevPoint = sortedPath[i - 1] const interval = getTimeInterval(prevPoint.tm, point.tm) const gapMs = options?.gapMs || 1800000 if (interval > gapMs) { // 2️⃣ 时间间隔超过阈值,结束当前分组 result.push(formatGroup(currentGroup)) // 新建分组 currentGroup = { startTime: point.tm, endTime: point.tm, path: [point], } } else { // 继续当前分组 currentGroup.endTime = point.tm currentGroup.path.push(point) } } // 3️⃣ 推入最后一组 if (currentGroup.path.length > 0) { result.push(formatGroup(currentGroup)) } return result } function formatGroup(group) { return { key: `${formatTime(group.startTime)}-${formatTime(group.endTime)}`, path: group.path, } }