import defaultValue from "../Core/defaultValue.js"; import defined from "../Core/defined.js"; import deprecationWarning from "../Core/deprecationWarning.js"; import DeveloperError from "../Core/DeveloperError.js"; import GeographicTilingScheme from "../Core/GeographicTilingScheme.js"; import Resource from "../Core/Resource.js"; import WebMercatorProjection from "../Core/WebMercatorProjection.js"; import GetFeatureInfoFormat from "./GetFeatureInfoFormat.js"; import TimeDynamicImagery from "./TimeDynamicImagery.js"; import UrlTemplateImageryProvider from "./UrlTemplateImageryProvider.js"; /** * EPSG codes known to include reverse axis orders, but are not within 4000-5000. * * @type {number[]} */ const includesReverseAxis = [ 3034, // ETRS89-extended / LCC Europe 3035, // ETRS89-extended / LAEA Europe 3042, // ETRS89 / UTM zone 30N (N-E) 3043, // ETRS89 / UTM zone 31N (N-E) 3044, // ETRS89 / UTM zone 32N (N-E) ]; /** * EPSG codes known to not include reverse axis orders, and are within 4000-5000. * * @type {number[]} */ const excludesReverseAxis = [ 4471, // Mayotte 4559, // French Antilles ]; /** * @typedef {object} WebMapServiceImageryProvider.ConstructorOptions * * Initialization options for the WebMapServiceImageryProvider constructor * * @property {Resource|string} url The URL of the WMS service. The URL supports the same keywords as the {@link UrlTemplateImageryProvider}. * @property {string} layers The layers to include, separated by commas. * @property {object} [parameters=WebMapServiceImageryProvider.DefaultParameters] Additional parameters to pass to the WMS server in the GetMap URL. * @property {object} [getFeatureInfoParameters=WebMapServiceImageryProvider.GetFeatureInfoDefaultParameters] Additional parameters to pass to the WMS server in the GetFeatureInfo URL. * @property {boolean} [enablePickFeatures=true] If true, {@link WebMapServiceImageryProvider#pickFeatures} will invoke * the GetFeatureInfo operation on the WMS server and return the features included in the response. If false, * {@link WebMapServiceImageryProvider#pickFeatures} will immediately return undefined (indicating no pickable features) * without communicating with the server. Set this property to false if you know your WMS server does not support * GetFeatureInfo or if you don't want this provider's features to be pickable. Note that this can be dynamically * overridden by modifying the WebMapServiceImageryProvider#enablePickFeatures property. * @property {GetFeatureInfoFormat[]} [getFeatureInfoFormats=WebMapServiceImageryProvider.DefaultGetFeatureInfoFormats] The formats * in which to try WMS GetFeatureInfo requests. * @property {Rectangle} [rectangle=Rectangle.MAX_VALUE] The rectangle of the layer. * @property {TilingScheme} [tilingScheme=new GeographicTilingScheme()] The tiling scheme to use to divide the world into tiles. * @property {Ellipsoid} [ellipsoid] The ellipsoid. If the tilingScheme is specified, * this parameter is ignored and the tiling scheme's ellipsoid is used instead. If neither * parameter is specified, the WGS84 ellipsoid is used. * @property {number} [tileWidth=256] The width of each tile in pixels. * @property {number} [tileHeight=256] The height of each tile in pixels. * @property {number} [minimumLevel=0] The minimum level-of-detail supported by the imagery provider. Take care when * specifying this that the number of tiles at the minimum level is small, such as four or less. A larger number is * likely to result in rendering problems. * @property {number} [maximumLevel] The maximum level-of-detail supported by the imagery provider, or undefined if there is no limit. * If not specified, there is no limit. * @property {string} [crs] CRS specification, for use with WMS specification >= 1.3.0. * @property {string} [srs] SRS specification, for use with WMS specification 1.1.0 or 1.1.1 * @property {Credit|string} [credit] A credit for the data source, which is displayed on the canvas. * @property {string|string[]} [subdomains='abc'] The subdomains to use for the {s} placeholder in the URL template. * If this parameter is a single string, each character in the string is a subdomain. If it is * an array, each element in the array is a subdomain. * @property {Clock} [clock] A Clock instance that is used when determining the value for the time dimension. Required when `times` is specified. * @property {TimeIntervalCollection} [times] TimeIntervalCollection with its data property being an object containing time dynamic dimension and their values. * @property {Resource|string} [getFeatureInfoUrl] The getFeatureInfo URL of the WMS service. If the property is not defined then we use the property value of url. */ /** * Provides tiled imagery hosted by a Web Map Service (WMS) server. * * @alias WebMapServiceImageryProvider * @constructor * * @param {WebMapServiceImageryProvider.ConstructorOptions} options Object describing initialization options * * @see ArcGisMapServerImageryProvider * @see BingMapsImageryProvider * @see GoogleEarthEnterpriseMapsProvider * @see OpenStreetMapImageryProvider * @see SingleTileImageryProvider * @see TileMapServiceImageryProvider * @see WebMapTileServiceImageryProvider * @see UrlTemplateImageryProvider * * @see {@link http://resources.esri.com/help/9.3/arcgisserver/apis/rest/|ArcGIS Server REST API} * @see {@link http://www.w3.org/TR/cors/|Cross-Origin Resource Sharing} * * @example * const provider = new Cesium.WebMapServiceImageryProvider({ * url : 'https://sampleserver1.arcgisonline.com/ArcGIS/services/Specialty/ESRI_StatesCitiesRivers_USA/MapServer/WMSServer', * layers : '0', * proxy: new Cesium.DefaultProxy('/proxy/') * }); * const imageryLayer = new Cesium.ImageryLayer(provider); * viewer.imageryLayers.add(imageryLayer); */ function WebMapServiceImageryProvider(options) { options = defaultValue(options, defaultValue.EMPTY_OBJECT); //>>includeStart('debug', pragmas.debug); if (!defined(options.url)) { throw new DeveloperError("options.url is required."); } if (!defined(options.layers)) { throw new DeveloperError("options.layers is required."); } //>>includeEnd('debug'); if (defined(options.times) && !defined(options.clock)) { throw new DeveloperError( "options.times was specified, so options.clock is required." ); } this._defaultAlpha = undefined; this._defaultNightAlpha = undefined; this._defaultDayAlpha = undefined; this._defaultBrightness = undefined; this._defaultContrast = undefined; this._defaultHue = undefined; this._defaultSaturation = undefined; this._defaultGamma = undefined; this._defaultMinificationFilter = undefined; this._defaultMagnificationFilter = undefined; this._getFeatureInfoUrl = defaultValue( options.getFeatureInfoUrl, options.url ); const resource = Resource.createIfNeeded(options.url); const pickFeatureResource = Resource.createIfNeeded(this._getFeatureInfoUrl); resource.setQueryParameters( WebMapServiceImageryProvider.DefaultParameters, true ); pickFeatureResource.setQueryParameters( WebMapServiceImageryProvider.GetFeatureInfoDefaultParameters, true ); if (defined(options.parameters)) { resource.setQueryParameters(objectToLowercase(options.parameters)); } if (defined(options.getFeatureInfoParameters)) { pickFeatureResource.setQueryParameters( objectToLowercase(options.getFeatureInfoParameters) ); } const that = this; this._reload = undefined; if (defined(options.times)) { this._timeDynamicImagery = new TimeDynamicImagery({ clock: options.clock, times: options.times, requestImageFunction: function (x, y, level, request, interval) { return requestImage(that, x, y, level, request, interval); }, reloadFunction: function () { if (defined(that._reload)) { that._reload(); } }, }); } const parameters = {}; parameters.layers = options.layers; parameters.bbox = "{westProjected},{southProjected},{eastProjected},{northProjected}"; parameters.width = "{width}"; parameters.height = "{height}"; // Use SRS or CRS based on the WMS version. if (parseFloat(resource.queryParameters.version) >= 1.3) { // Use CRS with 1.3.0 and going forward. // For GeographicTilingScheme, use CRS:84 vice EPSG:4326 to specify lon, lat (x, y) ordering for // bbox requests. parameters.crs = defaultValue( options.crs, options.tilingScheme && options.tilingScheme.projection instanceof WebMercatorProjection ? "EPSG:3857" : "CRS:84" ); // The axis order in previous versions of the WMS specifications was to always use easting (x or lon ) and northing (y or // lat). WMS 1.3.0 specifies that, depending on the particular CRS, the x axis may or may not be oriented West-to-East, // and the y axis may or may not be oriented South-to-North. The WMS portrayal operation shall account for axis order. // This affects some of the EPSG codes that were commonly used such as ESPG:4326. The current implementation // makes sure that coordinates passed to the server (as part of the GetMap BBOX parameter) as well as those advertised // in the capabilities document reflect the inverse axe orders for EPSG codes between 4000 and 5000. // - Taken from Section 9.1.3 of https://download.osgeo.org/mapserver/docs/MapServer-56.pdf const parts = parameters.crs.split(":"); if (parts[0] === "EPSG" && parts.length === 2) { const code = Number(parts[1]); if ( (code >= 4000 && code < 5000 && !excludesReverseAxis.includes(code)) || includesReverseAxis.includes(code) ) { parameters.bbox = "{southProjected},{westProjected},{northProjected},{eastProjected}"; } } } else { // SRS for WMS 1.1.0 or 1.1.1. parameters.srs = defaultValue( options.srs, options.tilingScheme && options.tilingScheme.projection instanceof WebMercatorProjection ? "EPSG:3857" : "EPSG:4326" ); } resource.setQueryParameters(parameters, true); pickFeatureResource.setQueryParameters(parameters, true); const pickFeatureParams = { query_layers: options.layers, info_format: "{format}", }; // use correct pixel coordinate identifier based on version if (parseFloat(pickFeatureResource.queryParameters.version) >= 1.3) { pickFeatureParams.i = "{i}"; pickFeatureParams.j = "{j}"; } else { pickFeatureParams.x = "{i}"; pickFeatureParams.y = "{j}"; } pickFeatureResource.setQueryParameters(pickFeatureParams, true); this._resource = resource; this._pickFeaturesResource = pickFeatureResource; this._layers = options.layers; // Let UrlTemplateImageryProvider do the actual URL building. this._tileProvider = new UrlTemplateImageryProvider({ url: resource, pickFeaturesUrl: pickFeatureResource, tilingScheme: defaultValue( options.tilingScheme, new GeographicTilingScheme({ ellipsoid: options.ellipsoid }) ), rectangle: options.rectangle, tileWidth: options.tileWidth, tileHeight: options.tileHeight, minimumLevel: options.minimumLevel, maximumLevel: options.maximumLevel, subdomains: options.subdomains, tileDiscardPolicy: options.tileDiscardPolicy, credit: options.credit, getFeatureInfoFormats: defaultValue( options.getFeatureInfoFormats, WebMapServiceImageryProvider.DefaultGetFeatureInfoFormats ), enablePickFeatures: options.enablePickFeatures, }); this._ready = true; this._readyPromise = Promise.resolve(true); } function requestImage(imageryProvider, col, row, level, request, interval) { const dynamicIntervalData = defined(interval) ? interval.data : undefined; const tileProvider = imageryProvider._tileProvider; if (defined(dynamicIntervalData)) { // We set the query parameters within the tile provider, because it is managing the query. tileProvider._resource.setQueryParameters(dynamicIntervalData); } return tileProvider.requestImage(col, row, level, request); } function pickFeatures( imageryProvider, x, y, level, longitude, latitude, interval ) { const dynamicIntervalData = defined(interval) ? interval.data : undefined; const tileProvider = imageryProvider._tileProvider; if (defined(dynamicIntervalData)) { // We set the query parameters within the tile provider, because it is managing the query. tileProvider._pickFeaturesResource.setQueryParameters(dynamicIntervalData); } return tileProvider.pickFeatures(x, y, level, longitude, latitude); } Object.defineProperties(WebMapServiceImageryProvider.prototype, { /** * Gets the URL of the WMS server. * @memberof WebMapServiceImageryProvider.prototype * @type {string} * @readonly */ url: { get: function () { return this._resource._url; }, }, /** * Gets the proxy used by this provider. * @memberof WebMapServiceImageryProvider.prototype * @type {Proxy} * @readonly */ proxy: { get: function () { return this._resource.proxy; }, }, /** * Gets the names of the WMS layers, separated by commas. * @memberof WebMapServiceImageryProvider.prototype * @type {string} * @readonly */ layers: { get: function () { return this._layers; }, }, /** * Gets the width of each tile, in pixels. * @memberof WebMapServiceImageryProvider.prototype * @type {number} * @readonly */ tileWidth: { get: function () { return this._tileProvider.tileWidth; }, }, /** * Gets the height of each tile, in pixels. * @memberof WebMapServiceImageryProvider.prototype * @type {number} * @readonly */ tileHeight: { get: function () { return this._tileProvider.tileHeight; }, }, /** * Gets the maximum level-of-detail that can be requested. * @memberof WebMapServiceImageryProvider.prototype * @type {number|undefined} * @readonly */ maximumLevel: { get: function () { return this._tileProvider.maximumLevel; }, }, /** * Gets the minimum level-of-detail that can be requested. * @memberof WebMapServiceImageryProvider.prototype * @type {number} * @readonly */ minimumLevel: { get: function () { return this._tileProvider.minimumLevel; }, }, /** * Gets the tiling scheme used by this provider. * @memberof WebMapServiceImageryProvider.prototype * @type {TilingScheme} * @readonly */ tilingScheme: { get: function () { return this._tileProvider.tilingScheme; }, }, /** * Gets the rectangle, in radians, of the imagery provided by this instance. * @memberof WebMapServiceImageryProvider.prototype * @type {Rectangle} * @readonly */ rectangle: { get: function () { return this._tileProvider.rectangle; }, }, /** * Gets the tile discard policy. If not undefined, the discard policy is responsible * for filtering out "missing" tiles via its shouldDiscardImage function. If this function * returns undefined, no tiles are filtered. * @memberof WebMapServiceImageryProvider.prototype * @type {TileDiscardPolicy} * @readonly */ tileDiscardPolicy: { get: function () { return this._tileProvider.tileDiscardPolicy; }, }, /** * Gets an event that is raised when the imagery provider encounters an asynchronous error. By subscribing * to the event, you will be notified of the error and can potentially recover from it. Event listeners * are passed an instance of {@link TileProviderError}. * @memberof WebMapServiceImageryProvider.prototype * @type {Event} * @readonly */ errorEvent: { get: function () { return this._tileProvider.errorEvent; }, }, /** * Gets a value indicating whether or not the provider is ready for use. * @memberof WebMapServiceImageryProvider.prototype * @type {boolean} * @readonly * @deprecated */ ready: { get: function () { deprecationWarning( "WebMapServiceImageryProvider.ready", "WebMapServiceImageryProvider.ready was deprecated in CesiumJS 1.104. It will be in CesiumJS 1.107." ); return this._tileProvider.ready; }, }, /** * Gets a promise that resolves to true when the provider is ready for use. * @memberof WebMapServiceImageryProvider.prototype * @type {Promise} * @readonly * @deprecated */ readyPromise: { get: function () { deprecationWarning( "WebMapServiceImageryProvider.readyPromise", "WebMapServiceImageryProvider.readyPromise was deprecated in CesiumJS 1.104. It will be in CesiumJS 1.107." ); return this._tileProvider.readyPromise; }, }, /** * Gets the credit to display when this imagery provider is active. Typically this is used to credit * the source of the imagery. * @memberof WebMapServiceImageryProvider.prototype * @type {Credit} * @readonly */ credit: { get: function () { return this._tileProvider.credit; }, }, /** * Gets a value indicating whether or not the images provided by this imagery provider * include an alpha channel. If this property is false, an alpha channel, if present, will * be ignored. If this property is true, any images without an alpha channel will be treated * as if their alpha is 1.0 everywhere. When this property is false, memory usage * and texture upload time are reduced. * @memberof WebMapServiceImageryProvider.prototype * @type {boolean} * @readonly */ hasAlphaChannel: { get: function () { return this._tileProvider.hasAlphaChannel; }, }, /** * Gets or sets a value indicating whether feature picking is enabled. If true, {@link WebMapServiceImageryProvider#pickFeatures} will * invoke the GetFeatureInfo service on the WMS server and attempt to interpret the features included in the response. If false, * {@link WebMapServiceImageryProvider#pickFeatures} will immediately return undefined (indicating no pickable * features) without communicating with the server. Set this property to false if you know your data * source does not support picking features or if you don't want this provider's features to be pickable. * @memberof WebMapServiceImageryProvider.prototype * @type {boolean} * @default true */ enablePickFeatures: { get: function () { return this._tileProvider.enablePickFeatures; }, set: function (enablePickFeatures) { this._tileProvider.enablePickFeatures = enablePickFeatures; }, }, /** * Gets or sets a clock that is used to get keep the time used for time dynamic parameters. * @memberof WebMapServiceImageryProvider.prototype * @type {Clock} */ clock: { get: function () { return this._timeDynamicImagery.clock; }, set: function (value) { this._timeDynamicImagery.clock = value; }, }, /** * Gets or sets a time interval collection that is used to get time dynamic parameters. The data of each * TimeInterval is an object containing the keys and values of the properties that are used during * tile requests. * @memberof WebMapServiceImageryProvider.prototype * @type {TimeIntervalCollection} */ times: { get: function () { return this._timeDynamicImagery.times; }, set: function (value) { this._timeDynamicImagery.times = value; }, }, /** * Gets the getFeatureInfo URL of the WMS server. * @memberof WebMapServiceImageryProvider.prototype * @type {Resource|string} * @readonly */ getFeatureInfoUrl: { get: function () { return this._getFeatureInfoUrl; }, }, /** * The default alpha blending value of this provider, with 0.0 representing fully transparent and * 1.0 representing fully opaque. * @memberof WebMapServiceImageryProvider.prototype * @type {Number|undefined} * @deprecated */ defaultAlpha: { get: function () { deprecationWarning( "WebMapServiceImageryProvider.defaultAlpha", "WebMapServiceImageryProvider.defaultAlpha was deprecated in CesiumJS 1.104. It will be in CesiumJS 1.107. Use ImageryLayer.alpha instead." ); return this._defaultAlpha; }, set: function (value) { deprecationWarning( "WebMapServiceImageryProvider.defaultAlpha", "WebMapServiceImageryProvider.defaultAlpha was deprecated in CesiumJS 1.104. It will be in CesiumJS 1.107. Use ImageryLayer.alpha instead." ); this._defaultAlpha = value; }, }, /** * The default alpha blending value on the night side of the globe of this provider, with 0.0 representing fully transparent and * 1.0 representing fully opaque. * @memberof WebMapServiceImageryProvider.prototype * @type {Number|undefined} * @deprecated */ defaultNightAlpha: { get: function () { deprecationWarning( "WebMapServiceImageryProvider.defaultNightAlpha", "WebMapServiceImageryProvider.defaultNightAlpha was deprecated in CesiumJS 1.104. It will be in CesiumJS 1.107. Use ImageryLayer.nightAlpha instead." ); return this._defaultNightAlpha; }, set: function (value) { deprecationWarning( "WebMapServiceImageryProvider.defaultNightAlpha", "WebMapServiceImageryProvider.defaultNightAlpha was deprecated in CesiumJS 1.104. It will be in CesiumJS 1.107. Use ImageryLayer.nightAlpha instead." ); this._defaultNightAlpha = value; }, }, /** * The default alpha blending value on the day side of the globe of this provider, with 0.0 representing fully transparent and * 1.0 representing fully opaque. * @memberof WebMapServiceImageryProvider.prototype * @type {Number|undefined} * @deprecated */ defaultDayAlpha: { get: function () { deprecationWarning( "WebMapServiceImageryProvider.defaultDayAlpha", "WebMapServiceImageryProvider.defaultDayAlpha was deprecated in CesiumJS 1.104. It will be in CesiumJS 1.107. Use ImageryLayer.dayAlpha instead." ); return this._defaultDayAlpha; }, set: function (value) { deprecationWarning( "WebMapServiceImageryProvider.defaultDayAlpha", "WebMapServiceImageryProvider.defaultDayAlpha was deprecated in CesiumJS 1.104. It will be in CesiumJS 1.107. Use ImageryLayer.dayAlpha instead." ); this._defaultDayAlpha = value; }, }, /** * The default brightness of this provider. 1.0 uses the unmodified imagery color. Less than 1.0 * makes the imagery darker while greater than 1.0 makes it brighter. * @memberof WebMapServiceImageryProvider.prototype * @type {Number|undefined} * @deprecated */ defaultBrightness: { get: function () { deprecationWarning( "WebMapServiceImageryProvider.defaultBrightness", "WebMapServiceImageryProvider.defaultBrightness was deprecated in CesiumJS 1.104. It will be in CesiumJS 1.107. Use ImageryLayer.brightness instead." ); return this._defaultBrightness; }, set: function (value) { deprecationWarning( "WebMapServiceImageryProvider.defaultBrightness", "WebMapServiceImageryProvider.defaultBrightness was deprecated in CesiumJS 1.104. It will be in CesiumJS 1.107. Use ImageryLayer.brightness instead." ); this._defaultBrightness = value; }, }, /** * The default contrast of this provider. 1.0 uses the unmodified imagery color. Less than 1.0 reduces * the contrast while greater than 1.0 increases it. * @memberof WebMapServiceImageryProvider.prototype * @type {Number|undefined} * @deprecated */ defaultContrast: { get: function () { deprecationWarning( "WebMapServiceImageryProvider.defaultContrast", "WebMapServiceImageryProvider.defaultContrast was deprecated in CesiumJS 1.104. It will be in CesiumJS 1.107. Use ImageryLayer.contrast instead." ); return this._defaultContrast; }, set: function (value) { deprecationWarning( "WebMapServiceImageryProvider.defaultContrast", "WebMapServiceImageryProvider.defaultContrast was deprecated in CesiumJS 1.104. It will be in CesiumJS 1.107. Use ImageryLayer.contrast instead." ); this._defaultContrast = value; }, }, /** * The default hue of this provider in radians. 0.0 uses the unmodified imagery color. * @memberof WebMapServiceImageryProvider.prototype * @type {Number|undefined} * @deprecated */ defaultHue: { get: function () { deprecationWarning( "WebMapServiceImageryProvider.defaultHue", "WebMapServiceImageryProvider.defaultHue was deprecated in CesiumJS 1.104. It will be in CesiumJS 1.107. Use ImageryLayer.hue instead." ); return this._defaultHue; }, set: function (value) { deprecationWarning( "WebMapServiceImageryProvider.defaultHue", "WebMapServiceImageryProvider.defaultHue was deprecated in CesiumJS 1.104. It will be in CesiumJS 1.107. Use ImageryLayer.hue instead." ); this._defaultHue = value; }, }, /** * The default saturation of this provider. 1.0 uses the unmodified imagery color. Less than 1.0 reduces the * saturation while greater than 1.0 increases it. * @memberof WebMapServiceImageryProvider.prototype * @type {Number|undefined} * @deprecated */ defaultSaturation: { get: function () { deprecationWarning( "WebMapServiceImageryProvider.defaultSaturation", "WebMapServiceImageryProvider.defaultSaturation was deprecated in CesiumJS 1.104. It will be in CesiumJS 1.107. Use ImageryLayer.saturation instead." ); return this._defaultSaturation; }, set: function (value) { deprecationWarning( "WebMapServiceImageryProvider.defaultSaturation", "WebMapServiceImageryProvider.defaultSaturation was deprecated in CesiumJS 1.104. It will be in CesiumJS 1.107. Use ImageryLayer.saturation instead." ); this._defaultSaturation = value; }, }, /** * The default gamma correction to apply to this provider. 1.0 uses the unmodified imagery color. * @memberof WebMapServiceImageryProvider.prototype * @type {Number|undefined} * @deprecated */ defaultGamma: { get: function () { deprecationWarning( "WebMapServiceImageryProvider.defaultGamma", "WebMapServiceImageryProvider.defaultGamma was deprecated in CesiumJS 1.104. It will be in CesiumJS 1.107. Use ImageryLayer.gamma instead." ); return this._defaultGamma; }, set: function (value) { deprecationWarning( "WebMapServiceImageryProvider.defaultGamma", "WebMapServiceImageryProvider.defaultGamma was deprecated in CesiumJS 1.104. It will be in CesiumJS 1.107. Use ImageryLayer.gamma instead." ); this._defaultGamma = value; }, }, /** * The default texture minification filter to apply to this provider. * @memberof WebMapServiceImageryProvider.prototype * @type {TextureMinificationFilter} * @deprecated */ defaultMinificationFilter: { get: function () { deprecationWarning( "WebMapServiceImageryProvider.defaultMinificationFilter", "WebMapServiceImageryProvider.defaultMinificationFilter was deprecated in CesiumJS 1.104. It will be in CesiumJS 1.107. Use ImageryLayer.minificationFilter instead." ); return this._defaultMinificationFilter; }, set: function (value) { deprecationWarning( "WebMapServiceImageryProvider.defaultMinificationFilter", "WebMapServiceImageryProvider.defaultMinificationFilter was deprecated in CesiumJS 1.104. It will be in CesiumJS 1.107. Use ImageryLayer.minificationFilter instead." ); this._defaultMinificationFilter = value; }, }, /** * The default texture magnification filter to apply to this provider. * @memberof WebMapServiceImageryProvider.prototype * @type {TextureMagnificationFilter} * @deprecated */ defaultMagnificationFilter: { get: function () { deprecationWarning( "WebMapServiceImageryProvider.defaultMagnificationFilter", "WebMapServiceImageryProvider.defaultMagnificationFilter was deprecated in CesiumJS 1.104. It will be in CesiumJS 1.107. Use ImageryLayer.magnificationFilter instead." ); return this._defaultMagnificationFilter; }, set: function (value) { deprecationWarning( "WebMapServiceImageryProvider.defaultMagnificationFilter", "WebMapServiceImageryProvider.defaultMagnificationFilter was deprecated in CesiumJS 1.104. It will be in CesiumJS 1.107. Use ImageryLayer.magnificationFilter instead." ); this._defaultMagnificationFilter = value; }, }, }); /** * Gets the credits to be displayed when a given tile is displayed. * * @param {number} x The tile X coordinate. * @param {number} y The tile Y coordinate. * @param {number} level The tile level; * @returns {Credit[]} The credits to be displayed when the tile is displayed. */ WebMapServiceImageryProvider.prototype.getTileCredits = function (x, y, level) { return this._tileProvider.getTileCredits(x, y, level); }; /** * Requests the image for a given tile. * * @param {number} x The tile X coordinate. * @param {number} y The tile Y coordinate. * @param {number} level The tile level. * @param {Request} [request] The request object. Intended for internal use only. * @returns {Promise|undefined} A promise for the image that will resolve when the image is available, or * undefined if there are too many active requests to the server, and the request should be retried later. */ WebMapServiceImageryProvider.prototype.requestImage = function ( x, y, level, request ) { let result; const timeDynamicImagery = this._timeDynamicImagery; let currentInterval; // Try and load from cache if (defined(timeDynamicImagery)) { currentInterval = timeDynamicImagery.currentInterval; result = timeDynamicImagery.getFromCache(x, y, level, request); } // Couldn't load from cache if (!defined(result)) { result = requestImage(this, x, y, level, request, currentInterval); } // If we are approaching an interval, preload this tile in the next interval if (defined(result) && defined(timeDynamicImagery)) { timeDynamicImagery.checkApproachingInterval(x, y, level, request); } return result; }; /** * Asynchronously determines what features, if any, are located at a given longitude and latitude within * a tile. * * @param {number} x The tile X coordinate. * @param {number} y The tile Y coordinate. * @param {number} level The tile level. * @param {number} longitude The longitude at which to pick features. * @param {number} latitude The latitude at which to pick features. * @return {Promise|undefined} A promise for the picked features that will resolve when the asynchronous * picking completes. The resolved value is an array of {@link ImageryLayerFeatureInfo} * instances. The array may be empty if no features are found at the given location. */ WebMapServiceImageryProvider.prototype.pickFeatures = function ( x, y, level, longitude, latitude ) { const timeDynamicImagery = this._timeDynamicImagery; const currentInterval = defined(timeDynamicImagery) ? timeDynamicImagery.currentInterval : undefined; return pickFeatures(this, x, y, level, longitude, latitude, currentInterval); }; /** * The default parameters to include in the WMS URL to obtain images. The values are as follows: * service=WMS * version=1.1.1 * request=GetMap * styles= * format=image/jpeg * * @constant * @type {object} */ WebMapServiceImageryProvider.DefaultParameters = Object.freeze({ service: "WMS", version: "1.1.1", request: "GetMap", styles: "", format: "image/jpeg", }); /** * The default parameters to include in the WMS URL to get feature information. The values are as follows: * service=WMS * version=1.1.1 * request=GetFeatureInfo * * @constant * @type {object} */ WebMapServiceImageryProvider.GetFeatureInfoDefaultParameters = Object.freeze({ service: "WMS", version: "1.1.1", request: "GetFeatureInfo", }); WebMapServiceImageryProvider.DefaultGetFeatureInfoFormats = Object.freeze([ Object.freeze(new GetFeatureInfoFormat("json", "application/json")), Object.freeze(new GetFeatureInfoFormat("xml", "text/xml")), Object.freeze(new GetFeatureInfoFormat("text", "text/html")), ]); function objectToLowercase(obj) { const result = {}; for (const key in obj) { if (obj.hasOwnProperty(key)) { result[key.toLowerCase()] = obj[key]; } } return result; } export default WebMapServiceImageryProvider;