Icon layer в Kepler.gl построен на основе слоя IconLayer из deck.gl и предназначен для отображения точечных объектов с использованием пользовательских изображений-иконок вместо стандартных геометрических маркеров. Этот слой особенно полезен в задачах визуализации, где требуется семантическое различие объектов через пиктограммы: транспорт, точки интереса, события, категории объектов, статусы.
В отличие от классических scatter-слоёв, работающих с примитивами (круги, квадраты), Icon layer оперирует спрайтами, загружаемыми из атласа изображений. Это позволяет значительно повысить выразительность карты при сохранении производительности за счёт батчинга текстур.
Слой строится вокруг трёх ключевых компонентов:
Каждая запись данных сопоставляется с конкретной иконкой из атласа, которая затем рендерится в заданной географической точке.
Типичная структура данных:
const data = [
{
coordinates: [71.4304, 51.1284],
type: "hospital"
},
{
coordinates: [71.4450, 51.1500],
type: "school"
}
];
В Kepler.gl слой Icon layer обычно конфигурируется через описание слоя в состоянии приложения или через API deck.gl при кастомной интеграции.
Пример конфигурации:
import { IconLayer } from '@deck.gl/layers';
const iconLayer = new IconLayer({
id: 'icon-layer',
data,
pickable: true,
getPosition: d => d.coordinates,
getIcon: d => ({
url: 'icons-atlas.png',
width: 128,
height: 128,
mask: true
}),
getSize: 32,
sizeScale: 1,
billboard: true
});
Ключевой механизм слоя — использование sprite atlas. Атлас представляет собой единое изображение, содержащее множество иконок, разложенных по сетке.
Дополнительно используется mapping-объект:
const iconMapping = {
hospital: { x: 0, y: 0, width: 32, height: 32, mask: true },
school: { x: 32, y: 0, width: 32, height: 32, mask: true },
airport: { x: 64, y: 0, width: 32, height: 32, mask: true }
};
И конфигурация слоя:
const layer = new IconLayer({
id: 'icon-layer',
data,
iconAtlas: '/atlas.png',
iconMapping,
getIcon: d => d.type,
getPosition: d => d.coordinates,
sizeScale: 2,
pickable: true
});
В Kepler.gl этот механизм скрыт за UI, где пользователь загружает иконки или выбирает предустановленные наборы.
Функция getPosition является обязательной и возвращает
координаты в формате [longitude, latitude]. Kepler.gl
строго придерживается WGS84.
Особенность Icon layer заключается в том, что иконка по умолчанию рендерится как billboard — всегда повёрнута к камере. Это задаётся параметром:
billboard: trueПри отключении billboard иконки начинают вести себя как элементы в 3D-пространстве, что используется реже и требует аккуратной настройки масштаба.
Размер иконок управляется несколькими параметрами:
getSize — функция или число базового размераsizeScale — глобальный множительsizeUnits — единицы измерения (meters, pixels)Пример динамического размера:
getSize: d => d.importance * 10,
sizeScale: 1
В Kepler.gl часто используется нормализация значений перед передачей в слой, чтобы избежать чрезмерного разброса размеров.
Icon layer поддерживает цветовое тонирование через параметр
getColor. Однако важно учитывать, что цвет применяется
корректно только при включённом mask: true в
iconMapping.
getColor: d => [255, 0, 0]
Маскирование позволяет перекрашивать белые пиксели иконки, что даёт возможность использовать один атлас для множества цветовых схем без дублирования изображений.
Параметр pickable: true включает поддержку
интерактивности. При наведении или клике слой возвращает объект данных,
связанный с иконкой.
Обработчики событий:
onClick: info => {
console.log(info.object);
},
onHover: info => {
console.log(info.coordinate);
}
Kepler.gl использует этот механизм для отображения всплывающих подсказок (tooltips) и выделения объектов.
Icon layer оптимизирован под работу с большими наборами точек благодаря GPU-рендерингу. Однако существуют ограничения:
getIcon может
увеличивать нагрузкуРекомендуемые подходы:
В Kepler.gl слои описываются декларативно через конфигурацию
visState. Icon layer представлен объектом слоя:
{
id: 'icon-layer',
type: 'icon',
config: {
dataId: 'dataset_1',
columns: {
lat: 'latitude',
lng: 'longitude'
},
visConfig: {
size: 30,
color: [0, 128, 255],
radius: 10
}
}
}
Kepler.gl автоматически трансформирует этот объект в соответствующий deck.gl IconLayer.
Одной из ключевых задач является маппинг полей данных на визуальные свойства. В Icon layer это включает:
Пример комбинированной логики:
getIcon: d => d.category,
getSize: d => d.value > 100 ? 40 : 20,
getColor: d => d.status === 'active'
? [0, 200, 0]
: [200, 0, 0]
Icon layer имеет ряд архитектурных ограничений:
Эти ограничения компенсируются высокой скоростью отрисовки и простотой интеграции.
Icon layer часто применяется для:
При этом слой часто комбинируется с:
Такая композиция позволяет строить многослойные аналитические карты, где Icon layer отвечает за семантическую интерпретацию точек, а остальные слои — за статистическое представление данных.