Fix freeze on export PDF example

The PDF was only generated AFTER requesting new tiles. When no new tiles where needed,
the callback never completed. Also fixed fitting the correct extent.

Fixes #7830.
This commit is contained in:
Erik Timmers
2018-03-18 12:20:51 +01:00
parent 502482a2b9
commit b5d02dad47
+41 -26
View File
@@ -5,6 +5,7 @@ import {defaults as defaultControls} from '../src/ol/control.js';
import WKT from '../src/ol/format/WKT.js'; import WKT from '../src/ol/format/WKT.js';
import TileLayer from '../src/ol/layer/Tile.js'; import TileLayer from '../src/ol/layer/Tile.js';
import VectorLayer from '../src/ol/layer/Vector.js'; import VectorLayer from '../src/ol/layer/Vector.js';
import {unByKey} from '../src/ol/Observable.js';
import OSM from '../src/ol/source/OSM.js'; import OSM from '../src/ol/source/OSM.js';
import VectorSource from '../src/ol/source/Vector.js'; import VectorSource from '../src/ol/source/Vector.js';
@@ -74,37 +75,51 @@ exportButton.addEventListener('click', function() {
++loading; ++loading;
}; };
function tileLoadEnd() { let timer;
++loaded; let keys = [];
if (loading === loaded) {
const canvas = this; function tileLoadEndFactory(canvas) {
window.setTimeout(function() { return () => {
loading = 0; ++loaded;
loaded = 0; if (timer) {
const data = canvas.toDataURL('image/png'); clearTimeout(timer);
const pdf = new jsPDF('landscape', undefined, format); timer = null;
pdf.addImage(data, 'JPEG', 0, 0, dim[0], dim[1]); }
pdf.save('map.pdf'); if (loading === loaded) {
source.un('tileloadstart', tileLoadStart); timer = window.setTimeout(() => {
source.un('tileloadend', tileLoadEnd, canvas); loading = 0;
source.un('tileloaderror', tileLoadEnd, canvas); loaded = 0;
map.setSize(size); const data = canvas.toDataURL('image/jpeg');
map.getView().fit(extent); const pdf = new jsPDF('landscape', undefined, format);
map.renderSync(); pdf.addImage(data, 'JPEG', 0, 0, dim[0], dim[1]);
exportButton.disabled = false; pdf.save('map.pdf');
document.body.style.cursor = 'auto'; keys.forEach(unByKey);
}, 100); keys = [];
} map.setSize(size);
map.getView().fit(extent, {size});
map.renderSync();
exportButton.disabled = false;
document.body.style.cursor = 'auto';
}, 500);
}
};
} }
map.once('postcompose', function(event) { map.once('postcompose', function(event) {
source.on('tileloadstart', tileLoadStart); const canvas = event.context.canvas;
source.on('tileloadend', tileLoadEnd, event.context.canvas); const tileLoadEnd = tileLoadEndFactory(canvas);
source.on('tileloaderror', tileLoadEnd, event.context.canvas); keys = [
source.on('tileloadstart', tileLoadStart),
source.on('tileloadend', tileLoadEnd),
source.on('tileloaderror', tileLoadEnd)
];
tileLoadEnd();
}); });
map.setSize([width, height]); const printSize = [width, height];
map.getView().fit(extent); map.setSize(printSize);
map.getView().fit(extent, {size: printSize});
loaded = -1;
map.renderSync(); map.renderSync();
}, false); }, false);