Search code examples
svgstylesopenlayersmarker

Use SVG icon as marker in OpenLayers


I tried to svg icon as marker in Openlayers-3. Here in my code.

var svg = '<?xml version="1.0"?>'
            + '<svg viewBox="0 0 120 120" version="1.1" xmlns="http://www.w3.org/2000/svg">'
            + '<circle cx="60" cy="60" r="60"/>'
            + '</svg>';

var style = new ol.style.Style({
            image: new ol.style.Icon({
                opacity: 1,
                src: 'data:image/svg+xml;base64,' + btoa(svg)
            })
        });

But my svg image is truncated,as shown in the following picture. ( the icon should be a circle)

enter image description here


Solution

  • Here is an example that shows inline SVG in an icon symbolizer: http://jsfiddle.net/eze84su3/

    Here is the relevant code:

    var svg = '<svg width="120" height="120" version="1.1" xmlns="http://www.w3.org/2000/svg">'
        + '<circle cx="60" cy="60" r="60"/>'
        + '</svg>';
    
    var style = new ol.style.Style({
      image: new ol.style.Icon({
        opacity: 1,
        src: 'data:image/svg+xml;utf8,' + svg,
        scale: 0.3
      })
    });
    

    A few differences from yours:

    • I added width and height attributes to the <svg>. This lets the browser know how big to make the resulting image.
    • I added a scale property to the icon to resize the image.
    • I used utf8 instead of base64 encoding (not significant).