JAVASCRIPT 26
Yandex.js Guest on 1st May 2021 03:42:28 PM
  1. /*
  2.  * L.TileLayer is used for standard xyz-numbered tile layers.
  3.  */
  4.  
  5. /* global ymaps: true */
  6.  
  7. L.Yandex = L.Layer.extend({
  8.       includes: L.Mixin.Events,
  9.  
  10.       options: {
  11.             minZoom: 0,
  12.             maxZoom: 18,
  13.             attribution: '',
  14.             opacity: 1,
  15.             traffic: false
  16.       },
  17.  
  18.       possibleShortMapTypes: {
  19.             schemaMap: 'map',
  20.             satelliteMap: 'satellite',
  21.             hybridMap: 'hybrid',
  22.             publicMap: 'publicMap',
  23.             publicMapInHybridView: 'publicMapHybrid'
  24.       },
  25.      
  26.       _getPossibleMapType: function (mapType) {
  27.             var result = 'yandex#map';
  28.             if (typeof mapType !== 'string') {
  29.                   return result;
  30.             }
  31.             for (var key in this.possibleShortMapTypes) {
  32.                   if (mapType === this.possibleShortMapTypes[key]) {
  33.                         result = 'yandex#' + mapType;
  34.                         break;
  35.                   }
  36.                   if (mapType === ('yandex#' + this.possibleShortMapTypes[key])) {
  37.                         result = mapType;
  38.                   }
  39.             }
  40.             return result;
  41.       },
  42.      
  43.       // Possible types: yandex#map, yandex#satellite, yandex#hybrid, yandex#publicMap, yandex#publicMapHybrid
  44.       // Or their short names: map, satellite, hybrid, publicMap, publicMapHybrid
  45.       initialize: function (type, options) {
  46.             L.Util.setOptions(this, options);
  47.             //Assigning an initial map type for the Yandex layer
  48.             this._type = this._getPossibleMapType(type);
  49.       },
  50.  
  51.       onAdd: function (map, insertAtTheBottom) {
  52.             this._map = map;
  53.             this._insertAtTheBottom = insertAtTheBottom;
  54.  
  55.             // create a container div for tiles
  56.             this._initContainer();
  57.             this._initMapObject();
  58.  
  59.             // set up events
  60.             map.on('viewreset', this._reset, this);
  61.  
  62.             this._limitedUpdate = L.Util.throttle(this._update, 150, this);
  63.             map.on('move', this._update, this);
  64.  
  65.             map._controlCorners.bottomright.style.marginBottom = '3em';
  66.  
  67.             this._reset();
  68.             this._update(true);
  69.       },
  70.  
  71.       onRemove: function (map) {
  72.             this._map._container.removeChild(this._container);
  73.  
  74.             this._map.off('viewreset', this._reset, this);
  75.  
  76.             this._map.off('move', this._update, this);
  77.  
  78.             map._controlCorners.bottomright.style.marginBottom = '0em';
  79.       },
  80.  
  81.       getAttribution: function () {
  82.             return this.options.attribution;
  83.       },
  84.  
  85.       setOpacity: function (opacity) {
  86.             this.options.opacity = opacity;
  87.             if (opacity < 1) {
  88.                   L.DomUtil.setOpacity(this._container, opacity);
  89.             }
  90.       },
  91.  
  92.       setElementSize: function (e, size) {
  93.             e.style.width = size.x + 'px';
  94.             e.style.height = size.y + 'px';
  95.       },
  96.  
  97.       _initContainer: function () {
  98.             var tilePane = this._map._container,
  99.                   first = tilePane.firstChild;
  100.  
  101.             if (!this._container) {
  102.                   this._container = L.DomUtil.create('div', 'leaflet-yandex-layer');
  103.                   this._container.id = '_YMapContainer_' + L.Util.stamp(this);
  104.                   this._container.style.zIndex = 'auto';
  105.             }
  106.  
  107.             if (this.options.overlay) {
  108.                   first = this._map._container.getElementsByClassName('leaflet-map-pane')[0];
  109.                   first = first.nextSibling;
  110.                   // XXX: Bug with layer order
  111.                   if (L.Browser.opera)
  112.                         this._container.className += ' leaflet-objects-pane';
  113.             }
  114.             tilePane.insertBefore(this._container, first);
  115.  
  116.             this.setOpacity(this.options.opacity);
  117.             this.setElementSize(this._container, this._map.getSize());
  118.       },
  119.  
  120.       _initMapObject: function () {
  121.             if (this._yandex) return;
  122.  
  123.             // Check that ymaps.Map is ready
  124.             if (ymaps.Map === undefined) {
  125.                   return ymaps.load(['package.map'], this._initMapObject, this);
  126.             }
  127.  
  128.             // If traffic layer is requested check if control.TrafficControl is ready
  129.             if (this.options.traffic)
  130.                   if (ymaps.control === undefined ||
  131.                               ymaps.control.TrafficControl === undefined) {
  132.                         return ymaps.load(['package.traffic', 'package.controls'],
  133.                               this._initMapObject, this);
  134.                   }
  135.             //Creating ymaps map-object without any default controls on it
  136.             var map = new ymaps.Map(this._container, {center: [0, 0], zoom: 0, behaviors: [], controls: []});
  137.  
  138.             if (this.options.traffic)
  139.                   map.controls.add(new ymaps.control.TrafficControl({shown: true}));
  140.  
  141.             if (this._type === 'yandex#null') {
  142.                   this._type = new ymaps.MapType('null', []);
  143.                   map.container.getElement().style.background = 'transparent';
  144.             }
  145.             map.setType(this._type);
  146.  
  147.             this._yandex = map;
  148.             this._update(true);
  149.            
  150.             //Reporting that map-object was initialized
  151.             this.fire('MapObjectInitialized', {mapObject: map});
  152.       },
  153.  
  154.       _reset: function () {
  155.             this._initContainer();
  156.       },
  157.  
  158.       _update: function (force) {
  159.             if (!this._yandex) return;
  160.             this._resize(force);
  161.  
  162.             var center = this._map.getCenter();
  163.             var _center = [center.lat, center.lng];
  164.             var zoom = this._map.getZoom();
  165.  
  166.             if (force || this._yandex.getZoom() !== zoom)
  167.                   this._yandex.setZoom(zoom);
  168.             this._yandex.panTo(_center, {duration: 0, delay: 0});
  169.       },
  170.  
  171.       _resize: function (force) {
  172.             var size = this._map.getSize(), style = this._container.style;
  173.             if (style.width === size.x + 'px' && style.height === size.y + 'px')
  174.                   if (force !== true) return;
  175.             this.setElementSize(this._container, size);
  176.             this._yandex.container.fitToViewport();
  177.       }
  178. });

Paste-bin is for source code and general debugging text.

Login or Register to edit, delete and keep track of your pastes and more.

Raw Paste

Login or Register to edit or fork this paste. It's free.