5

我想为我的 Openlayers 地图创建一个打印按钮,它可以抓取地图图像并创建一个漂亮的图像文件。我试过http://dev.openlayers.org/sandbox/camptocamp/canvas/openlayers/examples/exportMapCanvas.html 但它看起来像是实验性的。我还查看了http://trac.osgeo.org/openlayers/wiki/Printing 但我不希望涉及任何服务器。我还检查了http://html2canvas.hertzen.com/但无法让它工作。我收到以下错误,Uncaught TypeError: Cannot read property 'images' of undefined, html2canvas.js

<button onclick="printFunction()">Click me</button>

function printFunction() {

        html2canvas(('#map'), {
            onrendered: function (canvas) {
                var img = canvas.toDataURL("image/png")
                window.open(img);
            }
        });
    };
4

3 回答 3

2

尝试

function printFunction() {

    html2canvas(document.getElementById("map"), {
        onrendered: function (canvas) {
            var img = canvas.toDataURL("image/png")
            window.open(img);
        }
    });

这对我有用。主题标签标识仅适用于 jQuery,我花了一段时间才弄清楚 :-)

不过有一个小问题。html2canvas 没有渲染背景 WMS 图层 - 只有地图窗口和标记,所以仍然需要进行一些调整。

更新:我对此做了一些摆弄,我认为它不适用于 openlayers。由于 openlayers 地图是由许多 div 组成的,因此 html2canvas 似乎无法正确绘制所有这些。特别是 WMS 图层,当尝试自行绘制时,会返回错误。您可以尝试在地图中渲染其中一个子 div,但这对我不起作用。虽然,如果您只使用简单的矢量图形,它可以为您工作。

于 2013-09-03T08:30:05.087 回答
1

好的,我现在已经花了几个小时来解决这个问题,我想出的最好的方法是对@Kenny806 的答案进行了改进,基本上就是这个

它似乎确实选择了 WMS 和 Vector 层:

    function exportMap() {

        var mapElem = document.getElementById('map'); // the id of your map div here

        // html2canvas not able to render css transformations (the container holding the image tiles uses a transform)
        // so we determine the values of the transform, and then apply them to TOP and LEFT 
        var transform=$(".gm-style>div:first>div").css("transform");
        var comp=transform.split(","); //split up the transform matrix
        var mapleft=parseFloat(comp[4]); //get left value
        var maptop=parseFloat(comp[5]);  //get top value
        $(".gm-style>div:first>div").css({ //get the map container. not sure if stable
          "transform":"none",
          "left":mapleft,
          "top":maptop,
        });

        html2canvas(mapElem, {
          useCORS: true,
          onrendered: function(canvas) {
             mapImg = canvas.toDataURL('image/png');

            // reset the map to original styling
            $(".gm-style>div:first>div").css({
              left:0,
              top:0,
              "transform":transform
            });

            // do something here with your mapImg
            // e.g. I then use the dataURL in a pdf using jsPDF...
            // createPDFObject();
          }
        });
    }

笔记

  • 仅在 Chrome 和 Firefox 上测试
  • 这是一个 hacky 解决方案(不幸的是,我正在努力为我的情况寻找其他选择)
  • 如果您可以选择使用 Openlayers 3,似乎有更好的画布支持,而且我还看到了一个令人信服的 toBlob 示例:http ://codepen.io/barbalex/pen/raagKq
于 2015-05-28T00:53:25.463 回答
0

WMS 绘图工作正常,但您必须实现一个代理以使用 AJAX 下载 WMS 切片。有关“代理”(不是 http 代理)的实现细节,请参见 html2canvas 的 PHP 代理示例。

于 2014-03-17T14:56:07.660 回答