nakarte

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

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