Библиотека Mapbox GL JS предоставляет высокопроизводительный рендеринг векторных карт на WebGL и служит базой для построения интерактивных картографических приложений. Поверх неё построен набор расширений, среди которых ключевое место занимает Mapbox GL Draw — инструмент для рисования, редактирования и удаления геометрий непосредственно на карте.
Mapbox GL Draw функционирует как слой интерактивного редактирования поверх карты и оперирует данными в формате GeoJSON, обеспечивая синхронизацию между визуальным представлением и внутренним состоянием геометрий.
Mapbox GL Draw представляет собой модуль, который интегрируется в экземпляр карты Mapbox GL JS и добавляет пользовательские инструменты редактирования. Его внутренняя модель основана на следующих компонентах:
Все изменения геометрий отражаются в GeoJSON-хранилище, которое синхронизируется с картой в реальном времени.
Mapbox GL Draw подключается как расширение к карте Mapbox GL JS и требует создания экземпляра контроллера.
import mapboxgl from "mapbox-gl";
import MapboxDraw from "@mapbox/mapbox-gl-draw";
mapboxgl.accessToken = "TOKEN";
const map = new mapboxgl.Map({
container: "map",
style: "mapbox://styles/mapbox/streets-v12",
center: [37.6173, 55.7558],
zoom: 10
});
const draw = new MapboxDraw({
displayControlsDefault: false,
controls: {
polygon: true,
line_string: true,
point: true,
trash: true
}
});
map.addControl(draw);
После добавления контроллера активируется панель инструментов рисования, включающая создание точек, линий и полигонов.
Внутреннее состояние Mapbox GL Draw полностью основано на стандарте GeoJSON.
Основные типы объектов:
Point — точечные маркерыLineString — ломаные линииPolygon — полигоны с возможными отверстиямиПример структуры:
{
"type": "Feature",
"properties": {},
"geometry": {
"type": "Polygon",
"coordinates": [
[
[37.61, 55.75],
[37.62, 55.75],
[37.62, 55.76],
[37.61, 55.76],
[37.61, 55.75]
]
]
}
}
Все операции редактирования преобразуют эту структуру без необходимости ручного вмешательства.
Mapbox GL Draw использует систему режимов, определяющих поведение курсора и обработку событий.
draw_point — добавление точекdraw_line_string — построение линийdraw_polygon — построение полигоновsimple_select — выбор объектовdirect_select — редактирование вершинАрхитектура позволяет расширять поведение через кастомные режимы:
const customMode = {
onSetup() {
return {};
},
onClick(state, e) {
state.clicked = true;
}
};
Mapbox GL Draw предоставляет API для программного взаимодействия с геометриями.
const id = draw.add({
type: "Feature",
geometry: {
type: "Point",
coordinates: [37.61, 55.75]
},
properties: {}
});
const data = draw.getAll();
draw.setFeatureProperty(id, "name", "upd ated");
draw.delete(id);
draw.deleteAll();
Mapbox GL Draw генерирует события, синхронизированные с действиями пользователя и изменениями состояния.
Основные события:
draw.create — создание объектаdraw.update — изменение геометрииdraw.delete — удаление объектаdraw.selectionchange — изменение выделенияПример обработки событий:
map.on("draw.create", (e) => {
console.log("Создан объект:", e.features);
});
map.on("draw.update", (e) => {
console.log("Обновление:", e.features);
});
Событийная модель позволяет строить реактивные системы обработки геоданных.
Визуализация объектов управляется через стили Mapbox GL JS, так как Mapbox GL Draw добавляет собственные слои.
Основные слои:
Пример кастомизации:
const draw = new MapboxDraw({
styles: [
{
id: "gl-draw-polygon-fill",
type: "fill",
paint: {
"fill-color": "#ff0000",
"fill-opacity": 0.3
}
}
]
});
Стили позволяют полностью переопределить внешний вид геометрий.
Mapbox GL Draw поддерживает валидацию геометрий на уровне режимов:
Эти ограничения реализуются либо через режимы, либо через постобработку GeoJSON.
Mapbox GL Draw может использоваться совместно с серверными API и базами геоданных.
Типовой поток:
Пример загрузки:
fetch("/data.geojson")
.then(res => res.json())
.then(data => {
draw.se t(data);
});
Экспорт:
const updated = draw.getAll();
При работе с большим количеством объектов важны особенности оптимизации:
Mapbox GL JS обеспечивает WebGL-рендеринг, что снижает нагрузку при отображении сложных сцен, однако Mapbox GL Draw добавляет DOM- и event-слой, который требует аккуратного управления состоянием.
Mapbox GL Draw допускает расширение функциональности через:
Пример расширения контролов:
const draw = new MapboxDraw({
controls: {
polygon: true,
trash: true
},
defaultMode: "draw_polygon"
});
Внутреннее состояние Mapbox GL Draw основано на immutable-подходе:
Такая модель упрощает синхронизацию с внешними хранилищами и предотвращает конфликты при редактировании.
Mapbox GL Draw поддерживает базовые операции над геометриями:
Все операции транслируются в изменения GeoJSON без необходимости ручного пересчёта координат.
Mapbox GL Draw интегрируется в систему слоёв Mapbox GL JS, создавая
собственные источники данных (sources) и слои
(layers).
Основные принципы взаимодействия:
mapbox-gl-draw-coldhot sourceЭта архитектура позволяет совмещать ручное редактирование с динамическими слоями данных.
Все координаты хранятся в формате WGS84:
Mapbox GL Draw не выполняет сложных геодезических преобразований, что делает его зависимым от внешних библиотек при необходимости расчёта:
Интеграция с такими вычислениями обычно реализуется через обработчики событий.
Mapbox GL Draw формирует слой интерактивного редактирования поверх рендеринга WebGL, предоставляемого Mapbox GL JS. Его архитектурная функция заключается в превращении статической карты в среду редактирования геоданных, где визуализация и моделирование пространственных объектов объединены в одной системе.