How can I use a SVG image as layer on OpenLayers-3

Matthijs picture Matthijs · Dec 22, 2015 · Viewed 12.4k times · Source

How can I use a SVG image as a Layer (so not as a map marker) with OpenLayers-3

I was unable to get any output of my SVG image when using any of the ol.source.Vector and ol.format.Feature instances.

Small example:

var mapLayer = new ol.layer.Vector({
    source: new ol.source.Vector({
        url: 'image.svg',
        format: new ol.format.Feature() // http://openlayers.org/en/v3.12.1/apidoc/ol.format.Feature.html
    }),
}); 

I was able to get output when using the ImageStatic layer, but this uses/generates(?) a static image so the advantages of SVG are gone.

Example:

// Not sure if I need this for SVG, but is is required for an image
var extent = [0, 0, 1000, 1000]; // random image size
var projection = new ol.proj.Projection({
    code: 'test',
    units: 'pixels',
    extent: extent
});

var mapLayer = new ol.layer.Image({
    source: new ol.source.ImageStatic({
        url: 'image.svg',
        projection: projection,
        imageExtent: extent
    })
});

I already tried the trick with setting the Content-type: to image/svg+xml but this did not help me at all.

So, again: How can I (if possible) use a SVG image a a layer with OpenLayers-3?

Answer

Alvin Lindstam picture Alvin Lindstam · Mar 23, 2016

You can not use the ol.source.Vector with svg files, but OL3 can display svg files as images.

The image stays sharp when zoomed.

I modified the official static image example, and replaced the png file with a svg file. See the runnable example below.

var extent = [0, 0, 512, 512];
var projection = new ol.proj.Projection({
  code: 'static-image',
  units: 'pixels',
  extent: extent
});

var map = new ol.Map({
  layers: [
    new ol.layer.Image({
      source: new ol.source.ImageStatic({
        url: 'https://upload.wikimedia.org/wikipedia/commons/f/fd/Ghostscript_Tiger.svg',
        projection: projection,
        imageExtent: extent
      })
    })
  ],
  target: 'map',
  view: new ol.View({
    projection: projection,
    center: ol.extent.getCenter(extent),
    zoom: 0
  })
});
<script src="https://cdn.rawgit.com/openlayers/openlayers.github.io/master/en/v5.3.0/build/ol.js"></script>
<link href="https://cdn.rawgit.com/openlayers/openlayers.github.io/master/en/v5.3.0/css/ol.css" rel="stylesheet"/>
<div id="map" class="map"></div>