Mapbox GL JS в связке с расширением Mapbox GL Draw предоставляет
механизм интерактивного рисования и редактирования геометрий на карте.
События draw.create, draw.update,
draw.delete являются ключевыми точками интеграции, через
которые приложение получает уведомления о любых изменениях
пользовательских объектов.
Mapbox GL Draw работает поверх слоя Mapbox GL JS и управляет GeoJSON-объектами. Каждое действие пользователя — создание, редактирование или удаление — транслируется в событие, которое отправляется на объект карты.
Основные сущности:
idКаждое изменение состояния приводит к генерации событий:
draw.create — добавление новых объектовdraw.update — изменение существующих объектовdraw.delete — удаление объектовСрабатывает в момент, когда пользователь завершает создание новой геометрии. Это может быть точка, линия или полигон.
Объект события содержит массив созданных features:
map.on('draw.create', function (e) {
console.log('Созданные объекты:', e.features);
});
Структура e.features:
[
{
"id": "abc123",
"type": "Feature",
"geometry": {
"type": "Polygon",
"coordinates": [...]
},
"properties": {}
}
]
idТипичный сценарий — сохранение новых объектов в базу данных:
map.on('draw.create', function (e) {
const features = e.features;
fetch('/api/features', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(features)
});
});
Срабатывает при изменении уже существующих объектов. Изменения могут включать:
map.on('draw.update', function (e) {
console.log('Обновлённые объекты:', e.features);
});
{
"features": [
{
"id": "abc123",
"type": "Feature",
"geometry": {
"type": "LineString",
"coordinates": [...]
},
"properties": {}
}
]
}
idПри частых изменениях важно учитывать нагрузку. Например, при редактировании полигона событие может вызываться десятки раз в секунду.
Оптимизация через debounce:
let timeout;
map.on('draw.update', function (e) {
clearTimeout(timeout);
timeout = setTimeout(() => {
saveToServer(e.features);
}, 300);
});
Срабатывает при удалении одного или нескольких объектов из набора Draw.
map.on('draw.delete', function (e) {
console.log('Удалённые объекты:', e.features);
});
map.on('draw.delete', function (e) {
const deletedIds = e.features.map(f => f.id);
fetch('/api/features/delete', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ ids: deletedIds })
});
});
Все три события образуют единый цикл управления геометрией:
Этот цикл повторяется для каждого feature независимо.
Mapbox GL Draw хранит внутреннее состояние, которое можно синхронизировать с внешними источниками данных.
Пример получения всех объектов:
const allFeatures = draw.getAll();
После чего события draw.update и
draw.delete используются для поддержания актуальности
внешнего хранилища.
Все три события поддерживают пакетную обработку. Пользователь может:
Пример множественного обновления:
map.on('draw.update', function (e) {
e.features.forEach(feature => {
console.log(feature.id, feature.geometry.type);
});
});
Разные типы геометрий по-разному генерируют события:
draw.create — мгновенное созданиеdraw.update — перемещение точкиdraw.create — завершение линииdraw.update — изменение вершинdraw.create — завершение замкнутой областиdraw.update — редактирование контуров и дырСобытия часто используются для построения систем коллаборативного редактирования карт.
Пример архитектуры:
draw.*map.on('draw.update', function (e) {
socket.emit('feature:update', e.features);
});
map.on('draw.delete', function (e) {
socket.emit('feature:delete', e.features);
});
Каждый feature имеет уникальный id, который используется
для:
Пример:
map.on('draw.update', function (e) {
const feature = e.features[0];
database.update(feature.id, feature);
});
При работе с событиями важно учитывать следующие особенности:
draw.update может вызываться даже при
минимальном изменении координатdraw.delete не всегда означает физическое удаление из
всех слоёв, если есть внешние источники данныхdraw.create может срабатывать после завершения
редактирования сложной фигуры, а не только при первом кликеСобытия позволяют строить интерфейсы управления геометриями:
Пример обновления UI:
map.on('draw.update', function (e) {
updateSidebar(e.features);
});
map.on('draw.create', function (e) {
addToList(e.features);
});
map.on('draw.delete', function (e) {
removeFromList(e.features);
});
Mapbox GL JS отвечает за рендеринг, Mapbox GL Draw — за редактирование. События выступают мостом между визуальной частью и бизнес-логикой приложения.
Так формируется замкнутый цикл управления геометрией на карте, где
draw.create, draw.update,
draw.delete являются основными точками контроля
состояния.