deck.gl включает специализированный слой TripsLayer, предназначенный для воспроизведения движения объектов по маршрутам с учётом времени. Он используется для визуализации траекторий транспорта, перемещения пользователей, логистических цепочек и любых данных, где геометрия зависит от временной оси.
TripsLayer реализует концепцию «следа движения», где каждая точка пути привязана к таймстемпу, а визуализация формируется как непрерывная анимация по временной шкале. В отличие от статических линий, слой показывает динамику перемещения и историю движения в одном кадре.
TripsLayer строится на массиве координат, где каждая точка маршрута содержит:
[lon, lat]timestampКаждый маршрут интерпретируется как упорядоченная последовательность точек, образующая путь движения объекта.
Ключевая идея заключается в сравнении времени каждой точки с
глобальным параметром currentTime. Это значение определяет,
какая часть маршрута уже «произошла», а какая ещё скрыта.
Типичная структура данных для TripsLayer:
const data = [
{
path: [
[37.6156, 55.7522, 0],
[37.6160, 55.7530, 10],
[37.6175, 55.7542, 20]
]
}
];
Альтернативный формат с отдельными таймстемпами:
const data = [
{
path: [
[lng, lat],
[lng, lat]
],
timestamps: [0, 10, 20]
}
];
В большинстве случаев предпочтителен первый вариант, так как он компактнее и проще для GPU-передачи.
Функция, возвращающая маршрут:
getPath: d => d.path
Определяет геометрию линии движения.
Функция, возвращающая временные метки:
getTimestamps: d => d.timestamps
Если timestamps встроены в path, слой автоматически извлекает третью координату.
Глобальный параметр анимации:
currentTime: 50
Определяет «срез времени», до которого отображается движение. Все точки с timestamp > currentTime не отображаются.
trailLength: 30
Задаёт длину хвоста движения. Это количество времени (или единиц шкалы), которое остаётся видимым позади текущей позиции объекта.
Механика:
currentTime двигается вперёдcurrentTime - trailLength исчезаютОпределяет цвет маршрута:
getColor: [0, 128, 255]
Также может быть функцией:
getColor: d => d.color
Толщина линии:
getWidth: 3
Или динамическое значение:
getWidth: d => d.weight
TripsLayer не анимирует данные самостоятельно. Он зависит от внешнего
обновления currentTime.
Типичный цикл анимации:
let currentTime = 0;
function animate() {
currentTime += 1;
deck.setProps({
layers: [
new TripsLayer({
id: 'trips',
data,
getPath: d => d.path,
getTimestamps: d => d.timestamps,
currentTime,
trailLength: 60,
getColor: [255, 140, 0],
getWidth: 2
})
]
});
requestAnimationFrame(animate);
}
animate();
Каждый кадр пересчитывает видимую часть маршрутов.
TripsLayer построен поверх WebGL и использует GPU для обработки:
Это позволяет обрабатывать десятки тысяч маршрутов без деградации FPS.
Основные оптимизации:
Если точки маршрута редкие, слой выполняет линейную интерполяцию между ними.
Формально:
P(t) = P1 + (P2 - P1) * α
где α определяется нормализацией времени между двумя соседними точками.
Это позволяет:
TripsLayer работает в рамках единой шкалы времени, которая может быть:
Важно, чтобы все маршруты использовали одинаковую систему координат времени.
Пример нормализации:
const normalize = (t0, t1, t) =>
(t - t0) / (t1 - t0);
TripsLayer часто используется совместно с базовой картой:
Mapbox GL JS или аналогичными рендерерами.
Типичная структура:
new DeckGL({
mapStyle: 'mapbox://styles/mapbox/dark-v10',
initialViewState: {
longitude: 37.62,
latitude: 55.75,
zoom: 12
},
controller: true,
layers: [
new TripsLayer({...})
]
});
Карта предоставляет контекст, слой — динамику движения.
При масштабировании данных ключевыми становятся:
TripsLayer позволяет кодировать дополнительную информацию через цвет:
Пример динамического цвета:
getColor: d => {
if (d.speed > 60) return [255, 0, 0];
if (d.speed > 30) return [255, 165, 0];
return [0, 200, 255];
}
TripsLayer эффективно работает с различными моделями:
Каждый маршрут может рассматриваться как функция времени:
f(t) → (lon, lat)
TripsLayer не интерпретирует смысл данных, он отображает только геометрию и временную структуру.
Ключевые практики:
updateTriggers для мемоизации
функцийgetPathПример:
new TripsLayer({
id: 'trips',
data,
getPath,
getTimestamps,
updateTriggers: {
getColor: colorScheme
}
})
При использовании нескольких TripsLayer важно синхронизировать:
currentTimeanimation speedЭто позволяет сравнивать маршруты между собой и анализировать взаимодействие потоков.
Trail формируется как градиентное затухание вдоль линии движения. Интенсивность зависит от разницы:
opacity ∝ currentTime - timestamp
Это создаёт визуальное разделение:
TripsLayer применяется для:
Особенно эффективно в системах с большим количеством событий во времени.
TripsLayer часто комбинируется с:
Так формируется многослойная модель пространственно-временного анализа.