Viewport в HERE Technologies задаётся как совокупность параметров,
определяющих область отображения карты, масштаб, центр и ограничения
перемещения. В JavaScript API HERE Maps API управление начальным
состоянием карты происходит через конфигурацию Map и
вспомогательные объекты слоя, поведения и камеры. Грамотная настройка
viewport критична для производительности, UX и корректного отображения
географического контекста.
Viewport в API представляет собой не просто координату центра и zoom, а связку параметров камеры:
Внутри движка карта рассматривается как сцена, а viewport — как состояние виртуальной камеры, определяющей, какую часть мира пользователь видит в данный момент.
Перед настройкой viewport необходимо создать платформу и слой отображения:
const platform = new H.service.Platform({
apikey: 'YOUR_API_KEY'
});
const defaultLayers = platform.createDefaultLayers();
На этом этапе формируется доступ к базовым тайлам, стилям и сервисам
рендеринга. Именно defaultLayers.vector.normal.map чаще
всего используется как основа для viewport-конфигурации.
Создание экземпляра карты включает задание центра и масштаба:
const map = new H.Map(
document.getElementById('mapContainer'),
defaultLayers.vector.normal.map,
{
center: { lat: 52.5200, lng: 13.4050 },
zoom: 10,
pixelRatio: window.devicePixelRatio || 1
}
);
Параметр center задаёт географическую точку, вокруг
которой строится viewport. Он принимает объект:
lat — широтаlng — долготаВажно учитывать, что центр определяет не только начальное положение, но и поведение всех последующих операций панорамирования.
Zoom определяет уровень детализации:
Векторные слои HERE Technologies обеспечивают плавное масштабирование без потери качества благодаря тайловой структуре.
Viewport тесно связан с поведением пользователя. Для корректной работы подключается система взаимодействий:
const beh * avior = new H.mapevents.Behavior(
new H.mapevents.MapEvents(map)
);
Это добавляет поддержку:
Viewport становится динамическим и обновляется на основе пользовательских событий.
В современных версиях API viewport управляется через объект камеры:
map.getViewModel().setLookAtData({
position: { lat: 48.8566, lng: 2.3522 },
zoom: 12,
tilt: 45,
heading: 180
});
Аналог center, но используется в расширенной модели
камеры. Позволяет работать в 3D-пространстве.
Наклон камеры создаёт псевдо-3D эффект. Значения:
Поворот карты по часовой стрелке. Используется для навигационных сценариев (например, следование маршруту).
Для контроля области отображения применяется ограничение перемещения:
const bbox = new H.geo.Rect(55.0, 12.0, 47.0, 25.0);
map.getViewModel().addEventListener('sync', function () {
const viewBounds = map.getViewModel().getLookAtData().bounds;
});
Также можно задать жесткое ограничение через
setOptions:
map.getViewModel().setLookAtData({
bounds: new H.geo.Rect(55.0, 12.0, 47.0, 25.0)
});
Bounding box управляет допустимой зоной перемещения камеры, предотвращая выход viewport за заданные пределы.
Современные дисплеи требуют корректной настройки плотности пикселей:
pixelRatio: window.devicePixelRatio || 1
Это влияет на:
Игнорирование pixelRatio приводит к размытию карты на
Retina-экранах.
Viewport должен реагировать на изменения layout:
window.addEventListener('resize', () => {
map.getViewPort().resize();
});
ViewPort отвечает за пересчёт координат и
перераспределение тайлов при изменении размеров контейнера. Без этого
карта может смещаться или обрезаться.
При размещении UI-элементов поверх карты важно учитывать padding:
map.getViewModel().setLookAtData({
padding: { top: 50, bottom: 50, left: 200, right: 20 }
});
Padding смещает центр viewport так, чтобы важные элементы карты не перекрывались интерфейсом (например, сайдбаром или панелью маршрутов).
Viewport может изменяться программно в ответ на события:
map.setCenter({ lat: 51.5074, lng: -0.1278 });
map.setZoom(14);
или через единый объект состояния:
map.getViewModel().setLookAtData({
position: { lat: 51.5074, lng: -0.1278 },
zoom: 14,
tilt: 30
});
Использование LookAtData предпочтительнее при сложных
сценариях, так как оно синхронизирует все параметры камеры
одновременно.
Viewport зависит от типа слоя:
const layer = defaultLayers.vector.normal.map;
Выбор слоя напрямую влияет на доступные параметры viewport: например, tilt работает только в векторном режиме.
Viewport обновляется через event loop карты:
Для отслеживания изменений используется:
map.addEventListener('mapviewchange', (event) => {
const state = map.getViewModel().getLookAtData();
});
Это позволяет синхронизировать внешний интерфейс с текущим состоянием viewport.
Начальное состояние камеры должно учитывать:
Неправильный выбор initial zoom приводит к:
Viewport часто взаимодействует с интерфейсом:
Для корректного отображения используется комбинированная настройка
padding + center shift, что позволяет сохранять читаемость
карты при наложении UI.
map.getViewModel().setLookAtData({
position: { lat: 52.52, lng: 13.405 },
zoom: 11,
padding: { left: 300 }
});
Такой подход предотвращает перекрытие ключевых объектов интерфейсом.
В типичной архитектуре viewport представляет собой объединение:
Эта модель позволяет строить масштабируемые геоинформационные интерфейсы, где карта становится не просто визуализацией, а управляемой сценой с предсказуемым состоянием камеры.