Функциональность рисования в Google Maps JavaScript API
предоставляется дополнительной библиотекой drawing, которая
подключается отдельно от базового API. Без её явного включения доступ к
DrawingManager и связанным классам отсутствует.
Подключение выполняется через параметр libraries при
загрузке API:
<script
src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&libraries=drawing">
</script>
При необходимости подключения нескольких библиотек используется перечисление через запятую:
libraries=drawing,geometry
Библиотека drawing добавляет следующие ключевые
компоненты:
google.maps.drawing.DrawingManagerИнструменты рисования работают поверх экземпляра карты
google.maps.Map. Карта создаётся стандартным способом:
const map = new google.maps.Map(document.getElementById("map"), {
center: { lat: 55.751244, lng: 37.618423 },
zoom: 10,
});
DrawingManager привязывается к уже созданной карте и использует её как контекст для размещения объектов.
Ключевой объект библиотеки — DrawingManager. Он
управляет режимами рисования, стилями объектов и поведением после
завершения создания фигур.
Базовая инициализация:
const drawingManager = new google.maps.drawing.DrawingManager({
map: map,
drawingMode: google.maps.drawing.OverlayType.MARKER,
drawingControl: true,
});
drawingMode Определяет активный режим рисования:
MARKERPOLYGONPOLYLINERECTANGLECIRCLEdrawingControl Включает панель инструментов рисования на карте.
drawingControlOptions Позволяет настроить расположение и доступные инструменты:
drawingControlOptions: {
position: google.maps.ControlPosition.TOP_CENTER,
drawingModes: [
google.maps.drawing.OverlayType.MARKER,
google.maps.drawing.OverlayType.POLYGON,
],
}
Режим MARKER создаёт одиночные точки на карте.
google.maps.drawing.OverlayType.MARKER
Используется для обозначения объектов, событий или координатных меток.
POLYLINE формирует ломаную линию из последовательности
точек.
google.maps.drawing.OverlayType.POLYLINE
Типично применяется для маршрутов и трасс.
POLYGON позволяет замыкать фигуру и заполнять её
область.
google.maps.drawing.OverlayType.POLYGON
Используется для выделения территорий, зон и границ.
RECTANGLE создаёт прямоугольную область по двум точкам
диагонали.
google.maps.drawing.OverlayType.RECTANGLE
CIRCLE задаётся центром и радиусом.
google.maps.drawing.OverlayType.CIRCLE
Каждый тип объекта поддерживает собственный набор визуальных параметров.
const polygonOptions = {
fillColor: "#2b8a3e",
fillOpacity: 0.35,
strokeColor: "#1c5f2a",
strokeWeight: 2,
clickable: true,
editable: true,
zIndex: 1,
};
const drawingManager = new google.maps.drawing.DrawingManager({
map: map,
polygonOptions: polygonOptions,
});
polylineOptions: {
strokeColor: "#ff0000",
strokeOpacity: 0.8,
strokeWeight: 3,
editable: true,
}
circleOptions: {
fillColor: "#4285F4",
fillOpacity: 0.2,
strokeColor: "#3367D6",
strokeWeight: 2,
editable: true,
}
После завершения рисования объект может:
Контроль осуществляется через параметр:
drawingManager.setOptions({
drawingMode: null,
});
Установка null отключает активный режим рисования после
создания фигуры.
Каждый раз при создании фигуры срабатывает событие
overlaycomplete.
google.maps.event.addListener(drawingManager, "overlaycomplete", function (event) {
const overlay = event.overlay;
const type = event.type;
});
event.overlay — созданный объект (Marker, Polygon и
т.д.)event.type — тип объектаДля управления множеством фигур обычно используется массив:
const allOverlays = [];
google.maps.event.addListener(drawingManager, "overlaycomplete", function (event) {
allOverlays.push(event.overlay);
});
Большинство объектов поддерживают интерактивное редактирование.
polygon.setEditable(true);
marker.setDraggable(true);
circle.setEditable(true);
Редактируемые объекты автоматически обновляют геометрию без необходимости пересоздания.
Удаление объектов выполняется через привязку к карте:
overlay.setMap(null);
Для массового удаления:
allOverlays.forEach((item) => item.setMap(null));
allOverlays.length = 0;
DrawingManager позволяет жестко ограничить набор доступных инструментов, отключая лишние режимы.
drawingControlOptions: {
drawingModes: [
google.maps.drawing.OverlayType.POLYGON,
google.maps.drawing.OverlayType.CIRCLE,
],
}
Такой подход используется в сценариях геоаналитики и зонального моделирования.
marker.getPosition().lat();
marker.getPosition().lng();
polygon.getPath().forEach((latLng) => {
console.log(latLng.lat(), latLng.lng());
});
circle.getRadius();
circle.getCenter();
Часто требуется преобразование данных в формат GeoJSON-подобной структуры.
function polygonToCoords(polygon) {
const coords = [];
polygon.getPath().forEach((point) => {
coords.push([point.lng(), point.lat()]);
});
return coords;
}
При работе с десятками и сотнями фигур учитываются следующие факторы:
editable=true для статичных слоёвconst map = new google.maps.Map(document.getElementById("map"), {
center: { lat: 55.751244, lng: 37.618423 },
zoom: 11,
});
const drawingManager = new google.maps.drawing.DrawingManager({
map: map,
drawingControl: true,
drawingControlOptions: {
position: google.maps.ControlPosition.TOP_CENTER,
drawingModes: [
google.maps.drawing.OverlayType.MARKER,
google.maps.drawing.OverlayType.POLYGON,
google.maps.drawing.OverlayType.CIRCLE,
],
},
markerOptions: {
draggable: true,
},
polygonOptions: {
fillColor: "#00AAFF",
fillOpacity: 0.3,
strokeWeight: 2,
editable: true,
},
circleOptions: {
fillColor: "#FFAA00",
fillOpacity: 0.2,
strokeWeight: 2,
editable: true,
},
});
google.maps.event.addListener(drawingManager, "overlaycomplete", function (event) {
const shape = event.overlay;
shape.setEditable(true);
});
drawingControlDrawing API основан на событиях:
Комбинация событий позволяет строить полноценные геоинформационные интерфейсы поверх карты без внешних библиотек.