Потрясающие svg-иконки в openlayers

Я знаю, что подобные вопросы задавались раньше, но их ответы мне не помогли. Я пытаюсь использовать Fontawesome-Icons в качестве маркеров на карте Openlayers следующим образом:

const svg = `
                <svg xmlns = "http://www.w3.org/2000/svg" viewBox = "0 0 320 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.-->
                <path d = "M320 64c0-12.6-7.4-24-18.9-29.2s-25-3.1-34.4 5.3L131.8 160H64c-35.3 0-64 28.7-64 64v64c0 35.3 28.7 64 64 64h67.8L266.7 471.9c9.4 8.4 22.9 10.4 34.4 5.3S320 460.6 320 448V64z"/></svg>
            `;
const svgUrl = 'data:image/svg+xml;charset=utf-8,' + svg;
let measurePointStyle = new ol.style.Style({
    image: new ol.style.Icon({              
        src: svgUrl,
        scale: 1
    }),
    text: new ol.style.Text({
        text: "IO",
        offsetY: 25,
        fill: new ol.style.Fill({
            color: '#000'
        }),
        stroke: new ol.style.Stroke({
            color: '#fff',
            width: 2
        })
    })
});

текстовая часть стиля отображается на карте правильно, а значок — нет. Никаких ошибок. Я ищу решение уже больше часа, но не могу найти ничего, что могло бы помочь. Если бы кто-нибудь мог сказать мне, что я здесь делаю неправильно, я был бы очень признателен.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
54
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вам необходимо заменить все двойные кавычки, поскольку сам атрибут src заключен в двойные кавычки.

Примечание. Если ваш SVG использует # в цветах или идентификаторах, вам необходимо экранировать этот символ строкой %23
. потому что # имеет особое значение в URI (данных)

img { height:160px }
<script>
let svg = `<svg xmlns = "http://www.w3.org/2000/svg" viewBox = "0 0 320 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.-->
             <path d = "M320 64c0-12.6-7.4-24-18.9-29.2s-25-3.1-34.4 5.3L131.8 160H64c-35.3 0-64 28.7-64 64v64c0 35.3 28.7 64 64 64h67.8L266.7 471.9c9.4 8.4 22.9 10.4 34.4 5.3S320 460.6 320 448V64z"/>
           </svg>`;
document.write(`<img src = "data:image/svg+xml;charset=utf-8,${svg}">`);
svg = svg.replaceAll(`"`,`'`);
document.write(`<img src = "data:image/svg+xml;charset=utf-8,${svg}">`);
</script>
Ответ принят как подходящий

Самое простое решение — использовать метод JavaScript encodeURIComponent:

const svg = `
                <svg xmlns = "http://www.w3.org/2000/svg" viewBox = "0 0 320 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.-->
                <path d = "M320 64c0-12.6-7.4-24-18.9-29.2s-25-3.1-34.4 5.3L131.8 160H64c-35.3 0-64 28.7-64 64v64c0 35.3 28.7 64 64 64h67.8L266.7 471.9c9.4 8.4 22.9 10.4 34.4 5.3S320 460.6 320 448V64z"/></svg>
            `;
const svgUrl = 'data:image/svg+xml;charset=utf-8,' + encodeURIComponent(svg);
let measurePointStyle = new ol.style.Style({
    image: new ol.style.Icon({              
        src: svgUrl,
        scale: 1
    }),
    text: new ol.style.Text({
        text: "IO",
        offsetY: 25,
        fill: new ol.style.Fill({
            color: '#000'
        }),
        stroke: new ol.style.Stroke({
            color: '#fff',
            width: 2
        })
    })
});

Спасибо за ваш вклад! И это, и решение Дэнни сработают, если я помещу полученный URL-адрес в элемент img для тестирования. Изображение отображается так, как ожидалось. на карте же значков по-прежнему нет. есть идеи, что еще может вызвать это?

wubbe 14.07.2024 20:34

Чтобы надежно отрисовываться на холсте, SVG должен иметь атрибуты width и height, а также viewBox.

Mike 14.07.2024 23:08

вот и все. такая простая вещь... спасибо!

wubbe 15.07.2024 19:07

Другие вопросы по теме