/**
* @description: 将地图canvas及上面的entity转换为bolb对象
* @param: viewer地图对象
*/
export function captureScreenshot(viewer) {
const { when } = Cesium;
const deferred = when.defer();
const scene = viewer.scene;
var removeCallback = scene.postRender.addEventListener(function() {
removeCallback();
try {
const cesiumCanvas = viewer.scene.canvas;
// If we're using the splitter, draw the split position as a vertical white line.
let canvas = cesiumCanvas;
canvas.toBlob(function(blod) {
deferred.resolve(blod);
}, "image/png");
// deferred.resolve(canvas.toDataURL("image/png"));
} catch (e) {
deferred.reject(e);
}
}, this);
scene.render(viewer.clock.currentTime);
return deferred.promise;
}
/**
* @description: 将bolb对象导出为图片
* @param: blob对象
* @param: filename文件名
*/
export function saveAs(blob, filename) {
if (blob === null) {
return;
}
if (window.navigator.msSaveOrOpenBlob) {
navigator.msSaveBlob(blob, filename);
} else {
const target = document.createElement("a");
const body = document.querySelector("body");
target.href = window.URL.createObjectURL(blob);
target.download = filename;
target.style.display = "none";
body.appendChild(target);
target.click();
body.removeChild(target);
window.URL.revokeObjectURL(target.href);
}
}
调用以上方法实现场景出图
const $promise = captureScreenshot(viewer);
if ($promise) {
$promise.then((blob) => {
// 获取地图数据
blob && saveAs(blob, `${Date.now()}.png`);
});
}
实现效果: