【问题标题】:how to use svg icons in openlayers 4 if collected from the svg file如果从 svg 文件中收集,如何在 openlayers 4 中使用 svg 图标
【发布时间】:2017-05-17 05:22:37
【问题描述】:

问题如下,有svg文件格式:

<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px">

    <symbol id="gear" viewBox="0 0 300 300" enable-background="new 0 0 300 300" xml:space="preserve">
         <path fill="#inherit" stroke="#000000" d="..."/>
    </symbol>

    <symbol id="drill" viewBox="0 0 300 300" xml:space="preserve">
         <path style="stroke:none; fill:#000000" d="..."/>
    </symbol>
<svg>

执行以下操作以使该文件成为图标并显示在地图上。非常图标收集: SVG.create('img/iconsSvg.svg#gear','img/iconsSvg.svg#drill')可以用html显示

var SVG={
    svgns:'http://www.w3.org/2000/svg',
    xlink:'http://www.w3.org/1999/xlink',
    create:function(){
        let pathUse=arguments;
        var svg=document.createElementNS(SVG.svgns, 'svg');
        for (let i = 0; i < pathUse.length; i++) {
            let use=document.createElementNS(SVG.svgns, 'use');
            use.setAttributeNS(SVG.xlink, 'xlink:href', pathUse[i]);
            svg.appendChild(use);
        }
        return svg;
    }
}

在 openlayers 中设置 this 的样式:

function setStyleIcon(){
                return new ol.style.Style({
                    image: new ol.style.Icon({
                        img:SVG.create('img/iconsSvg.svg#gear'),
                        imgSize:[30,30]
                    })
                });
            }   

当它崩溃时出现错误:CanvasRenderingContext2D.drawImage 的参数 1 无法转换为任何一个:HTMLImageElement、HTMLCanvasElement、HTMLVideoElement、ImageBitmap。

不知道怎么把svg翻译成canvas

但我不能把它放在地图上,提前谢谢你的帮助

【问题讨论】:

    标签: svg icons


    【解决方案1】:

    找到一个不太好的解决方案,将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格式“for 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;});
    

    【讨论】:

      猜你喜欢
      • 2019-05-03
      • 1970-01-01
      • 1970-01-01
      • 2017-07-06
      • 1970-01-01
      • 1970-01-01
      • 2019-04-21
      • 1970-01-01
      • 2015-11-21
      相关资源
      最近更新 更多