ПРОСТОЕ РЕШЕНИЕ - ИСПОЛЬЗОВАНИЕ SVG
Работает в: в IE9 , IE10 , FF, Chrome, Safari
(если вы используете другие браузеры, пожалуйста, "Запустите фрагмент кода" и оставьте комментарий)
Никаких внешних зависимостей, кроме Google Maps API!
![enter image description here](https://i.stack.imgur.com/U0Mfx.png)
Это довольно легко, если у вас есть значок в формате .svg . Если это так, просто добавьте соответствующий текстовый элемент и измените его содержимое в соответствии с вашими потребностями с помощью JS.
Добавьте что-то подобное в ваш .svg
код (это текстовый раздел, который позже будет изменен с помощью JS):
<text id="1" fill="#20539F" font-family="NunitoSans-ExtraBold, Nunito Sans" font-size="18" font-weight="600" letter-spacing=".104" text-anchor="middle" x="50%" y="28">1</text>
Пример: (частично скопировано из @ EstevãoLucas)
Важно:
Используйте правильные свойства тега <text>
. Обратите внимание text-anchor="middle" x="50%" y="28"
, в каком центре более длинные цифры (подробнее: Как разместить текст по центру в прямоугольнике SVG )
Использовать encodeURIComponent()
(это, вероятно, обеспечивает совместимость с IE9 и 10)
// Most important part (use output as Google Maps icon)
function getMarkerIcon(number) {
// inline your SVG image with number variable
var svg = '<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="40" height="40" viewBox="0 0 40 40"> <defs> <rect id="path-1" width="40" height="40"/> <mask id="mask-2" width="40" height="40" x="0" y="0" fill="white"> <use xlink:href="#path-1"/> </mask> </defs> <g id="Page-1" fill="none" fill-rule="evenodd"> <g id="Phone-Portrait---320" transform="translate(-209 -51)"> <g id="Group" transform="translate(209 51)"> <use id="Rectangle" fill="#FFEB3B" stroke="#F44336" stroke-width="4" mask="url(#mask-2)" xlink:href="#path-1"/> <text id="1" fill="#20539F" font-family="NunitoSans-ExtraBold, Nunito Sans" font-size="18" font-weight="600" letter-spacing=".104" text-anchor="middle" x="50%" y="28">' + number + '</text> </g> </g> </g> </svg>';
// use SVG without base64 see: https://css-tricks.com/probably-dont-base64-svg/
return 'data:image/svg+xml;charset=utf-8,' + encodeURIComponent(svg);
}
// Standard Maps API code
var markers = [
[1, -14.2350040, -51.9252800],
[2, -34.028249, 151.157507],
[3, 39.0119020, -98.4842460],
[5, 48.8566140, 2.3522220],
[9, 38.7755940, -9.1353670],
[12, 12.0733335, 52.8234367],
];
function initializeMaps() {
var myLatLng = {
lat: -25.363,
lng: 131.044
};
var map = new google.maps.Map(document.getElementById('map_canvas'), {
zoom: 4,
center: myLatLng
});
var bounds = new google.maps.LatLngBounds();
markers.forEach(function(point) {
var pos = new google.maps.LatLng(point[1], point[2]);
new google.maps.Marker({
position: pos,
map: map,
icon: getMarkerIcon(point[0]),
});
bounds.extend(pos);
});
map.fitBounds(bounds);
}
initializeMaps();
#map_canvas {
width: 100%;
height: 300px;
}
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="style.css">
<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script>
</head>
<body>
<div id="map_canvas"></div>
</body>
<script src="script.js"></script>
</html>
Подробнее о встроенном SVG в Картах Google: https://robert.katzki.de/posts/inline-svg-as-google-maps-marker