Google Maps JavaScript API содержит модуль Drawing Manager, предназначенный для интерактивного рисования геометрических объектов на карте. Он предоставляет набор инструментов для создания маркеров, линий, полигонов, прямоугольников и окружностей непосредственно пользователем в браузере, без необходимости ручного вычисления координат или построения геометрии через код.
Основная идея Drawing Manager заключается в том, чтобы связать пользовательские действия мыши с объектами карты и автоматически преобразовывать эти действия в корректные географические данные.
Для работы требуется подключение библиотеки drawing при
загрузке API:
<script src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&libraries=drawing"></script>
Ключевой параметр — libraries=drawing, без которого
инструменты рисования не будут доступны.
Drawing Manager работает поверх стандартного объекта карты:
let map;
function initMap() {
map = new google.maps.Map(document.getElementById("map"), {
center: { lat: 55.751244, lng: 37.618423 },
zoom: 10,
});
}
Основной объект —
google.maps.drawing.DrawingManager.
let drawingManager;
function initDrawingManager() {
drawingManager = new google.maps.drawing.DrawingManager({
drawingMode: google.maps.drawing.OverlayType.MARKER,
drawingControl: true,
drawingControlOptions: {
position: google.maps.ControlPosition.TOP_CENTER,
drawingModes: [
google.maps.drawing.OverlayType.MARKER,
google.maps.drawing.OverlayType.CIRCLE,
google.maps.drawing.OverlayType.POLYGON,
google.maps.drawing.OverlayType.POLYLINE,
google.maps.drawing.OverlayType.RECTANGLE,
],
},
});
drawingManager.setMap(map);
}
Drawing Manager поддерживает несколько типов объектов:
Используется для установки точек на карте.
google.maps.MarkerЛиния между точками.
LatLngЗамкнутая область.
Окружность с радиусом.
Прямоугольная область.
Drawing Manager генерирует событие overlaycomplete,
позволяющее перехватывать созданные объекты.
google.maps.event.addListener(drawingManager, "overlaycomplete", function (event) {
const overlay = event.overlay;
const type = event.type;
if (type === google.maps.drawing.OverlayType.MARKER) {
console.log("Marker:", overlay.getPosition().toJSON());
}
if (type === google.maps.drawing.OverlayType.POLYGON) {
const path = overlay.getPath();
const coordinates = path.getArray().map(p => p.toJSON());
console.log("Polygon:", coordinates);
}
});
Drawing Manager может переключаться между режимами динамически:
drawingManager.setDrawingMode(google.maps.drawing.OverlayType.POLYGON);
Для отключения режима рисования:
drawingManager.setDrawingMode(null);
Каждый тип объекта можно настроить через опции Drawing Manager.
markerOptions: {
draggable: true,
animation: google.maps.Animation.DROP,
}
polylineOptions: {
strokeColor: "#FF0000",
strokeOpacity: 1,
strokeWeight: 2,
}
polygonOptions: {
fillColor: "#00FF00",
fillOpacity: 0.3,
strokeWeight: 2,
}
circleOptions: {
fillColor: "#0000FF",
fillOpacity: 0.2,
strokeColor: "#0000FF",
}
rectangleOptions: {
fillColor: "#FFA500",
fillOpacity: 0.25,
}
drawingManager = new google.maps.drawing.DrawingManager({
drawingMode: null,
drawingControl: true,
drawingControlOptions: {
position: google.maps.ControlPosition.TOP_CENTER,
drawingModes: [
google.maps.drawing.OverlayType.MARKER,
google.maps.drawing.OverlayType.POLYLINE,
google.maps.drawing.OverlayType.POLYGON,
google.maps.drawing.OverlayType.CIRCLE,
google.maps.drawing.OverlayType.RECTANGLE,
],
},
markerOptions: {
draggable: true,
},
polylineOptions: {
strokeColor: "#FF0000",
strokeWeight: 3,
},
polygonOptions: {
fillColor: "#00FF00",
fillOpacity: 0.3,
},
circleOptions: {
fillColor: "#0000FF",
fillOpacity: 0.2,
},
rectangleOptions: {
fillColor: "#FFA500",
fillOpacity: 0.25,
},
});
overlay.getPosition().lat();
overlay.getPosition().lng();
const path = overlay.getPath();
path.forEach((latLng) => {
console.log(latLng.lat(), latLng.lng());
});
const center = overlay.getCenter();
const radius = overlay.getRadius();
const bounds = overlay.getBounds();
console.log(bounds.getNorthEast().toJSON());
console.log(bounds.getSouthWest().toJSON());
Созданные overlay можно удалять программно:
overlay.setMap(null);
Для массового удаления часто хранят ссылки:
const overlays = [];
google.maps.event.addListener(drawingManager, "overlaycomplete", function (event) {
overlays.push(event.overlay);
});
function clearAll() {
overlays.forEach(o => o.setMap(null));
overlays.length = 0;
}
По умолчанию многие объекты остаются редактируемыми. Можно фиксировать их состояние:
polygon.setEditable(false);
polygon.setDraggable(false);
Drawing Manager часто используется в задачах:
При этом данные, полученные из overlay, обычно сериализуются в GeoJSON-подобные структуры:
function polygonToGeoJSON(polygon) {
const coords = polygon.getPath().getArray().map(p => [p.lng(), p.lat()]);
return {
type: "Polygon",
coordinates: [coords],
};
}
После создания объектов можно отслеживать изменения:
google.maps.event.addListener(polygon.getPath(), "set_at", updateData);
google.maps.event.addListener(polygon.getPath(), "insert_at", updateData);
google.maps.event.addListener(polygon.getPath(), "remove_at", updateData);
Drawing Manager может использоваться вместе с:
При этом порядок отрисовки влияет на взаимодействие с пользовательскими объектами.
map.overlayMapTypes.push(customTileLayer);
Для сохранения состояния обычно используется сериализация:
const saved = overlays.map(o => {
return o.getPath
? o.getPath().getArray().map(p => p.toJSON())
: o.getPosition().toJSON();
});
Восстановление:
const polygon = new google.maps.Polygon({
paths: savedPolygon,
map: map,
});
Drawing Control может быть полностью отключён:
drawingControl: false
В этом случае режим рисования управляется исключительно программно
через setDrawingMode.
В типичных приложениях логика разделяется на три слоя:
Такой подход позволяет использовать Drawing Manager как UI-инструмент поверх геоданных без привязки к бизнес-логике интерфейса.