Google Maps JavaScript API предоставляет компонент Drawing Manager как надстройку над базовой картой для интерактивного создания геометрических объектов. Его событийная модель строится вокруг жизненного цикла создаваемых оверлеев и изменений режима рисования, обеспечивая контроль над пользовательскими действиями и редактированием геометрии в реальном времени.
События Drawing Manager делятся на две основные категории:
Менеджер рисования не управляет геометрией напрямую после её создания
— он лишь инициирует процесс и возвращает ссылку на созданный объект.
Дальнейшая динамика полностью делегируется API объектов
google.maps.Polygon, google.maps.Polyline,
google.maps.Circle, google.maps.Rectangle,
google.maps.Marker.
overlaycompleteКлючевое событие жизненного цикла Drawing Manager.
Срабатывает в момент завершения рисования любого оверлея пользователем.
drawingManager.addListener('overlaycomplete', function(event) {
const overlay = event.overlay;
const type = event.type;
});
event.overlay — созданный объект (Marker, Polygon,
Polyline, Circle, Rectangle)event.type — строка типа объекта:
"marker" | "polygon" | "polyline" | "circle" | "rectangle"После генерации:
drawingmode_changedОтслеживает переключение режима рисования.
drawingManager.addListener('drawingmode_changed', function() {
const mode = drawingManager.getDrawingMode();
});
null — режим рисования выключен"marker""polygon""polyline""circle""rectangle"Изменение режима не влияет на уже созданные объекты. Оно управляет только тем, какой инструмент активен для следующего взаимодействия с картой.
Drawing Manager часто используется как конечный автомат, где события служат триггерами переходов:
overlaycomplete → фиксация результатаdrawingManager.setDrawingMode(null);
Такой подход позволяет синхронизировать UI (панели инструментов) с состоянием карты.
После получения overlay из overlaycomplete,
управление переходит к событиям конкретных геометрических объектов.
При включённой опции editable: true доступны события
массива вершин.
polygon.getPath().addListener('set_at', function(index) {});
polygon.getPath().addListener('insert_at', function(index) {});
polygon.getPath().addListener('remove_at', function(index) {});
set_at — изменение существующей вершиныinsert_at — добавление вершиныremove_at — удаление вершиныКаждое событие изменяет структуру MVCArray, которая
хранит координаты полигона.
Polyline использует ту же модель событий, что и Polygon:
polyline.getPath().addListener('set_at', handler);
polyline.getPath().addListener('insert_at', handler);
polyline.getPath().addListener('remove_at', handler);
Отличие заключается в семантике:
Circle имеет две ключевые изменяемые сущности:
center_changed)radius_changed)circle.addListener('center_changed', function() {});
circle.addListener('radius_changed', function() {});
Оба события срабатывают при интерактивном редактировании или программном изменении параметров.
Rectangle генерирует события при изменении bounds:
rectangle.addListener('bounds_changed', function() {});
Изменение происходит при перетаскивании углов или программной модификации границ.
Marker поддерживает стандартные события карты:
marker.addListener('click', function() {});
marker.addListener('dragend', function() {});
При использовании Drawing Manager маркер обычно создаётся без drag по умолчанию, но может быть модифицирован:
marker.setDraggable(true);
Для всех редактируемых объектов применим общий принцип:
editable: true активирует MVC-событияТипичная модель обработки событий Drawing Manager:
overlaycomplete
назначение событий оверлея
синхронизация с внешним состоянием
Каждое событие создаёт подписку, которую необходимо учитывать:
const listener = polygon.addListener('click', handler);
google.maps.event.removeListener(listener);
Особенно критично при динамическом создании большого числа объектов через Drawing Manager.
Drawing Manager не изолирован от карты:
click, mousedown,
mousemove) подавляются в активном режиме рисованияПри одновременной активности нескольких слоёв:
overlaycomplete как центра событийной
системыdrawingManager.addListener('overlaycomplete', function(event) {
const overlay = event.overlay;
if (event.type === 'polygon') {
overlay.getPath().addListener('set_at', sync);
overlay.getPath().addListener('insert_at', sync);
}
overlay.addListener('click', selectOverlay);
});
Такая структура превращает Drawing Manager в фабрику интерактивных объектов с динамической привязкой поведения.
При повторном использовании Drawing Manager:
overlaycompleteЭто позволяет строить системы аннотаций, где каждый элемент карты живёт независимо.
Любое изменение геометрии может транслироваться в сериализуемую структуру:
Обновление обычно инициируется через MVCArray-события или
*_changed.
События генерируются не только пользователем:
setPath у полигона вызывает цепочку MVC событийsetCenter у круга инициирует
center_changedsetBounds у прямоугольника вызывает
bounds_changedЭто создаёт единый механизм отслеживания изменений независимо от источника.