Оверлеи в Google Maps JavaScript API позволяют отображать поверх карты дополнительные визуальные элементы: маркеры, полигоны, полилинии, окружности, прямоугольники, пользовательские изображения и собственные HTML-компоненты. Управление прозрачностью и видимостью является важной частью разработки интерактивных картографических интерфейсов, поскольку влияет на читаемость карты, восприятие данных и производительность приложения.
Основными механизмами управления отображением являются:
opacity;Для маркеров используется свойство opacity, принимающее
значения от 0 до 1.
const marker = new google.maps.Marker({
position: { lat: 55.751244, lng: 37.618423 },
map: map,
opacity: 0.5
});
Значения интерпретируются следующим образом:
| Значение | Результат |
|---|---|
| 0 | Полностью прозрачный |
| 0.25 | Сильно прозрачный |
| 0.5 | Полупрозрачный |
| 0.75 | Почти непрозрачный |
| 1 | Полностью видимый |
Изменение прозрачности после создания:
marker.setOpacity(0.3);
Получение текущего значения:
const opacity = marker.getOpacity();
console.log(opacity);
Часто требуется визуально выделять активный объект и затемнять остальные.
markers.forEach(marker => {
marker.setOpacity(0.3);
});
selectedMarker.setOpacity(1);
Подобный подход применяется для:
Если используется собственное изображение маркера, прозрачность задаётся двумя способами.
const marker = new google.maps.Marker({
position: position,
map: map,
icon: "marker.png",
opacity: 0.6
});
Файл изображения может содержать встроенную прозрачность.
Например:
В этом случае итоговая прозрачность формируется как комбинация
прозрачности изображения и свойства opacity.
Полилинии поддерживают настройку прозрачности цвета линии через
параметр strokeOpacity.
const route = new google.maps.Polyline({
path: coordinates,
strokeColor: "#FF0000",
strokeOpacity: 0.5,
strokeWeight: 4,
map: map
});
Основные параметры:
strokeColor
strokeOpacity
strokeWeight
Пример почти прозрачной линии:
route.setOptions({
strokeOpacity: 0.15
});
Такой подход полезен для отображения:
Полигоны имеют два независимых параметра прозрачности:
const polygon = new google.maps.Polygon({
paths: coordinates,
strokeColor: "#0000FF",
strokeOpacity: 0.8,
strokeWeight: 2,
fillColor: "#0000FF",
fillOpacity: 0.35,
map: map
});
Здесь:
strokeOpacity отвечает за прозрачность границы;fillOpacity отвечает за прозрачность внутренней
области.Часто необходимо сделать контур заметным, а заливку ненавязчивой.
const polygon = new google.maps.Polygon({
paths: zone,
strokeColor: "#00AAFF",
strokeOpacity: 1,
strokeWeight: 3,
fillColor: "#00AAFF",
fillOpacity: 0.1,
map: map
});
Результат:
Окружности используют те же параметры, что и полигоны.
const circle = new google.maps.Circle({
center: centerPoint,
radius: 1000,
strokeColor: "#008000",
strokeOpacity: 0.8,
strokeWeight: 2,
fillColor: "#008000",
fillOpacity: 0.2,
map: map
});
Изменение прозрачности во время работы:
circle.setOptions({
fillOpacity: 0.6
});
Для прямоугольников применяются аналогичные настройки.
const rectangle = new google.maps.Rectangle({
bounds: bounds,
strokeColor: "#FF6600",
strokeOpacity: 0.9,
strokeWeight: 2,
fillColor: "#FF6600",
fillOpacity: 0.25,
map: map
});
Полезно при отображении:
Иногда требуется не уменьшить прозрачность, а полностью скрыть объект.
Большинство оверлеев используют метод:
overlay.setMap(null);
Например:
marker.setMap(null);
или
polygon.setMap(null);
После выполнения объект перестаёт отображаться на карте.
Для повторного отображения необходимо снова привязать объект к карте.
marker.setMap(map);
или
polygon.setMap(map);
При этом:
Типичный сценарий — отображение и скрытие набора объектов.
let visible = true;
button.addEventListener("click", () => {
visible = !visible;
markers.forEach(marker => {
marker.setMap(visible ? map : null);
});
});
Подобная техника лежит в основе:
Для крупных проектов объекты обычно хранятся в массивах.
const restaurants = [];
const hotels = [];
const parks = [];
Скрытие целой группы:
restaurants.forEach(marker => {
marker.setMap(null);
});
Показ группы:
restaurants.forEach(marker => {
marker.setMap(map);
});
Такой подход позволяет строить полноценную систему слоёв.
Пользовательские оверлеи, созданные через OverlayView,
позволяют применять стандартные CSS-свойства.
div.style.opacity = "0.5";
Изменение прозрачности:
div.style.opacity = "0.2";
Полная видимость:
div.style.opacity = "1";
Поскольку используется HTML-элемент, доступны все возможности CSS-анимации.
.custom-overlay {
opacity: 0;
transition: opacity 0.4s ease;
}
После отображения:
element.style.opacity = "1";
Получается эффект плавного появления объекта поверх карты.
element.style.opacity = "0";
После завершения анимации:
setTimeout(() => {
overlay.setMap(null);
}, 400);
Такой механизм выглядит значительно лучше мгновенного удаления.
Для повышения интерактивности можно изменять прозрачность объекта во время наведения курсора.
Пример для полигона:
polygon.addListener("mouseover", () => {
polygon.setOptions({
fillOpacity: 0.6
});
});
polygon.addListener("mouseout", () => {
polygon.setOptions({
fillOpacity: 0.2
});
});
Эффект визуально подчёркивает выбранную область.
Распространённый интерфейсный приём — приглушение остальных объектов.
markers.forEach(marker => {
marker.setOpacity(0.2);
});
activeMarker.setOpacity(1);
Преимущества:
Событие изменения масштаба позволяет показывать и скрывать оверлеи автоматически.
map.addListener("zoom_changed", () => {
const zoom = map.getZoom();
if (zoom < 10) {
polygon.setMap(null);
} else {
polygon.setMap(map);
}
});
Подход особенно полезен для:
Вместо полного скрытия возможно постепенное изменение прозрачности.
map.addListener("zoom_changed", () => {
const zoom = map.getZoom();
const opacity = Math.min(1, zoom / 15);
polygon.setOptions({
fillOpacity: opacity * 0.4
});
});
Визуальный переход становится значительно мягче.
Свойство прозрачности почти не влияет на производительность при небольшом количестве объектов.
Однако при работе с:
следует учитывать дополнительные затраты браузера на отрисовку полупрозрачных элементов.
Для оптимизации рекомендуется:
setMap(null);marker.setOpacity(0);
Объект становится невидимым, но продолжает существовать на карте и участвовать в обработке событий.
Если требуется действительно убрать объект, следует использовать:
marker.setMap(null);
fillOpacity: 0.05,
strokeOpacity: 1
В результате контур может выглядеть слишком агрессивно по отношению к почти незаметной области.
Необходимо подбирать значения совместно.
fillOpacity: 0.02
Подобные значения часто делают объект практически невидимым на светлых картах.
Практически полезный диапазон:
0.15 - 0.45
для большинства заливок.
| Тип объекта | Рекомендуемое значение |
|---|---|
| Маркер в фоне | 0.3–0.6 |
| Активный маркер | 1 |
| Полигон зоны | 0.15–0.35 |
| Полигон выделения | 0.4–0.6 |
| Окружность радиуса действия | 0.15–0.3 |
| Второстепенный маршрут | 0.2–0.5 |
| Основной маршрут | 0.8–1 |
| Пользовательский OverlayView | 0.7–1 |
Грамотное управление прозрачностью и видимостью позволяет создавать карты, которые одновременно остаются информативными, визуально аккуратными и удобными при работе с большим количеством географических объектов.