Openlayers中图片导出功能实现及可能存在的问题


openlayers v4.6.5给出的例子

//引用FileSaver.js
<script src="https://cdnjs.cloudflare.com/ajax/libs/FileSaver.js/1.3.3/FileSaver.min.js"></script>

//添加导出按钮
<a id="export-png" class="btn btn-default"><i class="fa fa-download"></i> Download PNG</a>


<script>
//单击事件
document.getElementById('export-png').addEventListener('click', function() {
        map.once('postcompose', function(event) {
          //获取map中的canvas,并转换为图片
          var canvas = event.context.canvas;
          if (navigator.msSaveBlob) {
            navigator.msSaveBlob(canvas.msToBlob(), 'map.png');
          } else {
            canvas.toBlob(function(blob) {
              saveAs(blob, 'map.png');
            });
          }
        });
        map.renderSync();
      });
</script>

Layer中默认加载的是

new ol.layer.Tile({
   source: new ol.source.OSM()
 })

当我们换成天地图等其他地图时,如

new ol.layer.Tile({
   source: new ol.source.XYZ({
       url: "http://t1.tianditu.com/DataServer?T=vec_w&x={x}&y={y}&l={z}"
         }),
     })

会出现错误
SecurityError: The operation is insecure.

原因是:canvas导出图片时,涉及到跨域的问题,而osm.js文件中crossOrigins设置为“anonymous”
这里写图片描述
而xyz.js文件中未设置,因此在添加图层及数据源时,需手动设置。

new ol.layer.Tile({
   source: new ol.source.XYZ({
       //设置crossOrigin
       crossOrigin:'anonymous',
       url: "http://t1.tianditu.com/DataServer?T=vec_w&x={x}&y={y}&l={z}"
         }),
     })

注意1:添加多个图层时,只要有一个涉及跨域问题,就会报错,导出图片不成功
注意2:添加其他数据源,未显示在地图的原因,若原因是跨域导致,也是未设置crossOrigin导致

转载自:https://blog.csdn.net/u013240519/article/details/81330021

You may also like...