Deck.gl предоставляет набор высокоуровневых слоёв для работы с большими геопространственными данными. MVTLayer является специализированным слоем для рендеринга векторных тайлов (Mapbox Vector Tiles), где данные уже заранее разрезаны на тайлы и передаются клиенту по мере необходимости.
Основная задача слоя — декодирование, кэширование и отрисовка геометрии из бинарного формата MVT с поддержкой декларативной стилизации и интерактивности.
Векторные тайлы представляют собой бинарно закодированные геометрии (точки, линии, полигоны), структурированные по схеме:
Ключевая особенность — данные не являются географическими координатами напрямую, они нормализованы в пространстве тайла и преобразуются в координаты Web Mercator при рендеринге.
MVTLayer выполняет несколько этапов обработки:
Каждый тайл обрабатывается независимо, что позволяет масштабировать визуализацию до миллионов объектов.
Типичная конфигурация MVTLayer включает URL-шаблон и описание слоёв данных:
import {MVTLayer} from '@deck.gl/geo-layers';
const layer = new MVTLayer({
id: 'countries',
data: 'https://example.com/tiles/{z}/{x}/{y}.pbf',
minZoom: 0,
maxZoom: 14,
getLineColor: [255, 255, 255],
getFillColor: [200, 100, 50],
lineWidthMinPixels: 1,
pickable: true
});
Параметр data использует шаблон:
{z} — уровень масштаба{x} — координата тайла по X{y} — координата тайла по YПример:
https://tiles.server.com/parcels/12/654/1582.pbf
MVTLayer автоматически:
Векторный тайл может содержать несколько логических слоёв, например:
waterroadsbuildingslanduseФильтрация выполняется через renderSubLayers:
renderSubLayers: props => {
return new GeoJsonLayer({
...props,
filled: true
});
}
Каждый тайл декодируется в промежуточную структуру, после чего MVTLayer создаёт подслои для каждого типа данных.
MVTLayer поддерживает data-driven styling через функции:
getFillColorgetLineColorgetLineWidthgetRadiusФункции получают объект feature:
getFillColor: f => {
const type = f.properties.type;
if (type === 'residential') return [200, 200, 255];
if (type === 'industrial') return [255, 200, 200];
return [220, 220, 220];
}
Особенность — вычисления выполняются на GPU-подготовленном массиве, что минимизирует overhead JavaScript.
Геометрия в MVT хранится в tile-space координатах (обычно 0–4096). MVTLayer выполняет трансформацию:
Процесс включает:
MVTLayer активно использует Web Workers:
Оптимизации:
Кэширование реализовано на двух уровнях:
Алгоритм:
{z}/{x}/{y}MVTLayer поддерживает picking через:
onHoveronClickgetPickingInfoonClick: info => {
if (info.object) {
console.log(info.object.properties);
}
}
Pick происходит на уровне feature внутри тайла, что позволяет точно определять объект даже в плотной геометрии (например, здания в центре города).
Доступна фильтрация на уровне данных:
filter: true,
getFilterValue: f => f.properties.population,
filterRange: [1000, 100000]
Также возможно исключение объектов до рендера, что уменьшает нагрузку на GPU.
MVTLayer учитывает ограничения:
minZoom — минимальный уровень детализацииmaxZoom — максимальный уровень детализацииПри выходе за пределы:
Это позволяет контролировать детализацию данных на разных уровнях карты.
MVTLayer часто комбинируется с:
TileLayer (управление тайловой логикой)GeoJsonLayer (рендеринг геометрии)SolidPolygonLayer (экструзия зданий)TextLayer (подписи)Композиция слоёв происходит через стек рендеринга, где MVTLayer выступает источником данных.
Каждый feature содержит:
geometry (Point / LineString / Polygon)properties (набор атрибутов)layerName (тип слоя внутри тайла)Доступ к данным:
getLineColor: f => f.properties.road_class === 'primary'
? [255, 0, 0]
: [100, 100, 100]
MVTLayer следует парадигме декларативной графики:
Это позволяет интегрировать слой в реактивные системы (React, Redux, state-driven UI).