TileLayer.js (4163B)
1 import L from 'leaflet'; 2 import {urlViaCorsProxy} from '~/lib/CORSProxy'; 3 import {imgFromDataString} from './imgFromDataString'; 4 5 function noop() { 6 // dummy function 7 } 8 9 const GridLayerGrabMixin = { 10 tileImagePromiseFromCoords: function(_unused_coords) { 11 throw new Error('Method not implemented'); 12 }, 13 14 waitTilesReadyToGrab: function() { 15 return Promise.resolve(null); 16 }, 17 18 getTilesInfo: async function(printOptions) { 19 await this.waitTilesReadyToGrab(); 20 const {pixelBounds} = printOptions; 21 const tileRange = this._pxBoundsToTileRange(pixelBounds); 22 const topLeft = pixelBounds.min; 23 const tilePromiseIterator = (function*() { 24 for (let j = tileRange.min.y; j <= tileRange.max.y; j++) { 25 for (let i = tileRange.min.x; i <= tileRange.max.x; i++) { 26 let coords = new L.Point(i, j); 27 coords.z = this._tileZoom; 28 if (!this._isValidTile(coords)) { 29 continue; 30 } 31 let tilePos = this._getTilePos(coords); 32 const coordsPlusOne = coords.add(L.point(1, 1)); 33 coordsPlusOne.z = coords.z; 34 const tilePlusOne = this._getTilePos(coordsPlusOne); 35 const tileSize = tilePlusOne.subtract(tilePos); 36 const latLngBounds = L.latLngBounds( 37 this._map.unproject(tilePos.add(this._level.origin)), 38 this._map.unproject(tilePlusOne.add(this._level.origin))); 39 tilePos = tilePos.add(this._level.origin).subtract(topLeft); 40 let {tilePromise, abortLoading} = this.tileImagePromiseFromCoords( 41 this._wrapCoords(coords), printOptions); 42 yield { 43 tilePromise: tilePromise.then((image) => ({image, tilePos, tileSize, latLngBounds})), 44 abortLoading 45 }; 46 } 47 } 48 }).bind(this); 49 return { 50 iterateTilePromises: tilePromiseIterator, 51 count: (tileRange.max.x - tileRange.min.x + 1) * (tileRange.max.y - tileRange.min.y + 1) 52 }; 53 } 54 }; 55 56 const TileLayerGrabMixin = L.Util.extend({}, GridLayerGrabMixin, { 57 cloneForPrint: function(options) { 58 return L.tileLayer(this._url, L.Util.extend({}, this.options, options)); 59 }, 60 61 tileImagePromiseFromCoords: function(coords, printOptions) { 62 let {xhrOptions} = printOptions; 63 let url = this.getTileUrl(coords); 64 if (!url) { 65 return {tilePromise: Promise.resolve(null), abortLoading: noop}; 66 } 67 if (this.options.noCors) { 68 url = urlViaCorsProxy(url); 69 } 70 let promise = this.options.xhrQueue.put(url, xhrOptions); 71 72 return { 73 tilePromise: printOptions.rawData ? promise : promise.then(imgFromDataString), 74 abortLoading: () => promise.abort() 75 }; 76 } 77 } 78 ); 79 80 // CanvasLayerGrabMixin has been deleted 81 82 const TileLayerWithCutlineGrabMixin = L.Util.extend({}, TileLayerGrabMixin, { 83 waitTilesReadyToGrab: function() { 84 return TileLayerGrabMixin.waitTilesReadyToGrab.call(this).then(() => this._cutlinePromise); 85 }, 86 87 tileImagePromiseFromCoords: function(coords, printOptions) { 88 const result = TileLayerGrabMixin.tileImagePromiseFromCoords.call(this, coords, printOptions); 89 if (!printOptions.rawData && this._cutlinePromise && this.isCutlineIntersectingTile(coords, true)) { 90 result.tilePromise = result.tilePromise.then((img) => { 91 if (!img) { 92 return img; 93 } 94 const clipped = document.createElement('canvas'); 95 return new Promise((resolve) => { 96 this._drawTileClippedByCutline(coords, img, clipped, () => resolve(clipped)); 97 }); 98 }); 99 } 100 return result; 101 } 102 }); 103 104 L.TileLayer.include(TileLayerWithCutlineGrabMixin);