deck.gl предоставляет набор GPU-ускоренных слоёв для визуализации больших геопространственных данных. ScreenGridLayer относится к категории агрегирующих слоёв, выполняющих расчёт плотности точек непосредственно в экранных координатах. Это ключевое отличие от географических сеток, где расчёты зависят от проекции мира.
ScreenGridLayer строит регулярную сетку поверх текущего viewport и агрегирует данные в ячейках фиксированного размера в пикселях, обеспечивая стабильную визуализацию плотности независимо от масштаба карты.
Основная идея слоя заключается в переходе от набора точек к матрице экранных ячеек.
Каждая точка данных:
Формально агрегирование можно представить как функцию:
[ cell(x, y) = _{i points} w_i I(i cell(x, y))]
cell(x,y)=_{i points} w_i I(i cell(x,y))
где:
Агрегация выполняется на GPU, что обеспечивает высокую производительность при миллионах объектов.
ScreenGridLayer не привязан к географическим координатам напрямую.
Сетка определяется параметром cellSizePixels, задающим
размер ячейки в пикселях.
Ключевые особенности:
Это приводит к эффекту “липкой” экранной плотности, где визуализация сохраняет читаемость на любом уровне масштаба.
Массив объектов, представляющих точки. Каждая запись может содержать
произвольную структуру, но обязательно должна поддерживать извлечение
координат через getPosition.
Пример структуры:
[
{ position: [69.589, 42.3], value: 10 },
{ position: [69.6, 42.31], value: 5 }
]
Функция извлечения координат:
getPosition: d => d.position
Координаты должны быть в формате [lng, lat].
Определяет вклад точки в итоговую ячейку:
getWeight: d => d.value
Если не задано, каждая точка имеет вес 1.
Определяет размер ячейки в экранных пикселях.
Типичный диапазон: 10–100 px.
Массив цветов, используемый для визуализации плотности. Значения интерполируются в зависимости от количества точек в ячейке.
Пример:
colorRange: [
[0, 0, 0, 0],
[0, 85, 255, 120],
[0, 170, 255, 180],
[0, 255, 200, 220],
[255, 255, 0, 255]
]
opacity управляет общей прозрачностью слоя;coverage определяет степень заполнения ячеек
(визуальное расширение влияния).ScreenGridLayer использует WebGL для выполнения двух ключевых этапов:
Каждая точка преобразуется в пиксельную позицию, после чего происходит атомарное накопление значений в буфере.
Преимущество подхода:
ScreenGridLayer часто сравнивается с другими агрегирующими слоями.
Одно из ключевых свойств ScreenGridLayer — адаптивность к zoom level.
При увеличении масштаба:
При уменьшении масштаба:
Это создаёт эффект динамического теплового поля.
ScreenGridLayer оптимизирован для больших массивов данных, однако производительность зависит от ряда факторов:
Меньший cellSizePixels увеличивает количество ячеек,
что:
Большой размер уменьшает детализацию, но ускоряет рендеринг.
Deck.gl использует механизм мемоизации атрибутов:
updateTriggers: {
getWeight: data => data.value
}
Неправильная настройка приводит к лишним пересчётам GPU-буферов.
ScreenGridLayer поддерживает picking, позволяя получать данные ячеек под курсором.
При включённом pickable: true доступна информация:
Типичный сценарий — построение tooltip:
onHover: info => {
const { x, y, object } = info;
}
ScreenGridLayer часто используется для:
Каждая ячейка представляет локальную статистическую область.
Несмотря на эффективность, ScreenGridLayer имеет ограничения:
Эти особенности делают слой менее подходящим для точных пространственных вычислений, но оптимальным для визуальной аналитики.
При каждом изменении:
происходит полное перерасчётное обновление сетки. Это обеспечивает актуальность визуализации, но требует эффективного управления состоянием слоя.
Весовые значения позволяют строить более сложные модели плотности.
Пример:
Нормализация выполняется через максимальное значение в сетке:
[ normalized = ]
normalized=
Интерполяция цветов происходит линейно между значениями диапазона
colorRange. Каждая ячейка получает цвет в зависимости от
нормализованного значения плотности.
Это позволяет строить визуальные градиенты плотности без дополнительных вычислений на CPU.
ScreenGridLayer используется в задачах, где важна:
Типичные источники данных: