123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649 |
- define([
- '../Core/BingMapsApi',
- '../Core/Cartesian2',
- '../Core/Credit',
- '../Core/defaultValue',
- '../Core/defined',
- '../Core/defineProperties',
- '../Core/DeveloperError',
- '../Core/Event',
- '../Core/jsonp',
- '../Core/Math',
- '../Core/Rectangle',
- '../Core/TileProviderError',
- '../Core/WebMercatorTilingScheme',
- '../ThirdParty/when',
- './BingMapsStyle',
- './DiscardMissingTileImagePolicy',
- './ImageryProvider'
- ], function(
- BingMapsApi,
- Cartesian2,
- Credit,
- defaultValue,
- defined,
- defineProperties,
- DeveloperError,
- Event,
- jsonp,
- CesiumMath,
- Rectangle,
- TileProviderError,
- WebMercatorTilingScheme,
- when,
- BingMapsStyle,
- DiscardMissingTileImagePolicy,
- ImageryProvider) {
- "use strict";
-
- var BingMapsImageryProvider = function BingMapsImageryProvider(options) {
- options = defaultValue(options, {});
-
- if (!defined(options.url)) {
- throw new DeveloperError('options.url is required.');
- }
-
- this._key = BingMapsApi.getKey(options.key);
- this._url = options.url;
- this._tileProtocol = options.tileProtocol;
- this._mapStyle = defaultValue(options.mapStyle, BingMapsStyle.AERIAL);
- this._culture = defaultValue(options.culture, '');
- this._tileDiscardPolicy = options.tileDiscardPolicy;
- this._proxy = options.proxy;
- this._credit = new Credit('Bing Imagery', BingMapsImageryProvider._logoData, 'http://www.bing.com');
-
- this.defaultGamma = 1.0;
- if (this._mapStyle === BingMapsStyle.AERIAL || this._mapStyle === BingMapsStyle.AERIAL_WITH_LABELS) {
- this.defaultGamma = 1.3;
- }
- this._tilingScheme = new WebMercatorTilingScheme({
- numberOfLevelZeroTilesX : 2,
- numberOfLevelZeroTilesY : 2
- });
- this._tileWidth = undefined;
- this._tileHeight = undefined;
- this._maximumLevel = undefined;
- this._imageUrlTemplate = undefined;
- this._imageUrlSubdomains = undefined;
- this._errorEvent = new Event();
- this._ready = false;
- var metadataUrl = this._url + '/REST/v1/Imagery/Metadata/' + this._mapStyle + '?incl=ImageryProviders&key=' + this._key;
- var that = this;
- var metadataError;
- function metadataSuccess(data) {
- var resource = data.resourceSets[0].resources[0];
- that._tileWidth = resource.imageWidth;
- that._tileHeight = resource.imageHeight;
- that._maximumLevel = resource.zoomMax - 1;
- that._imageUrlSubdomains = resource.imageUrlSubdomains;
- that._imageUrlTemplate = resource.imageUrl.replace('{culture}', that._culture);
- var tileProtocol = that._tileProtocol;
- if (!defined(tileProtocol)) {
-
- var documentProtocol = document.location.protocol;
- tileProtocol = /^http/.test(documentProtocol) ? documentProtocol : 'http:';
- }
- that._imageUrlTemplate = that._imageUrlTemplate.replace(/^http:/, tileProtocol);
-
- if (!defined(that._tileDiscardPolicy)) {
- that._tileDiscardPolicy = new DiscardMissingTileImagePolicy({
- missingImageUrl : buildImageUrl(that, 0, 0, that._maximumLevel),
- pixelsToCheck : [new Cartesian2(0, 0), new Cartesian2(120, 140), new Cartesian2(130, 160), new Cartesian2(200, 50), new Cartesian2(200, 200)],
- disableCheckIfAllPixelsAreTransparent : true
- });
- }
- var attributionList = that._attributionList = resource.imageryProviders;
- if (!attributionList) {
- attributionList = that._attributionList = [];
- }
- for (var attributionIndex = 0, attributionLength = attributionList.length; attributionIndex < attributionLength; ++attributionIndex) {
- var attribution = attributionList[attributionIndex];
- attribution.credit = new Credit(attribution.attribution);
- var coverageAreas = attribution.coverageAreas;
- for (var areaIndex = 0, areaLength = attribution.coverageAreas.length; areaIndex < areaLength; ++areaIndex) {
- var area = coverageAreas[areaIndex];
- var bbox = area.bbox;
- area.bbox = new Rectangle(
- CesiumMath.toRadians(bbox[1]),
- CesiumMath.toRadians(bbox[0]),
- CesiumMath.toRadians(bbox[3]),
- CesiumMath.toRadians(bbox[2]));
- }
- }
- that._ready = true;
- TileProviderError.handleSuccess(metadataError);
- }
- function metadataFailure(e) {
- var message = 'An error occurred while accessing ' + metadataUrl + '.';
- metadataError = TileProviderError.handleError(metadataError, that, that._errorEvent, message, undefined, undefined, undefined, requestMetadata);
- }
- function requestMetadata() {
- var metadata = jsonp(metadataUrl, {
- callbackParameterName : 'jsonp',
- proxy : that._proxy
- });
- when(metadata, metadataSuccess, metadataFailure);
- }
- requestMetadata();
- };
- defineProperties(BingMapsImageryProvider.prototype, {
-
- url : {
- get : function() {
- return this._url;
- }
- },
-
- proxy : {
- get : function() {
- return this._proxy;
- }
- },
-
- key : {
- get : function() {
- return this._key;
- }
- },
-
- mapStyle : {
- get : function() {
- return this._mapStyle;
- }
- },
-
- culture : {
- get : function() {
- return this._culture;
- }
- },
-
- tileWidth : {
- get : function() {
-
- if (!this._ready) {
- throw new DeveloperError('tileWidth must not be called before the imagery provider is ready.');
- }
-
- return this._tileWidth;
- }
- },
-
- tileHeight: {
- get : function() {
-
- if (!this._ready) {
- throw new DeveloperError('tileHeight must not be called before the imagery provider is ready.');
- }
-
- return this._tileHeight;
- }
- },
-
- maximumLevel : {
- get : function() {
-
- if (!this._ready) {
- throw new DeveloperError('maximumLevel must not be called before the imagery provider is ready.');
- }
-
- return this._maximumLevel;
- }
- },
-
- minimumLevel : {
- get : function() {
-
- if (!this._ready) {
- throw new DeveloperError('minimumLevel must not be called before the imagery provider is ready.');
- }
-
- return 0;
- }
- },
-
- tilingScheme : {
- get : function() {
-
- if (!this._ready) {
- throw new DeveloperError('tilingScheme must not be called before the imagery provider is ready.');
- }
-
- return this._tilingScheme;
- }
- },
-
- rectangle : {
- get : function() {
-
- if (!this._ready) {
- throw new DeveloperError('rectangle must not be called before the imagery provider is ready.');
- }
-
- return this._tilingScheme.rectangle;
- }
- },
-
- tileDiscardPolicy : {
- get : function() {
-
- if (!this._ready) {
- throw new DeveloperError('tileDiscardPolicy must not be called before the imagery provider is ready.');
- }
-
- return this._tileDiscardPolicy;
- }
- },
-
- errorEvent : {
- get : function() {
- return this._errorEvent;
- }
- },
-
- ready : {
- get : function() {
- return this._ready;
- }
- },
-
- credit : {
- get : function() {
- return this._credit;
- }
- },
-
- hasAlphaChannel : {
- get : function() {
- return false;
- }
- }
- });
- var rectangleScratch = new Rectangle();
-
- BingMapsImageryProvider.prototype.getTileCredits = function(x, y, level) {
- if (!this._ready) {
- throw new DeveloperError('getTileCredits must not be called before the imagery provider is ready.');
- }
- var rectangle = this._tilingScheme.tileXYToRectangle(x, y, level, rectangleScratch);
- return getRectangleAttribution(this._attributionList, level, rectangle);
- };
-
- BingMapsImageryProvider.prototype.requestImage = function(x, y, level) {
-
- if (!this._ready) {
- throw new DeveloperError('requestImage must not be called before the imagery provider is ready.');
- }
-
- var url = buildImageUrl(this, x, y, level);
- return ImageryProvider.loadImage(this, url);
- };
-
- BingMapsImageryProvider.prototype.pickFeatures = function() {
- return undefined;
- };
- BingMapsImageryProvider._logoData = 'data:image/png;base64,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';
-
- BingMapsImageryProvider.tileXYToQuadKey = function(x, y, level) {
- var quadkey = '';
- for ( var i = level; i >= 0; --i) {
- var bitmask = 1 << i;
- var digit = 0;
- if ((x & bitmask) !== 0) {
- digit |= 1;
- }
- if ((y & bitmask) !== 0) {
- digit |= 2;
- }
- quadkey += digit;
- }
- return quadkey;
- };
-
- BingMapsImageryProvider.quadKeyToTileXY = function(quadkey) {
- var x = 0;
- var y = 0;
- var level = quadkey.length - 1;
- for ( var i = level; i >= 0; --i) {
- var bitmask = 1 << i;
- var digit = +quadkey[level - i];
- if ((digit & 1) !== 0) {
- x |= bitmask;
- }
- if ((digit & 2) !== 0) {
- y |= bitmask;
- }
- }
- return {
- x : x,
- y : y,
- level : level
- };
- };
- function buildImageUrl(imageryProvider, x, y, level) {
- var imageUrl = imageryProvider._imageUrlTemplate;
- var quadkey = BingMapsImageryProvider.tileXYToQuadKey(x, y, level);
- imageUrl = imageUrl.replace('{quadkey}', quadkey);
- var subdomains = imageryProvider._imageUrlSubdomains;
- var subdomainIndex = (x + y + level) % subdomains.length;
- imageUrl = imageUrl.replace('{subdomain}', subdomains[subdomainIndex]);
- var proxy = imageryProvider._proxy;
- if (defined(proxy)) {
- imageUrl = proxy.getURL(imageUrl);
- }
- return imageUrl;
- }
- var intersectionScratch = new Rectangle();
- function getRectangleAttribution(attributionList, level, rectangle) {
-
- ++level;
- var result = [];
- for (var attributionIndex = 0, attributionLength = attributionList.length; attributionIndex < attributionLength; ++attributionIndex) {
- var attribution = attributionList[attributionIndex];
- var coverageAreas = attribution.coverageAreas;
- var included = false;
- for (var areaIndex = 0, areaLength = attribution.coverageAreas.length; !included && areaIndex < areaLength; ++areaIndex) {
- var area = coverageAreas[areaIndex];
- if (level >= area.zoomMin && level <= area.zoomMax) {
- var intersection = Rectangle.intersection(rectangle, area.bbox, intersectionScratch);
- if (defined(intersection)) {
- included = true;
- }
- }
- }
- if (included) {
- result.push(attribution.credit);
- }
- }
- return result;
- }
- return BingMapsImageryProvider;
- });
|