TripsLayer в Deck.gl предназначен для визуализации
перемещения объектов во времени. Он строит анимированные траектории
(треки), где каждая точка маршрута имеет временную метку, а движение
воспроизводится как непрерывная анимация. Основное применение — анализ
транспортных потоков, логистики, перемещения пользователей, судов,
автомобилей или любых объектов с временной динамикой.
Ключевая особенность слоя заключается в интерполяции позиций по времени: отображается не весь маршрут сразу, а только его часть в пределах заданного временного окна.
TripsLayer ожидает массив объектов, каждый из которых описывает отдельный маршрут:
path — массив координат [lng, lat] или
[lng, lat, altitude]timestamps — массив временных меток, соответствующих
каждой точке путиПример структуры данных:
const data = [
{
path: [
[37.6156, 55.7522],
[37.6256, 55.7550],
[37.6356, 55.7600]
],
timestamps: [0, 10, 20]
}
];
Временные значения могут быть как относительными (секунды от начала), так и абсолютными (Unix timestamp), при условии согласованности внутри слоя.
dataИсточник маршрутов. Каждый объект должен содержать путь и временную шкалу.
getPathФункция доступа к координатам пути:
getPath: d => d.path
getTimestampsФункция доступа к временным меткам:
getTimestamps: d => d.timestamps
currentTimeОпределяет текущий момент анимации. Все сегменты пути фильтруются относительно этого значения.
trailLengthОпределяет длину “хвоста” маршрута. Чем больше значение, тем длиннее видимая часть пути за текущим положением объекта.
widthMinPixels /
widthMaxPixelsКонтроль толщины линии в пикселях. Используется для масштабирования визуального веса маршрута.
getColorФункция или массив, задающий цвет линии:
getColor: [255, 140, 0]
или динамически:
getColor: d => (d.type === 'taxi' ? [255, 0, 0] : [0, 128, 255])
TripsLayer работает через непрерывное обновление параметра
currentTime. На каждом кадре вычисляется:
trailLengthИнтерполяция между точками выполняется линейно, что обеспечивает плавное движение даже при редких временных метках.
import {Deck} from '@deck.gl/core';
import {TripsLayer} from '@deck.gl/geo-layers';
const layer = new TripsLayer({
id: 'trips-layer',
data,
getPath: d => d.path,
getTimestamps: d => d.timestamps,
getColor: [0, 200, 255],
opacity: 0.8,
widthMinPixels: 2,
trailLength: 50,
currentTime: 0
});
const deckgl = new Deck({
initialViewState: {
longitude: 37.62,
latitude: 55.75,
zoom: 12
},
controller: true,
layers: [layer]
});
Для движения времени обычно используется
requestAnimationFrame:
let time = 0;
function animate() {
time += 0.5;
deckgl.setProps({
layers: [
new TripsLayer({
id: 'trips-layer',
data,
getPath: d => d.path,
getTimestamps: d => d.timestamps,
getColor: [0, 200, 255],
trailLength: 60,
currentTime: time
})
]
});
requestAnimationFrame(animate);
}
animate();
Корректная работа слоя зависит от согласованности временной шкалы:
Пример нормализации:
const base = timestamps[0];
const normalized = timestamps.map(t => (t - base) / 1000);
Параметр trailLength управляет длиной видимого
следа:
Внутри слоя реализуется градиентная прозрачность, основанная на расстоянии от текущего времени.
TripsLayer оптимизирован для работы с большим количеством маршрутов, но чувствителен к следующим факторам:
Рекомендации:
Если в path используется третий компонент координаты,
слой поддерживает объёмную визуализацию:
path: [
[37.6156, 55.7522, 0],
[37.6256, 55.7550, 50],
[37.6356, 55.7600, 120]
]
Это позволяет моделировать:
getColor часто используется для кодирования
дополнительных параметров:
Пример зависимости от скорости:
getColor: d => {
const speed = d.speed;
return speed > 60 ? [255, 0, 0] : [0, 200, 100];
}
При работе с тысячами маршрутов важно учитывать:
Часто используется подход:
При каждом изменении времени слой:
Это делает TripsLayer чувствительным к частоте обновлений, особенно при сложных сценах.
TripsLayer часто комбинируется с:
ScatterplotLayer для отображения текущих позицийMapboxLayer для базовой картыHexagonLayer для плотности событийКомбинация позволяет строить аналитические панели движения в реальном времени.
path и
timestamps