Режим привязки (snap) в экосистеме Mapbox GL JS используется для повышения точности редактирования геометрии на карте за счёт автоматического «прилипания» создаваемых вершин к существующим объектам. В контексте интерактивного редактирования он чаще всего реализуется через Mapbox GL Draw, расширяющий базовые возможности редактирования слоёв.
Основная задача режима snap заключается в снижении погрешностей при ручном построении геометрии:
В системах, где карта используется как редактор (GIS-инструменты, CAD-подобные веб-приложения), отсутствие snap приводит к накоплению ошибок: пересекающиеся границы, разрывы контуров, неконсистентные полигоны.
Snap-алгоритм в Mapbox GL JS обычно строится вокруг поиска ближайших геометрических примитивов в радиусе курсора.
При добавлении новой точки выполняются следующие шаги:
Ключевой параметр — радиус snap-зоны, который задаётся в пикселях экрана и определяет чувствительность привязки.
В рамках Mapbox GL Draw и аналогичных реализаций выделяются два основных типа snap-логики:
Vertex snapping
Edge snapping
Обе стратегии часто комбинируются, при этом приоритет может задаваться конфигурацией.
Внутренне Mapbox GL JS работает с GeoJSON-структурами. Для snap-режима это означает обработку следующих типов данных:
PointLineStringPolygonMultiPolygonКаждый объект разбивается на набор координат, которые индексируются для быстрого поиска ближайших элементов.
Для ускорения поиска используется пространственная индексация (обычно R-tree или его аналог), позволяющая сократить сложность поиска с линейной до логарифмической.
Базовый алгоритм можно описать следующим образом:
Для сегмента AB и точки P вычисляется параметр:
t = ((P - A) · (B - A)) / |B - A|²
Если t находится в диапазоне [0, 1], вычисляется ближайшая точка на отрезке.
В типичной интеграции через Mapbox GL Draw поведение snap настраивается через параметры режима редактирования:
Пример логики конфигурации:
Режим snap тесно связан с событиями карты:
mousemove — обновление позиции курсораmousedown — фиксация точки с учётом привязкиtouchmove — аналог для сенсорных устройствdraw.update — обновление геометрии после изменения
вершиныПри каждом движении курсора пересчитывается потенциальная snap-точка, что требует оптимизации вычислений для сохранения плавности интерфейса.
При большом количестве геометрии snap-режим становится вычислительно затратным. Основные методы оптимизации:
Пространственная индексация
Кэширование viewport
Декларативное ограничение слоёв
Дебаунсинг событий мыши
Поскольку Mapbox GL JS использует Web Mercator проекцию, возникают особенности:
Поэтому snap-алгоритмы обычно выполняются в экранном пространстве, а не в географических координатах.
Snap-логика может быть расширена через пользовательские обработчики:
В продвинутых сценариях snap используется не только для геометрии, но и для бизнес-логики: привязка к объектам инфраструктуры, маршрутам, зонам обслуживания.
В Mapbox GL Draw режим snap обычно комбинируется с другими режимами:
Переход между режимами требует сохранения состояния snap-контекста, чтобы не терять текущую вычисленную точку привязки.
При одновременном наличии нескольких подходящих snap-целей используется система приоритетов:
Если расстояния совпадают, применяется стабильный детерминированный выбор на основе порядка слоёв или индексов объектов.
Поведение snap часто зависит от zoom-level:
Это позволяет балансировать между точностью и удобством редактирования в зависимости от уровня детализации карты.