Я объединил html2canvas с OpenLayers вер. 6.1.1, чтобы предоставить, как я надеюсь, лучший пример экспорта в PNG.
Я попытался включить пример, показанный на сайте OpenLayers, в свое приложение, но это не работает во всех браузерах (особенно Safari).
<script type='text/javascript' src='javascript/html2canvas.min.js'></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/FileSaver.js/1.3.3/FileSaver.min.js"></script>
<script src="https://cdn.polyfill.io/v2/polyfill.min.js?features=fetch,requestAnimationFrame,Element.prototype.classList,URL,Promise"></script>
Используя эти библиотеки javascript и текущую версию OpenLayers (6.1.1), я добавил кнопку, отображаемую на моемкарта, которая имеет следующую функцию:
var button_p = document.createElement('button');
button_p.innerHTML = 'PNG';
button_p.title = 'Export map as png.';
var pngfunction = function() {
map.once('rendercomplete', function(event) {
html2canvas(document.getElementById('map')).then(function(canvas) {
var ctx = canvas.getContext("2d");
var now = new Date();
var monthy = now.getMonth() + 1; // remember months are stored in array numbered 0-11
ctx.fillStyle = "#0000FF";
ctx.font = "12px Arial";
ctx.fillText(monthy + "-" + now.getDate() + "-" + now.getFullYear() + " " + now.getHours() + ":" + (now.getMinutes() < 10 ? '0' : '') + now.getMinutes() + ":" + (now.getSeconds() < 10 ? '0' : '') + now.getSeconds(), 10, 20);
if (navigator.msSaveBlob) {
navigator.msSaveBlob(canvas.msToBlob(), 'map.png');
} else {
canvas.toBlob(function(blob) {
saveAs(blob, 'map.png');
});
}
});
});
map.renderSync();
};
button_p.addEventListener('click', pngfunction, false);
Так как эта кнопка является частью класса 'ol-control', и я не хочу, чтобы эти элементы управления были частью результирующего PNG, я округляю эти элементыи примените следующий код, который удаляет эти элементы управления из PNG:
var removals = document.getElementsByClassName('ol-control');
for(var i=0; i < removals.length; i++) { removals[i].setAttribute('data-html2canvas-ignore','true'); }
Но так как я хочу видеть стрелку севера, я удаляю этот атрибут, который я только что добавил к этому элементу управления, используя следующее:
document.getElementsByClassName('ol-rotate')[0].removeAttribute('data-html2canvas-ignore');