В Kepler.gl всплывающие подсказки (tooltip) формируются на основе
данных слоя и конфигурации визуализации. Tooltip не является отдельным
UI-компонентом, который полностью контролируется разработчиком — он
собирается динамически из описания слоя, полей данных и правил
форматирования, заданных в visState.
Ключевая особенность системы заключается в том, что отображаемые значения проходят несколько уровней обработки: сырые данные → форматтеры колонок → конфигурация слоя → финальная сборка tooltip.
Основой tooltip является объект данных слоя (layer.data)
и выбранная строка (feature), на которую пользователь навёл курсор.
Каждый слой в Kepler.gl работает с набором данных в формате:
{
fields: [
{ name: 'timestamp', type: 'integer' },
{ name: 'lat', type: 'real' },
{ name: 'lng', type: 'real' }
],
rows: [
{ timestamp: 1700000000, lat: 50.45, lng: 30.52 }
]
}
При наведении курсора Kepler.gl определяет активный объект и передаёт его в систему tooltip как “picked object”.
Когда пользователь взаимодействует с картой, формируется структура:
{
layer: 'trip-layer',
object: {
index: 0,
lat: 50.45,
lng: 30.52,
timestamp: 1700000000
},
fields: [
'timestamp',
'lat',
'lng'
]
}
Эта структура далее используется для построения отображаемого содержимого.
Основная логика управления tooltip находится в
visState.interactionConfig.tooltip.
Пример конфигурации:
const config = {
visState: {
interactionConfig: {
tooltip: {
enabled: true,
fieldsToShow: {
'trip-layer': ['timestamp', 'lat', 'lng']
},
compareMode: false,
compareType: 'absolute'
}
}
}
};
fieldsToShow определяет, какие поля будут отображаться
для каждого слоя. Это ключевой механизм фильтрации данных перед
выводом.
Особенности:
Kepler.gl поддерживает форматирование значений через
columnFormat. Это позволяет преобразовать сырые данные
перед отображением в tooltip.
const config = {
visState: {
layers: [],
interactionConfig: {},
columnFormat: {
timestamp: {
format: 'YYYY-MM-DD HH:mm:ss'
},
lat: {
format: 'latlng'
}
}
}
};
Форматтеры применяются в зависимости от типа данных:
Числовые значения
Дата и время
Географические координаты
Перед отображением tooltip проходит следующий pipeline:
fieldsToShowcolumnFormatПример результата после обработки:
[
{ name: 'timestamp', value: '2023-11-14 12:30:00' },
{ name: 'lat', value: '50.45°' },
{ name: 'lng', value: '30.52°' }
]
Kepler.gl позволяет полностью переопределить содержимое tooltip через кастомную функцию.
const getTooltip = (hoveredObject) => {
const { object, layer } = hoveredObject;
return {
title: `Объект слоя ${layer.id}`,
fields: [
{
label: 'Время события',
value: new Date(object.timestamp * 1000).toLocaleString()
},
{
label: 'Координаты',
value: `${object.lat}, ${object.lng}`
}
]
};
};
Такая функция позволяет:
Разные типы слоёв Kepler.gl используют разные стратегии формирования tooltip.
Отображает свойства точки:
Tooltip содержит:
Основной акцент на:
Особенности:
В этом случае tooltip чаще всего работает с агрегированными данными, а не с исходными строками.
При использовании агрегирующих слоёв (HexagonLayer, GridLayer) tooltip получает не исходные записи, а вычисленные значения.
Пример:
{
count: 42,
sum: 1200,
avg: 28.5
}
В конфигурации можно управлять тем, какие агрегаты отображаются:
fieldsToShow: {
'hex-layer': ['count', 'avg']
}
Часто tooltip содержит не только данные из набора, но и вычисляемые значения:
const enhancedObject = {
...object,
speed: object.distance / object.time,
efficiency: object.output / object.input
};
Для таких полей применяются те же правила columnFormat,
однако важно учитывать:
Порядок отображения tooltip определяется следующими факторами:
fieldsToShowПример строгого контроля порядка:
fieldsToShow: {
'layer-id': ['name', 'category', 'value']
}
В продвинутых сценариях tooltip может менять содержимое в зависимости от данных:
const getTooltip = ({ object }) => {
const fields = [];
if (object.type === 'vehicle') {
fields.push({ label: 'Скорость', value: object.speed });
}
if (object.type === 'station') {
fields.push({ label: 'Пассажиры', value: object.passengers });
}
return { fields };
};
Такой подход позволяет создавать адаптивные tooltip-структуры, зависящие от бизнес-логики.
Tooltip в Kepler.gl устойчив к отсутствующим данным, однако поведение зависит от конфигурации:
null обычно отображается как пустое значениеundefined пропускается'N/A' выводятся как естьРекомендуется нормализовать данные до передачи в слой:
const safeValue = (v) => v ?? '—';
Tooltip формируется на лету, поэтому при больших наборах данных важно учитывать:
Оптимизация:
const precomputedData = data.map(d => ({
...d,
speed: d.distance / d.time
}));
Kepler.gl фильтры (filters в visState)
влияют на tooltip косвенно:
Финальная логика можно представить как цепочку:
Raw Data
→ Layer Selection
→ Interaction Detection
→ fieldsToShow Filtering
→ columnFormat Transformation
→ Optional Custom Tooltip Function
→ Render Output
Эта модель обеспечивает гибкость, позволяя одновременно использовать декларативную конфигурацию и императивное управление отображением данных.