Текст на SVG-иконке на карте

Необходимо создать шаблон значка для объекта на карте. В роли иконки выступает изображение svg.

Столкнулся с тем, что svg-фон значка (задается в iconLayout) всегда выводится поверх текста значка (задается в iconContent).

За основу я взял этот код: https://jsfiddle.net/5n9cm4zu/1/

            ymaps.ready(function () {
                var myMap = new ymaps.Map('map', {
                        center: [55.751574, 37.573856],
                        zoom: 9
                    }),

                    // Создаем шаблон иконки
                    MyIconLayout = ymaps.templateLayoutFactory.createClass([
                        '<svg width="46" height="46" style="position: absolute; top: -23px; left: -23px;">',
                            '<use href="#sym01"/>',
                        '</svg>'
                    ].join('')),

                    // Создаем объект на карте
                    myPlacemark = new ymaps.Placemark(myMap.getCenter(), {
                        hintContent: 'Собственный значок метки',
                        balloonContent: 'Это красивая метка',
                        iconContent: 'XXX'
                    }, {
                        iconLayout: MyIconLayout,
                        iconShape: {
                            type: 'Circle',
                            coordinates: [0, 0],
                            radius: 23
                        }
                    });

                myMap.geoObjects.add(myPlacemark);

            });

Что нужно сделать, чтобы текст на значке корректно отобразился?


Ответы (1 шт):

Автор решения: Alexandr_TT

Svg иконка вызывается командой <use href="#sym01"/>, поэтому добавим текст в SVG элемент с id="sym01" и позиционируем текст ниже красного кружка.

<symbol id="sym01">
  <circle cx="23" cy="23" r="20" stroke-width="6" stroke="green" fill="red"/> 
    <text x="46" y="62" font-size="18px" fill="#F07427" text-anchor="middle" > Столица РФ</text>
</symbol>

Note
Изменяя координаты x, y вы можете расположить надпись, как угодно относительно иконки: выше, ниже, правее

<style>
        html, body, #map {
            width: 100%; height: 100%; padding: 0; margin: 0;
        }
        </style>
 <script type="text/javascript" src="https://api-maps.yandex.ru/2.1/?lang=ru_RU"></script>   
<svg style="display: none;" >
<symbol id="sym01">
  <circle cx="23" cy="23" r="20" stroke-width="6" stroke="green" fill="red"/> 
    <text x="46" y="62" font-size="18px" fill="#F07427" text-anchor="middle" > Столица РФ</text>
</symbol>
</svg>

<div id="map"></div>
<script>
ymaps.ready(function () {
    var myMap = new ymaps.Map('map', {
            center: [55.751574, 37.573856],
            zoom: 9
        }),

        // Создаём макет иконки.
        MyIconLayout = ymaps.templateLayoutFactory.createClass([
            '<svg width="92" height="92" style="position: absolute; top: -23px; left: -23px;">',
                '<use href="#sym01"/>',
            '</svg>'
        ].join('')),

        myPlacemark = new ymaps.Placemark(myMap.getCenter(), {
            hintContent: 'Столица РФ',
            balloonContent: 'Это красивая метка',
            iconContent: 'XXX'
        }, {
            iconLayout: MyIconLayout,
            iconShape: {
                type: 'Circle',
                // Круг описывается в виде центра и радиуса
                coordinates: [0, 0],
                radius: 23
            }
        });

    myMap.geoObjects
        .add(myPlacemark);

});
</script>

→ Ссылка