OpenLayers изначально проектировалась как библиотека, ориентированная на унификацию взаимодействия с картой через абстракцию над различными устройствами ввода. В современной архитектуре взаимодействие с сенсорными устройствами не выделяется в отдельный «touch-only» слой, а интегрировано в единый механизм обработки указателей через Pointer Events, что обеспечивает совместимость с мышью, пером и сенсорными экранами.
В основе обработки касаний в OpenLayers лежит переход от классических
DOM-событий touchstart / touchmove / touchend к
универсальной модели
pointerdown / pointermove / pointerup.
Ключевая идея заключается в следующем:
pointerTypeКарта в OpenLayers генерирует события через систему
MapBrowserEvent. Это абстракция над нативными
DOM-событиями.
Каждое взаимодействие пользователя с картой проходит цепочку:
pointerdown,
pointermove)pixel и
coordinateMapBrowserEventinteraction)Ключевые поля:
type — тип событияcoordinate — географические координатыpixel — пиксельные координаты на viewportoriginalEvent — исходное DOM событиеmap — ссылка на объект картыOpenLayers не использует отдельный класс touch-интеракций. Вместо
этого используется система Interaction, где жесты
реализуются через анализ pointer-потока.
Каждый жест определяется количеством активных pointer-ов:
2 pointers → игнорирование или кастомная логика
При одном активном касании происходит обработка смещения карты.
Логика основана на разнице координат между событиями
pointerdown и pointermove.
Внутри используется преобразование:
view resolutionPinch-zoom реализуется через анализ расстояния между двумя pointer-точками.
Формально:
d0 — начальное расстояниеd1 — текущее расстояниеd1 / d0Далее этот коэффициент применяется к View:
resolutionПри двух пальцах OpenLayers может также вычислять угол между ними.
Используется формула:
angle = atan2(y2 - y1, x2 - x1)Изменение угла применяется к view.setRotation().
Для корректной обработки touch OpenLayers использует
setPointerCapture.
Это обеспечивает:
Без pointer capture жесты становились бы фрагментированными при быстром движении пальца.
После завершения касания может активироваться инерционное перемещение карты.
pointerup создаётся анимационный циклМодель поведения:
Touch-поведение в OpenLayers управляется через набор стандартных interaction-классов:
DragPanPinchZoomPinchRotateMouseWheelZoom (частично перекрывается с touchpad
жестами)Каждый interaction подписывается на pointer-события карты и фильтрует их по условиям:
OpenLayers использует систему блокировок и приоритетов:
Например:
Каждый pointer имеет уникальный pointerId.
Система хранит:
Это позволяет:
Каждое touch-событие проходит трансформацию:
OpenLayers использует:
map.getCoordinateFromPixel()map.getPixelFromCoordinate()При touch эти преобразования происходят на каждом
pointermove, что критично для плавности взаимодействия.
Несмотря на схожесть жестов, OpenLayers различает:
pointerType = "touch" — сенсорный экранpointerType = "mouse" — мышьpointerType = "pen" — стилусTouchpad на ноутбуках часто эмулирует pointer события, но поведение может отличаться:
Для стабильной работы на мобильных устройствах важны следующие аспекты:
pointermoverequestAnimationFrame для отрисовкиview stateОсобенно критично:
Мобильные браузеры добавляют собственные слои обработки жестов:
OpenLayers подавляет часть стандартного поведения браузера через:
preventDefault() в критических сценарияхtouch-action: none на контейнер картыOpenLayers позволяет создавать собственные interaction, работающие с touch-потоком.
Базовый шаблон:
handleDownEventhandleDragEventhandleUpEventТакие interactions могут реализовывать:
В системе interactions используется механизм
stopEvent:
Все touch-интеракции в конечном итоге изменяют состояние
View:
View выступает как единая точка истины, а touch-жесты являются лишь способом изменения его параметров.