在OpenLayers中使用SVG图标作为标记

Ale*_*jeu 3 svg styles openlayers marker

我试图在Openlayers-3中将svg图标作为标记.在我的代码中.

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)
            })
        });
Run Code Online (Sandbox Code Playgroud)

但我的svg图像被截断,如下图所示.(图标应为圆圈)

在此输入图像描述

Tim*_*aub 9

这是一个在图标符号化器中显示内联SVG的示例:http://jsfiddle.net/eze84su3/

这是相关代码:

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
  })
});
Run Code Online (Sandbox Code Playgroud)

与您的一些差异:

  • 我添加widthheight归属于<svg>.这样浏览器就可以知道生成图像的大小.
  • scale在图标中添加了一个属性来调整图像大小.
  • 我用utf8而不是base64编码(不重要).

  • 这可行,但有一些注意事项,因为浏览器往往会对 SVG 中使用的某些字符(例如双引号、换行符和空格)产生问题。我发现更可靠的方法是首先将 SVG 转换为 Base64(使用“window.btoa”),然后将其包含为“data:image/svg+xml;base64,”,然后是 Base 64 编码图像。 (4认同)