![](/img/trans.png)
[英]Mapbox GL JS : How to add a canvas, and get data from it? (Weather Map)
[英]How to get usable canvas from Mapbox GL JS
我正在使用Mapbox GL ,并尝试获取它的快照,并将快照与覆盖输出的另一个图像合并。
我在屏幕外有一个HTMLCanvasElement
,我首先将从Map.getCanvas()
返回的画布写入它,然后在其上写入第二个(alpha 透明)画布。
问题是,虽然我在 Map 实例中清楚地看到屏幕上的元素,但结果只显示了第二个图像/画布,其余的都是空白的。
所以我只导出地图的画布,我看到这是因为地图画布是空白的,尽管console.log()
显示来自它的图像数据是一大块信息。
这是我的导出功能:
onExport(annotationCanvas: HTMLCanvasElement) {
const mergeCanvas: HTMLCanvasElement = document.createElement('canvas');
const mapCanvas: HTMLCanvasElement = this.host.map.getCanvas();
const mergeCtx: CanvasRenderingContext2D = mergeCanvas.getContext('2d');
mergeCanvas.height = annotationCanvas.height;
mergeCanvas.width = annotationCanvas.width;
mergeCtx.drawImage(mapCanvas, 0, 0);
mergeCtx.drawImage(annotationCanvas, 0, 0);
const mergedDataURL = mergeCanvas.toDataURL();
const mapDataURL = mapCanvas.toDataURL();
const annotationDataURL = annotationCanvas.toDataURL();
console.log(mapDataURL); // Lots of data
download(mapDataURL, 'map-data-only.png'); // Blank image @ 1920x1080
download(mergedDataURL, 'annotation.png'); // Only shows annotation (the second layer/canvas) data
}
这是一个错误,还是我错过了什么?
更新:我有点想通了这是关于什么的,并且有可能的选择。
在偶然发现Mapbox 功能请求时,我了解到,如果您在将preserveDrawingBuffer
选项设置为false
(默认值)的情况下实例化您的Map
,您将无法获得带有可用图像数据的画布。 但是将此选项设置为true
会降低性能。 但是在实例化 Map 后您无法更改此设置...
我希望地图尽可能发挥最佳性能!!!!
所以,在这个我偶然发现的答案中,关于一个关于three.js的问题,我了解到如果我在渲染后立即截取屏幕截图,我将获得我需要的画布/数据。
我尝试在捕获画布之前调用this.host.map['_rerender']()
,但它仍然返回空白。
然后在源代码中搜索,我找到了一个名为_requestRenderFrame
的函数,看起来它可能是我需要的,因为我可以要求 Map 在下一个渲染周期后立即运行一个函数。 但是当我发现,出于某种原因,该函数在编译代码中被省略,而在源代码中存在,显然是因为它只存在于 master 中,而不是发布的一部分。
所以我还没有真正满意的解决方案,所以请让我知道任何见解。
正如您在更新的问题中提到的,解决方案是在 Map 初始化时设置preserveDrawingBuffer: true
。
为了回答你更新的问题,我认为@jfirebaugh 在https://github.com/mapbox/mapbox-gl-js/issues/6448#issuecomment-378307311的回答总结得很好:
不能即时修改
preserveDrawingBuffer
。 它必须在创建 WebGL 上下文时设置,这会对性能产生负面影响。有传言说,您可以在渲染后立即获取画布数据 URL,而无需
preserveDrawingBuffer
,但我尚未验证这一点,我怀疑规范无法保证这一点。
因此,尽管可以在渲染后立即获取画布数据 URL,但规范并不能保证这一点。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.