added new BingLayer code
This commit is contained in:
		
							parent
							
								
									5f089e628b
								
							
						
					
					
						commit
						0916e3f2e3
					
				@ -79,15 +79,13 @@ OSRM.DEFAULTS = {
 | 
			
		||||
		{
 | 
			
		||||
			display_name: 'Bing Road',
 | 
			
		||||
			apikey:'AjCb2f6Azv_xt9c6pl_xok96bgAYrXQNctnG4o07sTj4iS9N68Za4B3pRJyeCjGr',	// please use your own apikey (http://msdn.microsoft.com/en-us/library/ff428642.aspx) 
 | 
			
		||||
			type:"Road",
 | 
			
		||||
			options:{minZoom: 1},
 | 
			
		||||
			options:{type:"Road", minZoom: 1},
 | 
			
		||||
			bing:true,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			display_name: 'Bing Aerial',
 | 
			
		||||
			apikey:'AjCb2f6Azv_xt9c6pl_xok96bgAYrXQNctnG4o07sTj4iS9N68Za4B3pRJyeCjGr',	// please use your own apikey (http://msdn.microsoft.com/en-us/library/ff428642.aspx)
 | 
			
		||||
			type:"Aerial",
 | 
			
		||||
			options:{minZoom: 1},
 | 
			
		||||
			options:{type:"Aerial", minZoom: 1},
 | 
			
		||||
			bing:true,
 | 
			
		||||
		}
 | 
			
		||||
	],
 | 
			
		||||
 | 
			
		||||
@ -37,7 +37,7 @@ init: function() {
 | 
			
		||||
	var base_maps = {};
 | 
			
		||||
	for(var i=0, size=tile_servers.length; i<size; i++) {
 | 
			
		||||
		if( tile_servers[i].bing == true ) {
 | 
			
		||||
			base_maps[ tile_servers[i].display_name ] = new L.TileLayer.Bing( tile_servers[i].apikey, tile_servers[i].type, tile_servers[i].options );		
 | 
			
		||||
			base_maps[ tile_servers[i].display_name ] = new L.BingLayer( tile_servers[i].apikey, tile_servers[i].options );		
 | 
			
		||||
		} else {
 | 
			
		||||
			tile_servers[i].options.attribution = tile_servers[i].attribution; 
 | 
			
		||||
			base_maps[ tile_servers[i].display_name ] = new L.TileLayer( tile_servers[i].url, tile_servers[i].options );
 | 
			
		||||
 | 
			
		||||
@ -1,3 +1,123 @@
 | 
			
		||||
L.BingLayer = L.TileLayer.extend({
 | 
			
		||||
	options: {
 | 
			
		||||
		subdomains: [0, 1, 2, 3],
 | 
			
		||||
		type: 'Aerial',
 | 
			
		||||
		attribution: 'Bing',
 | 
			
		||||
		culture: 'en-US'
 | 
			
		||||
	},
 | 
			
		||||
 | 
			
		||||
	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[(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]);
 | 
			
		||||
	}
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* 
 | 
			
		||||
 * Portions of this code and logic copied from OpenLayers and
 | 
			
		||||
 * redistributed under the original Clear BSD license terms:
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user