/trunk/widget/modules/carto/squelettes/scripts/layer/tile/Yandex.js |
---|
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) |
/trunk/widget/modules/carto/squelettes/scripts/layer/tile/Google.js |
---|
New file |
0,0 → 1,176 |
/* |
* Google layer using Google Maps API |
*/ |
//(function (google, L) { |
L.Google = L.Class.extend({ |
includes: L.Mixin.Events, |
options: { |
minZoom: 0, |
maxZoom: 18, |
tileSize: 256, |
subdomains: 'abc', |
errorTileUrl: '', |
attribution: '', |
opacity: 1, |
continuousWorld: false, |
noWrap: false |
}, |
// Possible types: SATELLITE, ROADMAP, HYBRID, TERRAIN |
initialize: function(type, options) { |
L.Util.setOptions(this, options); |
this._ready = google.maps.Map != undefined; |
if (!this._ready) L.Google.asyncWait.push(this); |
this._type = type || 'SATELLITE'; |
}, |
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.on('moveend', this._update, this); |
map._controlCorners['bottomright'].style.marginBottom = "1em"; |
this._reset(); |
this._update(); |
}, |
onRemove: function(map) { |
this._map._container.removeChild(this._container); |
//this._container = null; |
this._map.off('viewreset', this._resetCallback, this); |
this._map.off('move', this._update, this); |
map._controlCorners['bottomright'].style.marginBottom = "0em"; |
//this._map.off('moveend', this._update, this); |
}, |
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-google-layer leaflet-top leaflet-left'); |
this._container.id = "_GMapContainer_" + L.Util.stamp(this); |
this._container.style.zIndex = "auto"; |
} |
if (true) { |
tilePane.insertBefore(this._container, first); |
this.setOpacity(this.options.opacity); |
this.setElementSize(this._container, this._map.getSize()); |
} |
}, |
_initMapObject: function() { |
if (!this._ready) return; |
this._google_center = new google.maps.LatLng(0, 0); |
var map = new google.maps.Map(this._container, { |
center: this._google_center, |
zoom: 0, |
tilt: 0, |
mapTypeId: google.maps.MapTypeId[this._type], |
disableDefaultUI: true, |
keyboardShortcuts: false, |
draggable: false, |
disableDoubleClickZoom: true, |
scrollwheel: false, |
streetViewControl: false |
}); |
var _this = this; |
this._reposition = google.maps.event.addListenerOnce(map, "center_changed", |
function() { _this.onReposition(); }); |
map.backgroundColor = '#ff0000'; |
this._google = map; |
}, |
_resetCallback: function(e) { |
this._reset(e.hard); |
}, |
_reset: function(clearOldContainer) { |
this._initContainer(); |
}, |
_update: function() { |
if (!this._google) return; |
this._resize(); |
var bounds = this._map.getBounds(); |
var ne = bounds.getNorthEast(); |
var sw = bounds.getSouthWest(); |
var google_bounds = new google.maps.LatLngBounds( |
new google.maps.LatLng(sw.lat, sw.lng), |
new google.maps.LatLng(ne.lat, ne.lng) |
); |
var center = this._map.getCenter(); |
var _center = new google.maps.LatLng(center.lat, center.lng); |
this._google.setCenter(_center); |
this._google.setZoom(this._map.getZoom()); |
//this._google.fitBounds(google_bounds); |
}, |
_resize: function() { |
var size = this._map.getSize(); |
if (this._container.style.width == size.x && |
this._container.style.height == size.y) |
return; |
this.setElementSize(this._container, size); |
this.onReposition(); |
}, |
onReposition: function() { |
if (!this._google) return; |
google.maps.event.trigger(this._google, "resize"); |
} |
}); |
L.Google.asyncWait = []; |
L.Google.asyncInitialize = function() { |
var i; |
for (i = 0; i < L.Google.asyncWait.length; i++) { |
var o = L.Google.asyncWait[i]; |
o._ready = true; |
if (o._container) { |
o._initMapObject(); |
o._update(); |
} |
} |
L.Google.asyncWait = []; |
} |
//})(window.google, L) |
/trunk/widget/modules/carto/squelettes/scripts/layer/tile/Bing.js |
---|
New file |
0,0 → 1,117 |
L.BingLayer = L.TileLayer.extend({ |
options: { |
subdomains: [0, 1, 2, 3], |
type: 'Aerial', |
attribution: 'Bing', |
culture: '' |
}, |
initialize: function(key, options) { |
L.Util.setOptions(this, options); |
this._key = key; |
this._url = null; |
this.meta = {}; |
this.loadMetadata(); |
}, |
tile2quad: function(x, y, z) { |
var quad = ''; |
for (var i = z; i > 0; i--) { |
var digit = 0; |
var mask = 1 << (i - 1); |
if ((x & mask) != 0) digit += 1; |
if ((y & mask) != 0) digit += 2; |
quad = quad + digit; |
} |
return quad; |
}, |
getTileUrl: function(p, z) { |
var z = this._getZoomForUrl(); |
var subdomains = this.options.subdomains, |
s = this.options.subdomains[Math.abs((p.x + p.y) % subdomains.length)]; |
return this._url.replace('{subdomain}', s) |
.replace('{quadkey}', this.tile2quad(p.x, p.y, z)) |
.replace('{culture}', this.options.culture); |
}, |
loadMetadata: function() { |
var _this = this; |
var cbid = '_bing_metadata_' + L.Util.stamp(this); |
window[cbid] = function (meta) { |
_this.meta = meta; |
window[cbid] = undefined; |
var e = document.getElementById(cbid); |
e.parentNode.removeChild(e); |
if (meta.errorDetails) { |
alert("Got metadata" + meta.errorDetails); |
return; |
} |
_this.initMetadata(); |
}; |
var url = "http://dev.virtualearth.net/REST/v1/Imagery/Metadata/" + this.options.type + "?include=ImageryProviders&jsonp=" + cbid + "&key=" + this._key; |
var script = document.createElement("script"); |
script.type = "text/javascript"; |
script.src = url; |
script.id = cbid; |
document.getElementsByTagName("head")[0].appendChild(script); |
}, |
initMetadata: function() { |
var r = this.meta.resourceSets[0].resources[0]; |
this.options.subdomains = r.imageUrlSubdomains; |
this._url = r.imageUrl; |
this._providers = []; |
for (var i = 0; i < r.imageryProviders.length; i++) { |
var p = r.imageryProviders[i]; |
for (var j = 0; j < p.coverageAreas.length; j++) { |
var c = p.coverageAreas[j]; |
var coverage = {zoomMin: c.zoomMin, zoomMax: c.zoomMax, active: false}; |
var bounds = new L.LatLngBounds( |
new L.LatLng(c.bbox[0]+0.01, c.bbox[1]+0.01), |
new L.LatLng(c.bbox[2]-0.01, c.bbox[3]-0.01) |
); |
coverage.bounds = bounds; |
coverage.attrib = p.attribution; |
this._providers.push(coverage); |
} |
} |
this._update(); |
}, |
_update: function() { |
if (this._url == null || !this._map) return; |
this._update_attribution(); |
L.TileLayer.prototype._update.apply(this, []); |
}, |
_update_attribution: function() { |
var bounds = this._map.getBounds(); |
var zoom = this._map.getZoom(); |
for (var i = 0; i < this._providers.length; i++) { |
var p = this._providers[i]; |
if ((zoom <= p.zoomMax && zoom >= p.zoomMin) && |
bounds.intersects(p.bounds)) { |
if (!p.active) |
this._map.attributionControl.addAttribution(p.attrib); |
p.active = true; |
} else { |
if (p.active) |
this._map.attributionControl.removeAttribution(p.attrib); |
p.active = false; |
} |
} |
}, |
onRemove: function(map) { |
for (var i = 0; i < this._providers.length; i++) { |
var p = this._providers[i]; |
if (p.active) { |
this._map.attributionControl.removeAttribution(p.attrib); |
p.active = false; |
} |
} |
L.TileLayer.prototype.onRemove.apply(this, [map]); |
} |
}); |