nakarte

Source code of https://map.sikmir.ru (fork)
git clone git://git.sikmir.ru/nakarte
Log | Files | Refs | LICENSE

TileLayer.js (4161B)


      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);