Визуальные элементы карты в Google Maps JavaScript API традиционно опираются на растровые изображения (PNG, JPG), используемые для маркеров, оверлеев и кастомных иконок. Однако SVG предоставляет более гибкий подход к визуализации, особенно в контексте масштабируемых интерфейсов, адаптивной графики и динамической стилизации.
SVG-иконки сохраняют четкость на любых DPI, позволяют изменять цвет и форму без пересборки ассетов и могут быть встроены напрямую в конфигурацию карты.
Google Maps API поддерживает использование SVG через свойство
icon объекта маркера. Наиболее простой способ — передача
URL на SVG-файл.
const marker = new google.maps.Marker({
position: { lat: 40.7128, lng: -74.0060 },
map,
icon: "https://example.com/icons/marker.svg"
});
SVG в этом случае загружается как внешний ресурс. Важно учитывать:
Более гибкий способ — использование Data URI. SVG кодируется в строку и передается напрямую:
const svgIcon = {
url: "data:image/svg+xml;charset=UTF-8," + encodeURIComponent(`
<svg xmlns="http://www.w3.org/2000/svg" width="40" height="40">
<circle cx="20" cy="20" r="10" fill="red"/>
</svg>
`),
scaledSize: new google.maps.Size(40, 40)
};
const marker = new google.maps.Marker({
position: { lat: 48.8566, lng: 2.3522 },
map,
icon: svgIcon
});
Особенности такого подхода:
Ограничение связано с длиной URI и читаемостью кода при сложных SVG.
API поддерживает специализированный тип иконок —
google.maps.Symbol. Он позволяет использовать
предопределённые формы и кастомный SVG path.
const marker = new google.maps.Marker({
position: { lat: 51.5074, lng: -0.1278 },
map,
icon: {
path: google.maps.SymbolPath.CIRCLE,
scale: 8,
fillColor: "#4285F4",
fillOpacity: 1,
strokeWeight: 2,
strokeColor: "#ffffff"
}
});
В данном случае SVG не используется напрямую, но модель символов концептуально близка к векторной графике.
SVG-подобная геометрия может быть описана через path:
const customSymbol = {
path: "M10 0 L20 20 L0 20 Z",
fillColor: "#34A853",
fillOpacity: 1,
strokeWeight: 1,
scale: 1.5
};
const marker = new google.maps.Marker({
position: { lat: 35.6895, lng: 139.6917 },
map,
icon: customSymbol
});
Path не является полноценным SVG, но позволяет создавать компактные векторные маркеры без внешних файлов.
SVG не теряет качество при масштабировании, однако в Google Maps API требуется явная настройка размеров:
scaledSize — фиксирует визуальный размерscale — влияет на Symbol-иконкиanchor — задает точку привязкиconst icon = {
url: "data:image/svg+xml;charset=UTF-8," + encodeURIComponent(svgString),
scaledSize: new google.maps.Size(48, 48),
anchor: new google.maps.Point(24, 48)
};
При неправильной настройке anchor маркеры могут смещаться относительно координаты.
SVG позволяет изменять цвет и параметры без замены файла. Это особенно полезно для отображения состояния объектов.
function createSvgIcon(color) {
return {
url: "data:image/svg+xml;charset=UTF-8," + encodeURIComponent(`
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32">
<rect width="32" height="32" fill="${color}" rx="6"/>
</svg>
`),
scaledSize: new google.maps.Size(32, 32)
};
}
const marker = new google.maps.Marker({
position: { lat: 52.52, lng: 13.405 },
map,
icon: createSvgIcon("#ff0000")
});
Такой подход часто используется для:
SVG может влиять на производительность иначе, чем PNG.
При использовании кластеризации (MarkerClusterer) SVG
позволяет сохранять визуальную согласованность и масштабируемость
кластерных иконок.
const clusterStyles = [{
url: "data:image/svg+xml;charset=UTF-8," + encodeURIComponent(`
<svg xmlns="http://www.w3.org/2000/svg" width="40" height="40">
<circle cx="20" cy="20" r="18" fill="#1976D2"/>
<text x="20" y="25" font-size="12" text-anchor="middle" fill="#fff">{count}</text>
</svg>
`),
height: 40,
width: 40
}];
SVG здесь позволяет отображать динамическое значение количества объектов без генерации растровых изображений.
Несмотря на гибкость, SVG имеет ряд ограничений:
Также важно учитывать, что Google Maps может упрощать или растрировать SVG в зависимости от контекста отображения.
SVG позволяет задавать единый шаблон маркера с изменяемым цветом:
SVG используется для визуального разделения слоев данных:
При изменении состояния объекта SVG генерируется заново без замены логики маркера:
marker.setIcon(createSvgIcon(newColor));
Такой подход снижает необходимость хранения большого числа ассетов.
SVG:
PNG:
Выбор определяется характером нагрузки и степенью динамичности интерфейса.