TileLayer.js (4398B)
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) => ({ 44 image, 45 tilePos, 46 tileSize, 47 latLngBounds, 48 tileScale: (image && (image.width > this.getTileSize().x)) ? 2 : 1, 49 })), 50 abortLoading 51 }; 52 } 53 } 54 }).bind(this); 55 return { 56 iterateTilePromises: tilePromiseIterator, 57 count: (tileRange.max.x - tileRange.min.x + 1) * (tileRange.max.y - tileRange.min.y + 1) 58 }; 59 } 60 }; 61 62 const TileLayerGrabMixin = L.Util.extend({}, GridLayerGrabMixin, { 63 cloneForPrint: function(options) { 64 return L.tileLayer(this._url, L.Util.extend({}, this.options, options)); 65 }, 66 67 tileImagePromiseFromCoords: function(coords, printOptions) { 68 let {xhrOptions} = printOptions; 69 let url = this.getTileUrl(coords); 70 if (!url) { 71 return {tilePromise: Promise.resolve(null), abortLoading: noop}; 72 } 73 if (this.options.noCors) { 74 url = urlViaCorsProxy(url); 75 } 76 let promise = this.options.xhrQueue.put(url, xhrOptions); 77 78 return { 79 tilePromise: printOptions.rawData ? promise : promise.then(imgFromDataString), 80 abortLoading: () => promise.abort() 81 }; 82 } 83 } 84 ); 85 86 // CanvasLayerGrabMixin has been deleted 87 88 const TileLayerWithCutlineGrabMixin = L.Util.extend({}, TileLayerGrabMixin, { 89 waitTilesReadyToGrab: function() { 90 return TileLayerGrabMixin.waitTilesReadyToGrab.call(this).then(() => this._cutlinePromise); 91 }, 92 93 tileImagePromiseFromCoords: function(coords, printOptions) { 94 const result = TileLayerGrabMixin.tileImagePromiseFromCoords.call(this, coords, printOptions); 95 if (!printOptions.rawData && this._cutlinePromise && this.isCutlineIntersectingTile(coords, true)) { 96 result.tilePromise = result.tilePromise.then((img) => { 97 if (!img) { 98 return img; 99 } 100 const clipped = document.createElement('canvas'); 101 return new Promise((resolve) => { 102 this._drawTileClippedByCutline(coords, img, clipped, () => resolve(clipped)); 103 }); 104 }); 105 } 106 return result; 107 } 108 }); 109 110 L.TileLayer.include(TileLayerWithCutlineGrabMixin);
