Инструмент редактирования геометрии Mapbox GL Draw построен вокруг событийной модели, через которую происходит взаимодействие с создаваемыми, изменяемыми и удаляемыми географическими объектами. Каждый пользовательский жест — добавление точки, изменение полигона, завершение редактирования — транслируется в набор событий, позволяющих синхронизировать состояние карты с внешним приложением, хранилищем данных или бизнес-логикой.
События Draw интегрируются в стандартную систему событий Mapbox GL JS
и регистрируются через метод map.on(...), где
map — экземпляр карты. Все события имеют предсказуемую
структуру и передают актуальный набор GeoJSON-объектов, находящихся под
управлением Draw.
Mapbox GL Draw использует внутренний слой управления состоянием, где каждая геометрия представлена в формате GeoJSON Feature. При каждом изменении состояния происходит:
Каждое событие содержит:
Структура событий обеспечивает предсказуемую реакцию на изменения без необходимости ручного опроса состояния.
Подключение событий осуществляется через экземпляр карты:
map.on('draw.create', function (e) {
console.log('Создан объект:', e.features);
});
Общая форма:
map.on('<event-name>', callback);
Удаление обработчиков:
map.off('<event-name>', callback);
Событие draw.create возникает при завершении создания
нового объекта. Это может быть точка, линия или полигон.
Срабатывание происходит:
Структура события:
{
features: [
{
id: 'feature-id',
type: 'Feature',
geometry: { type: 'Polygon', coordinates: [...] },
properties: {}
}
]
}
Пример обработки:
map.on('draw.create', (e) => {
const createdFeatures = e.features;
createdFeatures.forEach((feature) => {
if (feature.geometry.type === 'Polygon') {
console.log('Новый полигон создан');
}
});
});
Событие используется для:
Событие draw.update вызывается при изменении
существующего объекта. Изменения включают:
Событие содержит массив обновлённых features:
map.on('draw.update', (e) => {
e.features.forEach((feature) => {
console.log('Обновлён объект:', feature.id);
});
});
Типичные сценарии использования:
Особенность заключается в высокой частоте вызова при перетаскивании вершин, что требует оптимизации обработки (debounce/throttle).
Событие draw.delete срабатывает при удалении объектов из
слоя редактирования.
Удаление может происходить:
Структура события:
map.on('draw.delete', (e) => {
const deletedIds = e.features.map(f => f.id);
console.log('Удалены объекты:', deletedIds);
});
Используется для:
Событие draw.selectionchange фиксирует изменение
текущего выделения объектов.
Срабатывает при:
Пример:
map.on('draw.selectionchange', (e) => {
const selected = e.features;
console.log('Текущее выделение:', selected.length);
});
Полезно для:
Событие draw.modechange фиксирует переход между режимами
Draw.
Основные режимы:
simple_selectdirect_selectdraw_pointdraw_polygondraw_line_stringПример обработки:
map.on('draw.modechange', (e) => {
console.log('Новый режим:', e.mode);
});
Используется для:
Событие draw.render вызывается при каждом обновлении
отрисовки Draw слоя.
Характеристики:
Пример:
map.on('draw.render', () => {
console.log('Перерисовка Draw слоя');
});
Применение:
Использование требует осторожности из-за потенциальной нагрузки.
События draw.combine и draw.uncombine
связаны с объединением и разбиением объектов.
Возникает при объединении нескольких объектов в коллекцию.
map.on('draw.combine', (e) => {
console.log('Объединены объекты:', e.createdFeature);
});
Применение:
Срабатывает при разделении комбинированного объекта.
map.on('draw.uncombine', (e) => {
console.log('Разделён объект:', e.features);
});
Используется для:
Во всех событиях ключевым элементом является массив
features. Каждый элемент соответствует спецификации GeoJSON
Feature:
{
type: 'Feature',
id: 'unique-id',
geometry: {
type: 'Point' | 'LineString' | 'Polygon',
coordinates: [...]
},
properties: {
// пользовательские данные
}
}
Стабильность структуры позволяет использовать единый обработчик для различных типов событий.
События Draw часто используются совместно с API управления:
draw.add(feature);
draw.delete(featureId);
draw.changeMode('simple_select');
draw.setFeatureProperty(id, 'name', 'Объект');
При этом каждое изменение через API также вызывает соответствующее событие, что позволяет строить реактивную архитектуру.
Некоторые события, особенно draw.update и
draw.render, могут генерироваться десятки раз в
секунду.
Рекомендуемые практики:
Особенно критично это при работе с большим количеством вершин.
Часто встречаются следующие проблемы:
draw.renderfeatures при
множественных измененияхКорректная архитектура требует строгого контроля жизненного цикла событий.
События Draw выступают основным механизмом синхронизации между картой и внешним состоянием:
Типичный поток:
draw.updateТакой подход обеспечивает детерминированность состояния и согласованность данных.