New file |
0,0 → 1,157 |
/* |
* L.TileLayer is used for standard xyz-numbered tile layers. |
*/ |
//(function (ymaps, L) { |
|
L.Yandex = L.Class.extend({ |
includes: L.Mixin.Events, |
|
options: { |
minZoom: 0, |
maxZoom: 18, |
attribution: '', |
opacity: 1, |
traffic: false |
}, |
|
// Possible types: map, satellite, hybrid, publicMap, publicMapHybrid |
initialize: function(type, options) { |
L.Util.setOptions(this, options); |
|
this._type = "yandex#" + (type || 'map'); |
}, |
|
onAdd: function(map, insertAtTheBottom) { |
this._map = map; |
this._insertAtTheBottom = insertAtTheBottom; |
|
// create a container div for tiles |
this._initContainer(); |
this._initMapObject(); |
|
// set up events |
map.on('viewreset', this._resetCallback, this); |
|
this._limitedUpdate = L.Util.limitExecByInterval(this._update, 150, this); |
map.on('move', this._update, this); |
|
map._controlCorners['bottomright'].style.marginBottom = "3em"; |
|
this._reset(); |
this._update(true); |
}, |
|
onRemove: function(map) { |
this._map._container.removeChild(this._container); |
|
this._map.off('viewreset', this._resetCallback, this); |
|
this._map.off('move', this._update, this); |
|
map._controlCorners['bottomright'].style.marginBottom = "0em"; |
}, |
|
getAttribution: function() { |
return this.options.attribution; |
}, |
|
setOpacity: function(opacity) { |
this.options.opacity = opacity; |
if (opacity < 1) { |
L.DomUtil.setOpacity(this._container, opacity); |
} |
}, |
|
setElementSize: function(e, size) { |
e.style.width = size.x + "px"; |
e.style.height = size.y + "px"; |
}, |
|
_initContainer: function() { |
var tilePane = this._map._container, |
first = tilePane.firstChild; |
|
if (!this._container) { |
this._container = L.DomUtil.create('div', 'leaflet-yandex-layer leaflet-top leaflet-left'); |
this._container.id = "_YMapContainer_" + L.Util.stamp(this); |
this._container.style.zIndex = "auto"; |
} |
|
if (this.options.overlay) { |
first = this._map._container.getElementsByClassName('leaflet-map-pane')[0]; |
first = first.nextSibling; |
// XXX: Bug with layer order |
if (L.Browser.opera) |
this._container.className += " leaflet-objects-pane"; |
} |
tilePane.insertBefore(this._container, first); |
|
this.setOpacity(this.options.opacity); |
this.setElementSize(this._container, this._map.getSize()); |
}, |
|
_initMapObject: function() { |
if (this._yandex) return; |
|
// Check that ymaps.Map is ready |
if (ymaps.Map === undefined) { |
console.debug("L.Yandex: Waiting on ymaps.load('package.map')"); |
return ymaps.load(["package.map"], this._initMapObject, this); |
} |
|
// If traffic layer is requested check if control.TrafficControl is ready |
if (this.options.traffic) |
if (ymaps.control === undefined || |
ymaps.control.TrafficControl === undefined) { |
console.debug("L.Yandex: loading traffic and controls"); |
return ymaps.load(["package.traffic", "package.controls"], |
this._initMapObject, this); |
} |
|
var map = new ymaps.Map(this._container, {center: [0,0], zoom: 0, behaviors: []}); |
|
if (this.options.traffic) |
map.controls.add(new ymaps.control.TrafficControl({shown: true})); |
|
if (this._type == "yandex#null") { |
this._type = new ymaps.MapType("null", []); |
map.container.getElement().style.background = "transparent"; |
} |
map.setType(this._type) |
|
this._yandex = map; |
this._update(true); |
}, |
|
_resetCallback: function(e) { |
this._reset(e.hard); |
}, |
|
_reset: function(clearOldContainer) { |
this._initContainer(); |
}, |
|
_update: function(force) { |
if (!this._yandex) return; |
this._resize(force); |
|
var center = this._map.getCenter(); |
var _center = [center.lat, center.lng]; |
var zoom = this._map.getZoom(); |
|
if (force || this._yandex.getZoom() != zoom) |
this._yandex.setZoom(zoom); |
this._yandex.panTo(_center, {duration: 0, delay: 0}); |
}, |
|
_resize: function(force) { |
var size = this._map.getSize(), style = this._container.style; |
if (style.width == size.x + "px" && |
style.height == size.y + "px") |
if (force != true) return; |
this.setElementSize(this._container, size); |
var b = this._map.getBounds(), sw = b.getSouthWest(), ne = b.getNorthEast(); |
this._yandex.container.fitToViewport(); |
} |
}); |
//})(ymaps, L) |