@cesium/engine
Version:
CesiumJS is a JavaScript library for creating 3D globes and 2D maps in a web browser without a plugin.
381 lines (346 loc) • 11.1 kB
JavaScript
import Check from "../Core/Check.js";
import Credit from "../Core/Credit.js";
import Frozen from "../Core/Frozen.js";
import defined from "../Core/defined.js";
import Event from "../Core/Event.js";
import GeographicTilingScheme from "../Core/GeographicTilingScheme.js";
import Rectangle from "../Core/Rectangle.js";
import Resource from "../Core/Resource.js";
import RuntimeError from "../Core/RuntimeError.js";
import TileProviderError from "../Core/TileProviderError.js";
import ImageryProvider from "./ImageryProvider.js";
/**
* @typedef {object} SingleTileImageryProvider.ConstructorOptions
*
* Initialization options for the SingleTileImageryProvider constructor
*
* @property {Resource|string} url The url for the tile.
* @property {number} [tileWidth] The width of the tile, in pixels.
* @property {number} [tileHeight] The height of the tile, in pixels.
* @property {Rectangle} [rectangle=Rectangle.MAX_VALUE] The rectangle, in radians, covered by the image.
* @property {Credit|string} [credit] A credit for the data source, which is displayed on the canvas.
* @property {Ellipsoid} [ellipsoid] The ellipsoid. If not specified, the WGS84 ellipsoid is used.
*/
/**
* Provides a single, top-level imagery tile. The single image is assumed to be in
* the Geographic projection (i.e. WGS84 / EPSG:4326),
* and will be rendered using a {@link GeographicTilingScheme}.
*
* @alias SingleTileImageryProvider
* @constructor
*
* @param {SingleTileImageryProvider.ConstructorOptions} options Object describing initialization options
*
* @see ArcGisMapServerImageryProvider
* @see BingMapsImageryProvider
* @see GoogleEarthEnterpriseMapsProvider
* @see OpenStreetMapImageryProvider
* @see TileMapServiceImageryProvider
* @see WebMapServiceImageryProvider
* @see WebMapTileServiceImageryProvider
* @see UrlTemplateImageryProvider
*/
function SingleTileImageryProvider(options) {
options = options ?? Frozen.EMPTY_OBJECT;
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;
const rectangle = options.rectangle ?? Rectangle.MAX_VALUE;
const tilingScheme = new GeographicTilingScheme({
rectangle: rectangle,
numberOfLevelZeroTilesX: 1,
numberOfLevelZeroTilesY: 1,
ellipsoid: options.ellipsoid,
});
this._tilingScheme = tilingScheme;
this._image = undefined;
this._texture = undefined;
this._hasError = false;
this._errorEvent = new Event();
let credit = options.credit;
if (typeof credit === "string") {
credit = new Credit(credit);
}
this._credit = credit;
//>>includeStart('debug', pragmas.debug);
Check.defined("options.url", options.url);
//>>includeEnd('debug');
const resource = Resource.createIfNeeded(options.url);
this._resource = resource;
//>>includeStart('debug', pragmas.debug);
Check.typeOf.number("options.tileWidth", options.tileWidth);
Check.typeOf.number("options.tileHeight", options.tileHeight);
//>>includeEnd('debug');
this._tileWidth = options.tileWidth;
this._tileHeight = options.tileHeight;
}
Object.defineProperties(SingleTileImageryProvider.prototype, {
/**
* Gets the URL of the single, top-level imagery tile.
* @memberof SingleTileImageryProvider.prototype
* @type {string}
* @readonly
*/
url: {
get: function () {
return this._resource.url;
},
},
/**
* Gets the proxy used by this provider.
* @memberof SingleTileImageryProvider.prototype
* @type {Proxy}
* @readonly
*/
proxy: {
get: function () {
return this._resource.proxy;
},
},
/**
* Gets the width of each tile, in pixels.
* @memberof SingleTileImageryProvider.prototype
* @type {number}
* @readonly
*/
tileWidth: {
get: function () {
return this._tileWidth;
},
},
/**
* Gets the height of each tile, in pixels.
* @memberof SingleTileImageryProvider.prototype
* @type {number}
* @readonly
*/
tileHeight: {
get: function () {
return this._tileHeight;
},
},
/**
* Gets the maximum level-of-detail that can be requested.
* @memberof SingleTileImageryProvider.prototype
* @type {number|undefined}
* @readonly
*/
maximumLevel: {
get: function () {
return 0;
},
},
/**
* Gets the minimum level-of-detail that can be requested.
* @memberof SingleTileImageryProvider.prototype
* @type {number}
* @readonly
*/
minimumLevel: {
get: function () {
return 0;
},
},
/**
* Gets the tiling scheme used by this provider.
* @memberof SingleTileImageryProvider.prototype
* @type {TilingScheme}
* @readonly
*/
tilingScheme: {
get: function () {
return this._tilingScheme;
},
},
/**
* Gets the rectangle, in radians, of the imagery provided by this instance.
* @memberof SingleTileImageryProvider.prototype
* @type {Rectangle}
* @readonly
*/
rectangle: {
get: function () {
return this._tilingScheme.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 SingleTileImageryProvider.prototype
* @type {TileDiscardPolicy}
* @readonly
*/
tileDiscardPolicy: {
get: function () {
return undefined;
},
},
/**
* 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 SingleTileImageryProvider.prototype
* @type {Event}
* @readonly
*/
errorEvent: {
get: function () {
return this._errorEvent;
},
},
/**
* Gets the credit to display when this imagery provider is active. Typically this is used to credit
* the source of the imagery.
* @memberof SingleTileImageryProvider.prototype
* @type {Credit}
* @readonly
*/
credit: {
get: function () {
return this._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 SingleTileImageryProvider.prototype
* @type {boolean}
* @readonly
*/
hasAlphaChannel: {
get: function () {
return true;
},
},
});
function failure(resource, error, provider, previousError) {
let message = `Failed to load image ${resource.url}`;
if (defined(error) && defined(error.message)) {
message += `: ${error.message}`;
}
const reportedError = TileProviderError.reportError(
previousError,
provider,
defined(provider) ? provider._errorEvent : undefined,
message,
0,
0,
0,
error,
);
if (reportedError.retry) {
return doRequest(resource, provider, reportedError);
}
if (defined(provider)) {
provider._hasError = true;
}
throw new RuntimeError(message);
}
async function doRequest(resource, provider, previousError) {
try {
const image = await ImageryProvider.loadImage(null, resource);
return image;
} catch (error) {
return failure(resource, error, provider, previousError);
}
}
/**
* @typedef {object} SingleTileImageryProvider.fromUrlOptions
*
* Initialization options for the SingleTileImageryProvider constructor when using SingleTileImageryProvider.fromUrl
*
* @property {Rectangle} [rectangle=Rectangle.MAX_VALUE] The rectangle, in radians, covered by the image.
* @property {Credit|string} [credit] A credit for the data source, which is displayed on the canvas.
* @property {Ellipsoid} [ellipsoid] The ellipsoid. If not specified, the WGS84 ellipsoid is used.
*/
/**
* Creates a provider for a single, top-level imagery tile. The single image is assumed to use a
* @param {Resource|string} url The url for the tile
* @param {SingleTileImageryProvider.fromUrlOptions} [options] Object describing initialization options.
* @returns {Promise.<SingleTileImageryProvider>} The resolved SingleTileImageryProvider.
*
* @example
* const provider = await SingleTileImageryProvider.fromUrl("https://yoururl.com/image.png");
*/
SingleTileImageryProvider.fromUrl = async function (url, options) {
//>>includeStart('debug', pragmas.debug);
Check.defined("url", url);
//>>includeEnd('debug');
const resource = Resource.createIfNeeded(url);
const image = await doRequest(resource);
options = options ?? Frozen.EMPTY_OBJECT;
const provider = new SingleTileImageryProvider({
...options,
url: url,
tileWidth: image.width,
tileHeight: image.height,
});
provider._image = image;
return provider;
};
/**
* 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.
*/
SingleTileImageryProvider.prototype.getTileCredits = function (x, y, level) {
return undefined;
};
/**
* 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.<ImageryTypes>|undefined} The resolved image
*/
SingleTileImageryProvider.prototype.requestImage = async function (
x,
y,
level,
request,
) {
if (!this._hasError && !defined(this._image)) {
const image = await doRequest(this._resource, this);
this._image = image;
TileProviderError.reportSuccess(this._errorEvent);
return image;
}
return this._image;
};
/**
* Picking features is not currently supported by this imagery provider, so this function simply returns
* undefined.
*
* @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 {undefined} Undefined since picking is not supported.
*/
SingleTileImageryProvider.prototype.pickFeatures = function (
x,
y,
level,
longitude,
latitude,
) {
return undefined;
};
export default SingleTileImageryProvider;