Стандартный маркер в API представляет собой классический красный «пин», который подходит для базовых сценариев, но быстро становится ограничением при построении интерфейсов с высокой плотностью данных, кастомной визуализацией или брендингом. Пользовательские иконки позволяют полностью контролировать внешний вид маркеров: от простого изображения до сложных SVG-символов и динамически изменяемых компонентов.
iconОсновной способ задать пользовательскую иконку — использование
свойства icon при создании маркера.
const marker = new google.maps.Marker({
position: { lat: 48.8566, lng: 2.3522 },
map,
icon: "https://example.com/icons/marker.png"
});
В этом варианте используется внешнее изображение. API загружает его и отображает вместо стандартного маркера.
Дополнительно icon может быть объектом:
const marker = new google.maps.Marker({
position: { lat: 48.8566, lng: 2.3522 },
map,
icon: {
url: "https://example.com/icons/marker.png",
scaledSize: new google.maps.Size(40, 40)
}
});
scaledSizeИзображения редко подходят под реальные требования интерфейса без
масштабирования. Параметр scaledSize задаёт финальный
размер иконки на карте.
icon: {
url: "icon.png",
scaledSize: new google.maps.Size(32, 32)
}
Ключевой момент: оригинальный размер изображения не влияет на
отображение — используется именно scaledSize.
anchor)Иконка маркера «прикрепляется» к координате карты через точку якоря. По умолчанию это нижний центр изображения, но при кастомных иконках часто требуется корректировка.
icon: {
url: "icon.png",
scaledSize: new google.maps.Size(40, 40),
anchor: new google.maps.Point(20, 40)
}
Логика:
anchor.x — горизонтальное смещениеanchor.y — вертикальное смещениеSVG обеспечивает масштабируемость без потери качества и возможность динамической стилизации.
icon: {
url: "icon.svg",
scaledSize: new google.maps.Size(30, 30)
}
icon: {
url: "data:image/svg+xml;charset=UTF-8," + encodeURIComponent(`
<svg width="40" height="40" viewBox="0 0 40 40">
<circle cx="20" cy="20" r="10" fill="blue"/>
</svg>
`),
scaledSize: new google.maps.Size(40, 40)
}
SVG особенно полезен при необходимости менять цвет маркера в зависимости от состояния объекта (например, статус, категория, приоритет).
Symbol)API поддерживает векторные символы через объект Symbol,
который позволяет строить маркеры без внешних изображений.
const marker = new google.maps.Marker({
position: { lat: 48.8566, lng: 2.3522 },
map,
icon: {
path: google.maps.SymbolPath.CIRCLE,
scale: 8,
fillColor: "#4285F4",
fillOpacity: 1,
strokeWeight: 2
}
});
Основные параметры:
path — форма символаscale — размерfillColor — цвет заливкиstrokeColor — цвет обводкиstrokeWeight — толщина линииДоступны предопределённые формы:
CIRCLEFORWARD_CLOSED_ARROWBACKWARD_CLOSED_ARROWИконку можно изменять после создания маркера без пересоздания объекта.
marker.setIcon("new-icon.png");
Или с объектной конфигурацией:
marker.setIcon({
url: "active-icon.png",
scaledSize: new google.maps.Size(50, 50)
});
Типичные сценарии:
Часто иконка определяется динамически:
function getIcon(type) {
if (type === "restaurant") {
return "icons/restaurant.png";
}
if (type === "hotel") {
return "icons/hotel.png";
}
return "icons/default.png";
}
const marker = new google.maps.Marker({
position,
map,
icon: getIcon(place.type)
});
При большом количестве маркеров критично учитывать производительность:
Symbol уменьшает количество
HTTP-запросовПри нестандартной геометрии изображения важно точно настроить
anchor, иначе маркер будет «прыгать» относительно
координаты.
icon: {
url: "pin.png",
scaledSize: new google.maps.Size(60, 60),
anchor: new google.maps.Point(30, 60)
}
Для сложных UI-иконок (например, с тенью или подписью) часто требуется ручная калибровка координат.
labelИконка может комбинироваться с текстовой подписью:
const marker = new google.maps.Marker({
position,
map,
icon: "icon.png",
label: {
text: "A",
color: "white"
}
});
При кастомных иконках важно учитывать контраст и читаемость текста поверх изображения.
AdvancedMarkerElementВ новых версиях API рекомендуется использовать
AdvancedMarkerElement, который заменяет классические
маркеры и предоставляет расширенные возможности кастомизации.
const pin = new google.maps.marker.PinElement({
background: "#4285F4",
borderColor: "#1a73e8",
glyphColor: "white"
});
const marker = new google.maps.marker.AdvancedMarkerElement({
map,
position: { lat: 48.8566, lng: 2.3522 },
content: pin.element
});
Преимущества:
Хотя стандартные маркеры ограничены в анимации, смена иконок позволяет имитировать состояние:
setInterval(() => {
marker.setIcon(toggle ? "icon1.png" : "icon2.png");
toggle = !toggle;
}, 1000);
Для AdvancedMarkerElement возможна полноценная
CSS-анимация через content.
icon может вызывать перерисовку слоя