как использовать значки svg в openlayers 4, если они собраны из файла svg


0

Найденное решение не очень красивое, svg вставлен в файл js и работает с ним, как с текстом, может кому-то пригодиться:

Функция устанавливает стиль:

function setStyleSvg(type,color,scale){
            var svg=svgIcon.getSvg([['location',color],[type,'rgb(100,100,100)',true]]);
            var style=new ol.style.Style({
            image: new ol.style.Icon( {
                src:'data:image/svg+xml;utf8,'+svg,
                scale: scale,
                anchor: [0.5, 1],
                anchorXUnits: 'fraction',
                anchorYUnits: 'fraction',
                })
            });
            return style;
        };

собирать svg (цвет нужен формат rgb / rgba "для angularJS"):

app.factory('svgIcon',function(){
var size=[500,500];
var cssClass="unit";
var viewBox="0 0 2000 2000";
const closeTag='</svg>';
var insert='';

function icons(icon,color,label){
    var out;
    var offset=(label)?-250:0;
    switch(icon){
        case 'truck':out+=`<path viewBox="0 0 1024 538" transform="translate(448,`+(731+offset)+`)" fill="`+color+`" stroke="rgb(0,0,0)" stroke-width="10" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="1" d="...."/>
                `;
                break;
        case 'drill':out+=`....`;
                break;
        case 'excavator':out+=`....`;
            break;
    }
    return out;
}

this.setClass=(className)=>{
    cssClass=className;
};

this.setViewBox=(set)=>{
    viewBox=set;
};

this.setInsert=(set)=>{
    insert=set;
};

this.getSvg=(arr)=>{//([[type,color,label],[type,color,label]....])
    try {
        var svg=`<svg width="500" height="500" viewBox="`+viewBox+`" `+insert+` class="`+cssClass+`" version="1.1" xmlns="http://www.w3.org/2000/svg">`;
        for (var i = 0; i < arr.length; i++) {
            svg+=icons(arr[i][0],arr[i][1],arr[i][2]);
        }
        svg+=closeTag;
        return svg;
    } catch (err) {
        console.log('svg not create');
    }
}

return this;});
.SVG, иконки,

svg,icons,

1

Ответов: 1


0

Найденное решение не очень красивое, svg вставлен в файл js и работает с ним, как с текстом, может кому-то пригодиться:

Функция устанавливает стиль:

function setStyleSvg(type,color,scale){
            var svg=svgIcon.getSvg([['location',color],[type,'rgb(100,100,100)',true]]);
            var style=new ol.style.Style({
            image: new ol.style.Icon( {
                src:'data:image/svg+xml;utf8,'+svg,
                scale: scale,
                anchor: [0.5, 1],
                anchorXUnits: 'fraction',
                anchorYUnits: 'fraction',
                })
            });
            return style;
        };

собирать svg (цвет нужен формат rgb / rgba "для angularJS"):

app.factory('svgIcon',function(){
var size=[500,500];
var cssClass="unit";
var viewBox="0 0 2000 2000";
const closeTag='</svg>';
var insert='';

function icons(icon,color,label){
    var out;
    var offset=(label)?-250:0;
    switch(icon){
        case 'truck':out+=`<path viewBox="0 0 1024 538" transform="translate(448,`+(731+offset)+`)" fill="`+color+`" stroke="rgb(0,0,0)" stroke-width="10" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="1" d="...."/>
                `;
                break;
        case 'drill':out+=`....`;
                break;
        case 'excavator':out+=`....`;
            break;
    }
    return out;
}

this.setClass=(className)=>{
    cssClass=className;
};

this.setViewBox=(set)=>{
    viewBox=set;
};

this.setInsert=(set)=>{
    insert=set;
};

this.getSvg=(arr)=>{//([[type,color,label],[type,color,label]....])
    try {
        var svg=`<svg width="500" height="500" viewBox="`+viewBox+`" `+insert+` class="`+cssClass+`" version="1.1" xmlns="http://www.w3.org/2000/svg">`;
        for (var i = 0; i < arr.length; i++) {
            svg+=icons(arr[i][0],arr[i][1],arr[i][2]);
        }
        svg+=closeTag;
        return svg;
    } catch (err) {
        console.log('svg not create');
    }
}

return this;});
.SVG, иконки,