import Cartesian2 from "../Core/Cartesian2.js"; import Cartesian3 from "../Core/Cartesian3.js"; import Cartographic from "../Core/Cartographic.js"; import Check from "../Core/Check.js"; import combine from "../Core/combine.js"; import Credit from "../Core/Credit.js"; import defaultValue from "../Core/defaultValue.js"; import defined from "../Core/defined.js"; import Event from "../Core/Event.js"; import GeographicProjection from "../Core/GeographicProjection.js"; import CesiumMath from "../Core/Math.js"; import Rectangle from "../Core/Rectangle.js"; import Resource from "../Core/Resource.js"; import WebMercatorTilingScheme from "../Core/WebMercatorTilingScheme.js"; import ImageryProvider from "./ImageryProvider.js"; const templateRegex = /{[^}]+}/g; const tags = { x: xTag, y: yTag, z: zTag, s: sTag, reverseX: reverseXTag, reverseY: reverseYTag, reverseZ: reverseZTag, westDegrees: westDegreesTag, southDegrees: southDegreesTag, eastDegrees: eastDegreesTag, northDegrees: northDegreesTag, westProjected: westProjectedTag, southProjected: southProjectedTag, eastProjected: eastProjectedTag, northProjected: northProjectedTag, width: widthTag, height: heightTag, }; const pickFeaturesTags = combine(tags, { i: iTag, j: jTag, reverseI: reverseITag, reverseJ: reverseJTag, longitudeDegrees: longitudeDegreesTag, latitudeDegrees: latitudeDegreesTag, longitudeProjected: longitudeProjectedTag, latitudeProjected: latitudeProjectedTag, format: formatTag, }); /** * @typedef {object} UrlTemplateImageryProvider.ConstructorOptions * * Initialization options for the UrlTemplateImageryProvider constructor * * @property {Resource|string} url The URL template to use to request tiles. It has the following keywords: *
{z}: The level of the tile in the tiling scheme. Level zero is the root of the quadtree pyramid.{x}: The tile X coordinate in the tiling scheme, where 0 is the Westernmost tile.{y}: The tile Y coordinate in the tiling scheme, where 0 is the Northernmost tile.{s}: One of the available subdomains, used to overcome browser limits on the number of simultaneous requests per host.{reverseX}: The tile X coordinate in the tiling scheme, where 0 is the Easternmost tile.{reverseY}: The tile Y coordinate in the tiling scheme, where 0 is the Southernmost tile.{reverseZ}: The level of the tile in the tiling scheme, where level zero is the maximum level of the quadtree pyramid. In order to use reverseZ, maximumLevel must be defined.{westDegrees}: The Western edge of the tile in geodetic degrees.{southDegrees}: The Southern edge of the tile in geodetic degrees.{eastDegrees}: The Eastern edge of the tile in geodetic degrees.{northDegrees}: The Northern edge of the tile in geodetic degrees.{westProjected}: The Western edge of the tile in projected coordinates of the tiling scheme.{southProjected}: The Southern edge of the tile in projected coordinates of the tiling scheme.{eastProjected}: The Eastern edge of the tile in projected coordinates of the tiling scheme.{northProjected}: The Northern edge of the tile in projected coordinates of the tiling scheme.{width}: The width of each tile in pixels.{height}: The height of each tile in pixels.url
* parameter, plus the following:
* {i}: The pixel column (horizontal coordinate) of the picked position, where the Westernmost pixel is 0.{j}: The pixel row (vertical coordinate) of the picked position, where the Northernmost pixel is 0.{reverseI}: The pixel column (horizontal coordinate) of the picked position, where the Easternmost pixel is 0.{reverseJ}: The pixel row (vertical coordinate) of the picked position, where the Southernmost pixel is 0.{longitudeDegrees}: The longitude of the picked position in degrees.{latitudeDegrees}: The latitude of the picked position in degrees.{longitudeProjected}: The longitude of the picked position in the projected coordinates of the tiling scheme.{latitudeProjected}: The latitude of the picked position in the projected coordinates of the tiling scheme.{format}: The format in which to get feature information, as specified in the {@link GetFeatureInfoFormat}.{z}: The zero padding for the level of the tile in the tiling scheme.{x}: The zero padding for the tile X coordinate in the tiling scheme.{y}: The zero padding for the the tile Y coordinate in the tiling scheme.{reverseX}: The zero padding for the tile reverseX coordinate in the tiling scheme.{reverseY}: The zero padding for the tile reverseY coordinate in the tiling scheme.{reverseZ}: The zero padding for the reverseZ coordinate of the tile in the tiling scheme.{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 {Credit|string} [credit=''] A credit for the data source, which is displayed on the canvas.
* @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.
* @property {Rectangle} [rectangle=Rectangle.MAX_VALUE] The rectangle, in radians, covered by the image.
* @property {TilingScheme} [tilingScheme=WebMercatorTilingScheme] The tiling scheme specifying how the ellipsoidal
* surface is broken into tiles. If this parameter is not provided, a {@link WebMercatorTilingScheme}
* is used.
* @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] Pixel width of image tiles.
* @property {number} [tileHeight=256] Pixel height of image tiles.
* @property {boolean} [hasAlphaChannel=true] true if the images provided by this imagery provider
* include an alpha channel; otherwise, false. 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 potentially reduced.
* @property {GetFeatureInfoFormat[]} [getFeatureInfoFormats] The formats in which to get feature information at a
* specific location when {@link UrlTemplateImageryProvider#pickFeatures} is invoked. If this
* parameter is not specified, feature picking is disabled.
* @property {boolean} [enablePickFeatures=true] If true, {@link UrlTemplateImageryProvider#pickFeatures} will
* request the pickFeaturesUrl and attempt to interpret the features included in the response. If false,
* {@link UrlTemplateImageryProvider#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. Note
* that this can be dynamically overridden by modifying the {@link UriTemplateImageryProvider#enablePickFeatures}
* property.
* @property {TileDiscardPolicy} [tileDiscardPolicy] A policy for discarding tile images according to some criteria
* @property {Object} [customTags] Allow to replace custom keywords in the URL template. The object must have strings as keys and functions as values.
*/
/**
* Provides imagery by requesting tiles using a specified URL template.
*
* @alias UrlTemplateImageryProvider
* @constructor
*
* @param {UrlTemplateImageryProvider.ConstructorOptions} options Object describing initialization options
*
* @example
* // Access Natural Earth II imagery, which uses a TMS tiling scheme and Geographic (EPSG:4326) project
* const tms = new Cesium.UrlTemplateImageryProvider({
* url : Cesium.buildModuleUrl('Assets/Textures/NaturalEarthII') + '/{z}/{x}/{reverseY}.jpg',
* tilingScheme : new Cesium.GeographicTilingScheme(),
* maximumLevel : 5
* });
* // Access the CartoDB Positron basemap, which uses an OpenStreetMap-like tiling scheme.
* const positron = new Cesium.UrlTemplateImageryProvider({
* url : 'http://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}.png',
* credit : 'Map tiles by CartoDB, under CC BY 3.0. Data by OpenStreetMap, under ODbL.'
* });
* // Access a Web Map Service (WMS) server.
* const wms = new Cesium.UrlTemplateImageryProvider({
* url : 'https://programs.communications.gov.au/geoserver/ows?tiled=true&' +
* 'transparent=true&format=image%2Fpng&exceptions=application%2Fvnd.ogc.se_xml&' +
* 'styles=&service=WMS&version=1.1.1&request=GetMap&' +
* 'layers=public%3AMyBroadband_Availability&srs=EPSG%3A3857&' +
* 'bbox={westProjected}%2C{southProjected}%2C{eastProjected}%2C{northProjected}&' +
* 'width=256&height=256',
* rectangle : Cesium.Rectangle.fromDegrees(96.799393, -43.598214999057824, 153.63925700000001, -9.2159219997013)
* });
* // Using custom tags in your template url.
* const custom = new Cesium.UrlTemplateImageryProvider({
* url : 'https://yoururl/{Time}/{z}/{y}/{x}.png',
* customTags : {
* Time: function(imageryProvider, x, y, level) {
* return '20171231'
* }
* }
* });
*
* @see ArcGisMapServerImageryProvider
* @see BingMapsImageryProvider
* @see GoogleEarthEnterpriseMapsProvider
* @see OpenStreetMapImageryProvider
* @see SingleTileImageryProvider
* @see TileMapServiceImageryProvider
* @see WebMapServiceImageryProvider
* @see WebMapTileServiceImageryProvider
*/
function UrlTemplateImageryProvider(options) {
options = defaultValue(options, defaultValue.EMPTY_OBJECT);
this._errorEvent = new Event();
//>>includeStart('debug', pragmas.debug);
Check.defined("options.url", options.url);
//>>includeEnd('debug');
const resource = Resource.createIfNeeded(options.url);
const pickFeaturesResource = Resource.createIfNeeded(options.pickFeaturesUrl);
this._resource = resource;
this._urlSchemeZeroPadding = options.urlSchemeZeroPadding;
this._getFeatureInfoFormats = options.getFeatureInfoFormats;
this._pickFeaturesResource = pickFeaturesResource;
let subdomains = options.subdomains;
if (Array.isArray(subdomains)) {
subdomains = subdomains.slice();
} else if (defined(subdomains) && subdomains.length > 0) {
subdomains = subdomains.split("");
} else {
subdomains = ["a", "b", "c"];
}
this._subdomains = subdomains;
this._tileWidth = defaultValue(options.tileWidth, 256);
this._tileHeight = defaultValue(options.tileHeight, 256);
this._minimumLevel = defaultValue(options.minimumLevel, 0);
this._maximumLevel = options.maximumLevel;
this._tilingScheme = defaultValue(
options.tilingScheme,
new WebMercatorTilingScheme({ ellipsoid: options.ellipsoid })
);
this._rectangle = defaultValue(
options.rectangle,
this._tilingScheme.rectangle
);
this._rectangle = Rectangle.intersection(
this._rectangle,
this._tilingScheme.rectangle
);
this._tileDiscardPolicy = options.tileDiscardPolicy;
let credit = options.credit;
if (typeof credit === "string") {
credit = new Credit(credit);
}
this._credit = credit;
this._hasAlphaChannel = defaultValue(options.hasAlphaChannel, true);
const customTags = options.customTags;
const allTags = combine(tags, customTags);
const allPickFeaturesTags = combine(pickFeaturesTags, customTags);
this._tags = allTags;
this._pickFeaturesTags = allPickFeaturesTags;
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;
/**
* Gets or sets a value indicating whether feature picking is enabled. If true, {@link UrlTemplateImageryProvider#pickFeatures} will
* request the options.pickFeaturesUrl and attempt to interpret the features included in the response. If false,
* {@link UrlTemplateImageryProvider#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.
* @type {boolean}
* @default true
*/
this.enablePickFeatures = defaultValue(options.enablePickFeatures, true);
}
Object.defineProperties(UrlTemplateImageryProvider.prototype, {
/**
* Gets the URL template to use to request tiles. It has the following keywords:
* {z}: The level of the tile in the tiling scheme. Level zero is the root of the quadtree pyramid.{x}: The tile X coordinate in the tiling scheme, where 0 is the Westernmost tile.{y}: The tile Y coordinate in the tiling scheme, where 0 is the Northernmost tile.{s}: One of the available subdomains, used to overcome browser limits on the number of simultaneous requests per host.{reverseX}: The tile X coordinate in the tiling scheme, where 0 is the Easternmost tile.{reverseY}: The tile Y coordinate in the tiling scheme, where 0 is the Southernmost tile.{reverseZ}: The level of the tile in the tiling scheme, where level zero is the maximum level of the quadtree pyramid. In order to use reverseZ, maximumLevel must be defined.{westDegrees}: The Western edge of the tile in geodetic degrees.{southDegrees}: The Southern edge of the tile in geodetic degrees.{eastDegrees}: The Eastern edge of the tile in geodetic degrees.{northDegrees}: The Northern edge of the tile in geodetic degrees.{westProjected}: The Western edge of the tile in projected coordinates of the tiling scheme.{southProjected}: The Southern edge of the tile in projected coordinates of the tiling scheme.{eastProjected}: The Eastern edge of the tile in projected coordinates of the tiling scheme.{northProjected}: The Northern edge of the tile in projected coordinates of the tiling scheme.{width}: The width of each tile in pixels.{height}: The height of each tile in pixels.{z}: The zero padding for the level of the tile in the tiling scheme.{x}: The zero padding for the tile X coordinate in the tiling scheme.{y}: The zero padding for the the tile Y coordinate in the tiling scheme.{reverseX}: The zero padding for the tile reverseX coordinate in the tiling scheme.{reverseY}: The zero padding for the tile reverseY coordinate in the tiling scheme.{reverseZ}: The zero padding for the reverseZ coordinate of the tile in the tiling scheme.{i}: The pixel column (horizontal coordinate) of the picked position, where the Westernmost pixel is 0.{j}: The pixel row (vertical coordinate) of the picked position, where the Northernmost pixel is 0.{reverseI}: The pixel column (horizontal coordinate) of the picked position, where the Easternmost pixel is 0.{reverseJ}: The pixel row (vertical coordinate) of the picked position, where the Southernmost pixel is 0.{longitudeDegrees}: The longitude of the picked position in degrees.{latitudeDegrees}: The latitude of the picked position in degrees.{longitudeProjected}: The longitude of the picked position in the projected coordinates of the tiling scheme.{latitudeProjected}: The latitude of the picked position in the projected coordinates of the tiling scheme.{format}: The format in which to get feature information, as specified in the {@link GetFeatureInfoFormat}.