使用html2canvas屏蔽MapBox会创建一个黑色的jpg

时间:2015-12-23 17:15:47

标签: javascript mapbox html2canvas

我设法使用html2canvas在我的硬盘上保存了使用Google Maps API生成的地图的屏幕截图。我现在尝试用MapBox API做同样的事情,而我在硬盘上的所有内容都是黑屏jpg。

这是我的HTML代码:

<!DOCTYPE html>
<html>
    <head>
        <link rel="stylesheet" href="css/main.css">
        <script src='https://api.tiles.mapbox.com/mapbox-gl-js/v0.12.2/mapbox-gl.js'></script>
        <script src="js/html2canvas.js"></script>
    </head>

    <body onload="initialize()">
        <div id="map"></div>
        <script src="js/coordinates.js"></script>
    </body>
</html>

使用此CSS全屏显示:

html { height: 100%; }
body { height: 100%; margin: 0px; padding: 0px; }
#map_canvas { width: 100%; height: 100%; }

这个JS脚本用于创建地图并截取屏幕截图:

mapboxgl.accessToken = 'pk.eyJ1IjoiZ2luZ2FsYWJ2IiwiYSI6ImNpaWluNXIzbDAwMjB3ZG02c2hmNGhhMnUifQ.5SC9qnrK7eEdAtwv5Z0S_Q';

var latitude = 48.858565;
var longitude = 2.347198;

function initialize()
{
    var map = new mapboxgl.Map(
    {
        container: 'map',
        style: 'mapbox://styles/mapbox/dark-v8',
        center: [2.347198, 48.858565],
        zoom: 16,
        pitch: 35
    });

    setTimeout(screenshot, 1000);
}

function screenshot()
{
    html2canvas(document.body,
    {
        useCORS: true,
        onrendered: function(canvas)
        {
            var image = document.createElement('a');
            image.href = canvas.toDataURL("image/jpeg").replace("image/jpeg", "image/octet-stream");
            image.download = 'map.jpg';
            image.click();
        }
    });
}

我使用一秒超时来确保在拍摄截图之前已经很好地创建了地图。为了确保是这种情况,我甚至在我的DOM中创建了一个按钮,在单击时调用了screenshot()函数,所以我确信渲染时间不是问题。

我在这里读过:Print Mapbox/Leaflet Map由于某种固定的布局,html2canvas无法正确打印地图。我想知道为什么它曾经用于谷歌地图地图,但没关系。你对此有什么想法吗?

2 个答案:

答案 0 :(得分:2)

Mapbox内置了截图api:

https://www.mapbox.com/mapbox.js/example/v1.0.0/leaflet-image/

或通过mapboxgl抓取画布数据到图像,您需要设置# Installing as Ruby gem $ gem install awesome_print # Cloning the repository $ git clone git://github.com/michaeldv/awesome_print.git 选项才能使用此功能默认情况下已关闭...请参阅https://www.mapbox.com/mapbox-gl-js/api/#Map

preserveDrawingBuffer

答案 1 :(得分:1)

确保在地图初始化

中将savedrawingbuffer设置为true
var map = new mapboxgl.Map({
    container: 'map', // container id
    style: 'mapbox://styles/mapbox/streets-v10', //hosted style id
    center: [-98.5795, 39.8282], // starting position
    zoom: 8, // starting zoom,
    preserveDrawingBuffer: true
});

我使用了html2canvas和这个函数

$(function() { 
  $("#btnSave").click(function() { 
      html2canvas(document.body, {
          onrendered: function(canvas) {
              return Canvas2Image.saveAsPNG(canvas);
          }
      });
  })
});