Google Maps JavaScript API предоставляет гибкую систему стилизации, основанную на декларативном описании внешнего вида географических объектов. Основной механизм управления визуальным представлением карты строится вокруг набора стилей, применяемых к типам объектов (features) и их элементам (elements). Такой подход позволяет полностью переопределять стандартную картографическую визуализацию: скрывать подписи, менять цветовую гамму дорог, воды, административных границ и объектов интереса.
Система стилей опирается на три ключевых компонента:
features (объекты карты) — категории географических сущностей:
elements (элементы объектов) — части визуального представления:
stylers (стили) — параметры визуального оформления:
Каждое правило стиля представляет собой объект, объединяющий featureType, elementType и набор stylers.
Пример базовой структуры:
const styles = [
{
featureType: "road",
elementType: "geometry",
stylers: [
{ color: "#ffffff" },
{ lightness: 20 }
]
},
{
featureType: "water",
elementType: "geometry",
stylers: [
{ color: "#aadaff" }
]
}
];
Стили передаются через объект инициализации карты. В современных конфигурациях используется свойство styles внутри MapOptions:
const map = new google.maps.Map(document.getElementById("map"), {
center: { lat: 55.7558, lng: 37.6173 },
zoom: 10,
styles: styles
});
Передача стилей при создании экземпляра карты обеспечивает их немедленное применение ко всем тайлам, загружаемым в отображаемой области.
Более гибкий механизм основан на использовании StyledMapType. Он позволяет создавать альтернативные типы карт и переключать их через управление слоями.
const customStyle = [
{
featureType: "all",
elementType: "labels",
stylers: [{ visibility: "off" }]
},
{
featureType: "water",
elementType: "geometry",
stylers: [{ color: "#1f1f1f" }]
},
{
featureType: "landscape",
elementType: "geometry",
stylers: [{ color: "#2c2c2c" }]
}
];
const styledMap = new google.maps.StyledMapType(customStyle, {
name: "Dark Mode"
});
Регистрация нового типа карты выполняется через MapTypeRegistry:
const map = new google.maps.Map(document.getElementById("map"), {
center: { lat: 48.8566, lng: 2.3522 },
zoom: 11,
mapTypeControlOptions: {
mapTypeIds: ["roadmap", "satellite", "dark_mode"]
}
});
map.mapTypes.set("dark_mode", styledMap);
map.setMapTypeId("dark_mode");
Свойство visibility является основным инструментом управления отображением элементов карты. Оно поддерживает несколько режимов:
Пример отключения всех подписей:
const noLabels = [
{
featureType: "all",
elementType: "labels",
stylers: [
{ visibility: "off" }
]
}
];
Применение такого подхода часто используется для минималистичных картографических интерфейсов или наложения собственных UI-слоёв.
Дорожная сеть является наиболее детализированным слоем, содержащим множество подтипов:
Изменение визуальной иерархии дорог достигается через комбинацию color, weight и lightness:
const roadStyle = [
{
featureType: "road.highway",
elementType: "geometry",
stylers: [
{ color: "#ffcc00" },
{ weight: 1.5 }
]
},
{
featureType: "road.local",
elementType: "geometry",
stylers: [
{ color: "#dddddd" }
]
}
];
Контроль контрастности дорог относительно фона позволяет формировать визуальную иерархию навигации.
Водные объекты и ландшафтные зоны обычно используются для формирования базовой цветовой схемы карты.
const environmentStyle = [
{
featureType: "water",
elementType: "geometry",
stylers: [
{ color: "#0e2a47" },
{ visibility: "on" }
]
},
{
featureType: "landscape",
elementType: "geometry",
stylers: [
{ color: "#f2f2f2" }
]
}
];
Ландшафт часто используется как нейтральный фон, на котором выделяются другие элементы.
Точки интереса включают рестораны, магазины, парки и другие объекты инфраструктуры. Их стилизация особенно важна при создании специализированных карт.
Скрытие POI:
const hidePoi = [
{
featureType: "poi",
elementType: "all",
stylers: [
{ visibility: "off" }
]
}
];
Избирательное управление позволяет скрывать только подписи, оставляя иконки или наоборот:
const partialPoi = [
{
featureType: "poi.business",
elementType: "labels",
stylers: [
{ visibility: "off" }
]
}
];
Стилизация часто используется для создания тематических карт: тёмных, пастельных, контрастных или корпоративных.
Тёмная тема:
const darkTheme = [
{ elementType: "geometry", stylers: [{ color: "#212121" }] },
{ elementType: "labels.text.stroke", stylers: [{ color: "#000000" }] },
{ elementType: "labels.text.fill", stylers: [{ color: "#757575" }] },
{
featureType: "road",
elementType: "geometry",
stylers: [{ color: "#383838" }]
},
{
featureType: "water",
elementType: "geometry",
stylers: [{ color: "#000000" }]
}
];
Контрастная светлая схема:
const lightContrast = [
{ elementType: "geometry", stylers: [{ color: "#ffffff" }] },
{ elementType: "labels.text.fill", stylers: [{ color: "#333333" }] },
{
featureType: "road",
elementType: "geometry",
stylers: [{ color: "#e0e0e0" }]
}
];
Подписи представляют отдельный уровень визуализации, который можно контролировать независимо от геометрии.
const labelStyle = [
{
elementType: "labels.text.fill",
stylers: [
{ color: "#444444" }
]
},
{
elementType: "labels.text.stroke",
stylers: [
{ color: "#ffffff" },
{ weight: 2 }
]
}
];
Манипуляции с обводкой текста часто используются для повышения читаемости на насыщенных фонах.
Несколько массивов стилей могут объединяться в единый конфигурационный набор. Порядок правил имеет значение: более поздние правила переопределяют предыдущие.
const combinedStyles = [
...darkTheme,
...hidePoi,
...roadStyle
];
Такой подход позволяет строить модульные системы оформления, где каждый набор отвечает за отдельный аспект визуализации.
Стили могут изменяться во время выполнения, без пересоздания карты. Для этого используется метод setOptions:
map.setOptions({
styles: lightContrast
});
Динамическое переключение применяется в интерфейсах с переключателями тем или адаптивной визуализацией под время суток.
Система стилизации имеет ряд особенностей:
Глубокая кастомизация требует балансировки между читаемостью карты и визуальной выразительностью, особенно при работе с насыщенными данными и сложными интерфейсами наложений.