Редактирование геометрических объектов в Google Maps JavaScript API строится вокруг принципа интерактивной модификации векторных слоёв карты: полилиний, полигонов, окружностей и прямоугольников. Каждый тип фигуры представляет собой объект с внутренней моделью данных, которая может быть изменена пользователем либо программно через API.
Основой редактируемых фигур выступают свойства:
editable — включает режим изменения геометрииdraggable — позволяет перемещать объект целикомpaths / path — структура координатПри включении редактирования API переводит объект в состояние, при котором вершины (vertices) становятся перетаскиваемыми маркерами, а изменения немедленно отражаются в модели данных.
Для Polyline и Polygon редактирование
осуществляется через массив координат типа MVCArray,
который предоставляет реактивный интерфейс для работы с вершинами.
const polygon = new google.maps.Polygon({
paths: [
{ lat: 55.75, lng: 37.61 },
{ lat: 55.76, lng: 37.62 },
{ lat: 55.74, lng: 37.63 }
],
editable: true,
draggable: true,
map: map
});
В режиме редактирования каждая вершина становится интерактивной.
Добавление, удаление и перемещение точек изменяет внутренний массив
paths.
Ключевым механизмом является google.maps.MVCArray,
который используется для хранения координат:
insertAt(index, element) — вставка точкиsetAt(index, element) — изменение точкиremoveAt(index) — удаление точкиgetArray() — получение копии массиваИзменения в MVCArray автоматически отражаются на карте
без необходимости повторного создания объекта.
const path = polygon.getPath();
path.insertAt(1, new google.maps.LatLng(55.755, 37.615));
path.setAt(0, new google.maps.LatLng(55.750, 37.610));
path.removeAt(2);
Редактируемые объекты генерируют события, позволяющие отслеживать изменения геометрии в реальном времени.
set_at — изменение существующей вершиныinsert_at — добавление вершиныremove_at — удаление вершиныgoogle.maps.event.addListener(polygon.getPath(), 'set_at', () => {
console.log('Изменена вершина');
});
google.maps.event.addListener(polygon.getPath(), 'insert_at', () => {
console.log('Добавлена вершина');
});
Эти события позволяют синхронизировать состояние карты с внешними системами хранения данных.
При включённом draggable: true доступны события:
dragstartdragdragendОни применяются как к целому объекту, так и к отдельным вершинам в режиме редактирования.
Окружность (Circle) отличается от полигонов тем, что её
форма определяется центром и радиусом.
const circle = new google.maps.Circle({
center: { lat: 55.75, lng: 37.61 },
radius: 1000,
editable: true,
draggable: true,
map: map
});
В режиме редактирования доступны:
Изменения отслеживаются через:
circle.addListener('center_changed', () => {});
circle.addListener('radius_changed', () => {});
Прямоугольник (Rectangle) задаётся границами
LatLngBounds.
const rectangle = new google.maps.Rectangle({
bounds: {
north: 55.76,
south: 55.74,
east: 37.65,
west: 37.60
},
editable: true,
draggable: true,
map: map
});
Редактирование реализуется через изменение угловых маркеров, которые
модифицируют bounds.
События:
bounds_changedrectangle.addListener('bounds_changed', () => {
const bounds = rectangle.getBounds();
});
Для создания и редактирования фигур используется
DrawingManager, который предоставляет UI-инструменты
рисования.
const drawingManager = new google.maps.drawing.DrawingManager({
drawingMode: null,
drawingControl: true,
drawingControlOptions: {
position: google.maps.ControlPosition.TOP_CENTER,
drawingModes: ['polygon', 'polyline', 'rectangle', 'circle']
}
});
drawingManager.setMap(map);
После создания объекта можно включить редактирование:
polygon.setEditable(true);
polygon.setDraggable(true);
DrawingManager часто используется как стартовая точка, после которой управление передаётся вручную.
Редактирование не ограничивается пользовательским интерфейсом. Геометрия может изменяться программно.
const path = polygon.getPath();
path.clear();
path.push(new google.maps.LatLng(55.75, 37.61));
path.push(new google.maps.LatLng(55.76, 37.62));
path.push(new google.maps.LatLng(55.74, 37.63));
polygon.setPaths([
{ lat: 55.70, lng: 37.60 },
{ lat: 55.71, lng: 37.61 },
{ lat: 55.72, lng: 37.62 }
]);
Редактируемые фигуры часто требуют сохранения в формате JSON.
const coords = polygon.getPath().getArray().map(p => ({
lat: p.lat(),
lng: p.lng()
}));
const data = {
center: circle.getCenter().toJSON(),
radius: circle.getRadius()
};
const bounds = rectangle.getBounds().toJSON();
Такая структура используется для хранения в базах данных и последующего восстановления объектов на карте.
Редактирование часто разделяется на два режима:
Переключение осуществляется через свойства:
polygon.setEditable(false);
polygon.setDraggable(false);
При необходимости можно централизованно управлять всеми объектами карты, поддерживая список активных фигур и их состояние.
Для контроля допустимых изменений применяются дополнительные проверки:
Проверки обычно выполняются внутри событий set_at и
insert_at.
path.addListener('insert_at', (index) => {
if (path.getLength() > 10) {
path.removeAt(index);
}
});
Расширение geometry используется для анализа
изменений:
Пример контроля площади:
const area = google.maps.geometry.spherical.computeArea(polygon.getPath());
Это позволяет динамически реагировать на редактирование и ограничивать форму.
При большом количестве вершин критично учитывать:
set_atОптимизация достигается через:
let lock = false;
path.addListener('set_at', () => {
if (lock) return;
lock = true;
setTimeout(() => {
lock = false;
}, 100);
});
В сложных приложениях несколько фигур редактируются одновременно. Для этого используется централизованное управление состоянием:
Каждый объект подписывается на события изменений и обновляет общее состояние приложения.
Перемещение (draggable) и редактирование вершин могут
конфликтовать. В таких случаях приоритет определяется типом
взаимодействия:
Это различие важно при построении сложных интерфейсов редактирования геоданных.