deck.gl предоставляет абстракции для высокопроизводительного рендеринга геоданных поверх WebGL-контекста, а компонент представления отвечает за организацию камеры, проекции и взаимодействия с пользователем. Одним из базовых элементов этой системы является MapView, который определяет геометрическое пространство отображения и управляет тем, как сцена со слоями интерпретируется в координатах карты.
MapView представляет собой описание “вида” (view), включающее систему координат, параметры камеры и поведенческие настройки взаимодействия. Он не занимается отрисовкой слоёв напрямую, а формирует контекст, в котором слои рендерятся. В типичной архитектуре deck.gl MapView используется совместно с контейнером Deck, который агрегирует несколько представлений и слоёв, распределяя их по разным областям экрана или разным камерам.
MapView опирается на концепцию географического пространства, где данные интерпретируются в координатах долготы и широты. Основная задача — преобразование этих координат в экранное пространство с учётом уровня масштабирования, центра карты и проекции.
Ключевые параметры:
Эти параметры формируют объект viewState, который
является единственным источником истины для позиции камеры в
MapView.
MapView задаётся как объект конфигурации и передаётся в контейнер рендера.
import {Deck} from '@deck.gl/core';
import {MapView} from '@deck.gl/core';
const view = new MapView({
id: 'map-view',
controller: true
});
const deckgl = new Deck({
views: [view],
initialViewState: {
longitude: 37.6173,
latitude: 55.7558,
zoom: 10,
pitch: 0,
bearing: 0
},
layers: []
});
В этом контексте MapView задаёт поведение сцены, а Deck управляет жизненным циклом рендеринга.
Состояние камеры отделено от представления и хранится в
viewState. MapView интерпретирует это состояние и применяет
его к матрицам преобразования.
Основные особенности:
Пример изменения состояния:
deckgl.setProps({
viewState: {
longitude: 30.31,
latitude: 59.93,
zoom: 12,
pitch: 45,
bearing: 20
}
});
MapView автоматически пересчитывает матрицы проекции и трансформации при обновлении состояния.
MapView поддерживает подключение интерактивных контроллеров, которые обрабатывают пользовательский ввод и изменяют viewState.
const view = new MapView({
id: 'interactive-map',
controller: {
dragPan: true,
scrollZoom: true,
doubleClickZoom: true,
touchRotate: true
}
});
Контроллер в MapView реализует стандартные взаимодействия:
При этом MapView не интерпретирует события напрямую, а преобразует их в изменения состояния камеры.
MapView использует Web Mercator как базовую проекцию по умолчанию. Это обеспечивает совместимость с большинством тайловых карт и GIS-систем.
Характерные свойства:
Преобразование координат происходит в несколько этапов:
MapView не содержит логики слоёв, но определяет контекст их отрисовки. Слои, такие как ScatterplotLayer, ArcLayer или PolygonLayer, получают трансформированные координаты через контекст view.
Пример:
import {ScatterplotLayer} from '@deck.gl/layers';
const layer = new ScatterplotLayer({
id: 'points',
data: [{position: [37.62, 55.75]}],
getPosition: d => d.position,
getRadius: 1000,
getFillColor: [255, 0, 0]
});
MapView обеспечивает правильную интерпретацию этих координат в рамках текущего viewState.
MapView может использоваться совместно с другими представлениями, формируя многослойные интерфейсы.
Типовые сценарии:
Пример конфигурации:
import {Deck, MapView, FirstPersonView} from '@deck.gl/core';
const mainView = new MapView({
id: 'main'
});
const secondaryView = new MapView({
id: 'secondary',
x: 0,
y: 0,
width: '30%',
height: '30%'
});
new Deck({
views: [mainView, secondaryView],
viewState: {
main: {
longitude: 10,
latitude: 50,
zoom: 5
},
secondary: {
longitude: 20,
latitude: 55,
zoom: 3
}
},
layers: []
});
Каждый MapView получает собственное состояние камеры и собственную область рендеринга.
Внутри MapView используется цепочка матриц:
Эти матрицы применяются к атрибутам вершин в WebGL шейдерах. MapView формирует параметры, которые передаются в слой, где происходит финальная трансформация.
Особое значение имеет инверсия матрицы для вычисления географических координат из экранных:
Это позволяет реализовать интерактивные операции: выбор объектов, hit-testing, выделение областей.
MapView проектируется с учётом больших объёмов данных. Основные оптимизации:
Критическим фактором является стабильность viewState: частые мелкие обновления камеры могут приводить к перерасчёту большого количества данных.
MapView предполагает плоскую карту в Web Mercator пространстве, что накладывает ограничения:
При этом модель остаётся универсальной для большинства картографических приложений, ориентированных на интерактивную визуализацию данных.
MapView может работать поверх тайловых слоёв из внешних источников, включая Mapbox или собственные tile servers. В таких случаях синхронизация viewState становится критическим элементом архитектуры.
Типичная схема:
Это обеспечивает согласованное отображение географических данных и визуальных элементов сцены.