【问题标题】:how to export openlayer3 map to png with its scale bar using js如何使用js将openlayers 3地图导出为带有比例尺的png
【发布时间】:2017-06-07 22:33:39
【问题描述】:

我正在尝试使用 js 中的画布将 openlayer3 地图导出为 png。实际上地图 div 和比例尺 div 是不同的,所以在将地图导出到 png 时如何在同一个 png 上绘制比例尺及其图例。

【问题讨论】:

    标签: eclipse openlayers-3


    【解决方案1】:

    我们需要创建控件并从html中获取控件,然后add it to canvas这样

    InsertToCanvas = (function() {
     //get the canvas element
    var canvas = $('canvas').get(0); 
    //get the Scaleline div container the style-width property
    var olscale = $('.ol-scale-line-inner');  
    //Scaleline thicknes
    var line1 = 6;
    //Offset from the left
    var x_offset = 10;
    //offset from the bottom
    var y_offset = 30;
    var fontsize1 = 15;
    var font1 = fontsize1 + 'px Arial';
    // how big should the scale be (original css-width multiplied)
    var multiplier = 2;
    
     /* go for it */
    function WriteScaletoCanvas(e) {
    var ctx = e.context;
    var scalewidth = parseInt(olscale.css('width'),10)*multiplier;
    var scale = olscale.text();
    var scalenumber = parseInt(scale,10)*multiplier;
    var scaleunit = scale.match(/[Aa-zZ]{1,}/g);
    
    //Scale Text
    ctx.beginPath();
    ctx.textAlign = "left";
    ctx.strokeStyle = "#ffffff";
    ctx.fillStyle = "#000000";
    ctx.lineWidth = 5;
    ctx.font = font1;
    ctx.strokeText([scalenumber + ' ' + scaleunit], x_offset + fontsize1 / 2, canvas.height - y_offset - fontsize1 / 2);
    ctx.fillText([scalenumber + ' ' + scaleunit], x_offset + fontsize1 / 2,     canvas.height - y_offset - fontsize1 / 2);
    
    //Scale Dimensions
    var xzero = scalewidth + x_offset;
    var yzero = canvas.height - y_offset;
    var xfirst = x_offset + scalewidth * 1 / 4;
    var xsecond = xfirst + scalewidth * 1 / 4;
    var xthird = xsecond + scalewidth * 1 / 4;
    var xfourth = xthird + scalewidth * 1 / 4;
    
    // Stroke
    ctx.beginPath();
    ctx.lineWidth = line1 + 2;
    ctx.strokeStyle = "#000000";
    ctx.fillStyle = "#ffffff";
    ctx.moveTo(x_offset, yzero);
    ctx.lineTo(xzero + 1, yzero);
    ctx.stroke();
    
    //sections black/white
    ctx.beginPath();
    ctx.lineWidth = line1;
    ctx.strokeStyle = "#000000";
    ctx.moveTo(x_offset, yzero);
    ctx.lineTo(xfirst, yzero);
    ctx.stroke();
    
    ctx.beginPath();
    ctx.lineWidth = line1;
    ctx.strokeStyle = "#FFFFFF";
    ctx.moveTo(xfirst, yzero);
    ctx.lineTo(xsecond, yzero);
    ctx.stroke();
    
    ctx.beginPath();
    ctx.lineWidth = line1;
    ctx.strokeStyle = "#000000";
    ctx.moveTo(xsecond, yzero);
    ctx.lineTo(xthird, yzero);
    ctx.stroke();
    
    ctx.beginPath();
    ctx.lineWidth = line1;
    ctx.strokeStyle = "#FFFFFF";
    ctx.moveTo(xthird, yzero);
    ctx.lineTo(xfourth, yzero);
    ctx.stroke();
    }
    function postcompose() {
    map.on('postcompose', function (evt) {
        WriteScaletoCanvas(evt);
    });
    }
    
    return {
    postcompose : postcompose
    };
    })();
    
    InsertToCanvas.postcompose();
    
    //Now export map as png
    
       var exportMap = function () {
    
    
              canvas = document.getElementsByTagName('canvas')[0];
              canvas.toBlob(function (blob) {
                  alert("jsp page export map function"); 
                saveAs(blob, 'map.png');
              })
            }
    

    这样比例尺就会添加到 png 中。

    图例的第 2 步

      function WriteLegendtoCanvas(e) {  
        var ctx = e.context;
    
    
        var x=50,y=50;
        var arr = $('div#legendId img');
    
        for(i=0;i<arr.length;i++)
        {
    
          var img = new Image();
        img.src = $(arr[i]).attr('src');
        img.onload = function() { ctx.drawImage(img, x, y); }
        ctx.drawImage(img, x, y); 
        ctx.beginPath();
        ctx.lineWidth = line1;
        ctx.strokeStyle = "#FFFFFF";
        ctx.moveTo(x, y);
        y+=20;
        ctx.lineTo(x, y);
        ctx.stroke();
    
        }
    
            }
    

    然后用 postcompose 调用这个函数

        function postcompose() {
                map.on('postcompose', function (evt) {
                    WriteScaletoCanvas(evt);
                    WriteLegendtoCanvas(evt);
                });
            }
    

    【讨论】:

      猜你喜欢
      • 2022-01-01
      • 1970-01-01
      • 2020-11-16
      • 1970-01-01
      • 2017-07-17
      • 2019-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多