Жесты в веб-картографии опираются на унифицированную модель взаимодействия указателя, где мышь, сенсорный экран и трекпад приводятся к единому потоку событий. В контексте HERE Technologies управление картой реализуется через слой поведения (behavior layer), который абстрагирует низкоуровневые pointer events и предоставляет готовые механизмы масштабирования, перемещения и вращения сцены.
В основе интерактивности HERE Maps API for JavaScript лежит связка объектов карты и обработчиков событий. Поведение карты не является встроенным состоянием объекта карты — оно подключается отдельно через модуль взаимодействия.
Ключевая архитектурная идея заключается в разделении:
Такое разделение позволяет независимо управлять мультитач-жестами, отключать их частично или полностью, а также переопределять стандартные сценарии взаимодействия.
Основной механизм обработки жестов реализован через модуль
H.mapevents. Он преобразует низкоуровневые DOM-события в
семантические действия карты.
Инициализация обычно строится вокруг двух сущностей:
H.mapevents.MapEvents — интерпретатор событий;H.mapevents.Behavior — набор стандартных жестов.const map = new H.Map(
document.getElementById('map'),
defaultLayers.vector.normal.map,
{
center: { lat: 52.52, lng: 13.405 },
zoom: 10,
pixelRatio: window.devicePixelRatio
}
);
const mapEvents = new H.mapevents.MapEvents(map);
const beh * avior = new H.mapevents.Behavior(mapEvents);
Behavior автоматически активирует стандартный набор
жестов:
Панорамирование реализуется через перемещение одного или нескольких указателей. В десктопном режиме это движение мыши с зажатой кнопкой, в мобильном — один палец.
Особенность системы заключается в наличии инерции. После завершения drag-операции карта продолжает движение, постепенно снижая скорость.
Инерция рассчитывается на основе:
При необходимости инерция может быть отключена:
behavior.disable(H.mapevents.Behavior.Feature.INERTIA);
Масштабирование реализуется тремя независимыми сценариями:
События wheel преобразуются в изменение уровня zoom с дискретной или плавной интерполяцией.
Особенность реализации — центр масштабирования совпадает с позицией курсора, а не с центром экрана.
Pinch-жест основан на вычислении расстояния между двумя pointer-объектами:
Фактически используется геометрическая модель:
touchstart;Двойное касание интерпретируется как быстрый zoom-in с фиксированным шагом. В отличие от wheel и pinch, этот жест дискретен и не имеет промежуточных состояний.
Ротация активируется мультитач-жестом с двумя пальцами, где угол между точками контакта изменяется во времени.
Математически используется вычисление угла между векторами:
Разница углов применяется к текущему bearing карты.
behavior.enable(H.mapevents.Behavior.Feature.ROTATE);
При отключенной ротации второй палец интерпретируется только как zoom, без изменения ориентации карты.
В некоторых режимах доступен наклон карты (tilt), создающий псевдотрёхмерную перспективу.
Жест обычно реализуется через комбинацию:
Диапазон наклона ограничен параметрами движка рендеринга WebGL.
Каждый тип взаимодействия в behavior представлен как независимая feature:
DRAGGINGPINCHINGSCROLLINGTAPDOUBLE_TAPINERTIAROTATEПример управления:
behavior.disable(H.mapevents.Behavior.Feature.PINCHING);
behavior.disable(H.mapevents.Behavior.Feature.ROTATE);
Такая модель позволяет формировать специализированные сценарии:
Все жесты строятся поверх Pointer Events API. Внутри системы происходит нормализация:
Далее события агрегируются в единый поток указателей, где каждому pointerId соответствует состояние:
Это позволяет корректно обрабатывать мультисенсорные сценарии без разделения логики по устройствам ввода.
Одновременные действия (например, pinch + rotate) разрешаются через приоритеты:
При конфликте behavior вычисляет наиболее вероятную интерпретацию на основе:
Параметры взаимодействия могут быть адаптированы через конфигурацию карты и beh * avior:
Пример изменения чувствительности:
map.getViewModel().setLookAtData({
zoom: 12,
tilt: 45,
heading: 180
});
Хотя данный метод не управляет жестами напрямую, он влияет на визуальный отклик, формируя ощущение инерции и динамики.
На мобильных устройствах жесты интерпретируются с учётом системных особенностей:
Часто применяется:
#map {
touch-action: none;
}
Это отключает системные жесты браузера и передаёт управление HERE behavior.
Поверх стандартного слоя возможно добавление собственных взаимодействий через подписку на события:
map.addEventListener('tap', (evt) => {
const coord = map.screenToGeo(
evt.currentPointer.viewportX,
evt.currentPointer.viewportY
);
});
Таким образом строятся:
Жесты напрямую влияют на частоту перерисовки карты. Ключевые оптимизации:
requestAnimationFrame;При высокой нагрузке behavior может временно снижать детализацию перерисовки, сохраняя плавность взаимодействия.
Жесты не являются отдельным модулем интерфейса — они влияют на камеру сцены. Любое действие пользователя преобразуется в изменения:
Таким образом, мультитач-жесты являются интерфейсом управления виртуальной камерой, а не самой картой, что обеспечивает единообразие поведения в различных режимах отображения.