package.source.UrlTile.js Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of ol Show documentation
Show all versions of ol Show documentation
OpenLayers mapping library
The newest version!
/**
* @module ol/source/UrlTile
*/
import TileEventType from './TileEventType.js';
import TileSource, {TileSourceEvent} from './Tile.js';
import TileState from '../TileState.js';
import {createFromTemplates} from '../tileurlfunction.js';
import {expandUrl} from '../uri.js';
import {getUid} from '../util.js';
/**
* @typedef {Object} Options
* @property {import("./Source.js").AttributionLike} [attributions] Attributions.
* @property {boolean} [attributionsCollapsible=true] Attributions are collapsible.
* @property {number} [cacheSize] Deprecated. Use the cacheSize option on the layer instead.
* @property {import("../proj.js").ProjectionLike} [projection] Projection.
* @property {import("./Source.js").State} [state] State.
* @property {import("../tilegrid/TileGrid.js").default} [tileGrid] TileGrid.
* @property {import("../Tile.js").LoadFunction} tileLoadFunction TileLoadFunction.
* @property {number} [tilePixelRatio] TilePixelRatio.
* @property {import("../Tile.js").UrlFunction} [tileUrlFunction] Deprecated. Use an ImageTile source and provide a function
* for the url option instead.
* @property {string} [url] Url.
* @property {Array} [urls] Urls.
* @property {boolean} [wrapX=true] WrapX.
* @property {number} [transition] Transition.
* @property {string} [key] Key.
* @property {number|import("../array.js").NearestDirectionFunction} [zDirection=0] ZDirection.
* @property {boolean} [interpolate=false] Use interpolated values when resampling. By default,
* the nearest neighbor is used when resampling.
*/
/**
* @deprecated Use the ol/source/ImageTile.js instead.
*
* @fires import("./Tile.js").TileSourceEvent
*/
class UrlTile extends TileSource {
/**
* @param {Options} options Image tile options.
*/
constructor(options) {
super({
attributions: options.attributions,
cacheSize: options.cacheSize,
projection: options.projection,
state: options.state,
tileGrid: options.tileGrid,
tilePixelRatio: options.tilePixelRatio,
wrapX: options.wrapX,
transition: options.transition,
interpolate: options.interpolate,
key: options.key,
attributionsCollapsible: options.attributionsCollapsible,
zDirection: options.zDirection,
});
/**
* @private
* @type {boolean}
*/
this.generateTileUrlFunction_ =
this.tileUrlFunction === UrlTile.prototype.tileUrlFunction;
/**
* @protected
* @type {import("../Tile.js").LoadFunction}
*/
this.tileLoadFunction = options.tileLoadFunction;
if (options.tileUrlFunction) {
this.tileUrlFunction = options.tileUrlFunction;
}
/**
* @protected
* @type {!Array|null}
*/
this.urls = null;
if (options.urls) {
this.setUrls(options.urls);
} else if (options.url) {
this.setUrl(options.url);
}
/**
* @private
* @type {!Object}
*/
this.tileLoadingKeys_ = {};
}
/**
* Deprecated. Use an ImageTile source instead.
* Return the tile load function of the source.
* @return {import("../Tile.js").LoadFunction} TileLoadFunction
* @api
*/
getTileLoadFunction() {
return this.tileLoadFunction;
}
/**
* Deprecated. Use an ImageTile source instead.
* Return the tile URL function of the source.
* @return {import("../Tile.js").UrlFunction} TileUrlFunction
* @api
*/
getTileUrlFunction() {
return Object.getPrototypeOf(this).tileUrlFunction === this.tileUrlFunction
? this.tileUrlFunction.bind(this)
: this.tileUrlFunction;
}
/**
* Deprecated. Use an ImageTile source instead.
* Return the URLs used for this source.
* When a tileUrlFunction is used instead of url or urls,
* null will be returned.
* @return {!Array|null} URLs.
* @api
*/
getUrls() {
return this.urls;
}
/**
* Handle tile change events.
* @param {import("../events/Event.js").default} event Event.
* @protected
*/
handleTileChange(event) {
const tile = /** @type {import("../Tile.js").default} */ (event.target);
const uid = getUid(tile);
const tileState = tile.getState();
let type;
if (tileState == TileState.LOADING) {
this.tileLoadingKeys_[uid] = true;
type = TileEventType.TILELOADSTART;
} else if (uid in this.tileLoadingKeys_) {
delete this.tileLoadingKeys_[uid];
type =
tileState == TileState.ERROR
? TileEventType.TILELOADERROR
: tileState == TileState.LOADED
? TileEventType.TILELOADEND
: undefined;
}
if (type != undefined) {
this.dispatchEvent(new TileSourceEvent(type, tile));
}
}
/**
* Deprecated. Use an ImageTile source instead.
* Set the tile load function of the source.
* @param {import("../Tile.js").LoadFunction} tileLoadFunction Tile load function.
* @api
*/
setTileLoadFunction(tileLoadFunction) {
this.tileLoadFunction = tileLoadFunction;
this.changed();
}
/**
* Deprecated. Use an ImageTile source instead.
* Set the tile URL function of the source.
* @param {import("../Tile.js").UrlFunction} tileUrlFunction Tile URL function.
* @param {string} [key] Optional new tile key for the source.
* @api
*/
setTileUrlFunction(tileUrlFunction, key) {
this.tileUrlFunction = tileUrlFunction;
if (typeof key !== 'undefined') {
this.setKey(key);
} else {
this.changed();
}
}
/**
* Set the URL to use for requests.
* @param {string} url URL.
* @api
*/
setUrl(url) {
const urls = expandUrl(url);
this.urls = urls;
this.setUrls(urls);
}
/**
* Deprecated. Use an ImageTile source instead.
* Set the URLs to use for requests.
* @param {Array} urls URLs.
* @api
*/
setUrls(urls) {
this.urls = urls;
const key = urls.join('\n');
if (this.generateTileUrlFunction_) {
this.setTileUrlFunction(createFromTemplates(urls, this.tileGrid), key);
} else {
this.setKey(key);
}
}
/**
* @param {import("../tilecoord.js").TileCoord} tileCoord Tile coordinate.
* @param {number} pixelRatio Pixel ratio.
* @param {import("../proj/Projection.js").default} projection Projection.
* @return {string|undefined} Tile URL.
*/
tileUrlFunction(tileCoord, pixelRatio, projection) {
return undefined;
}
}
export default UrlTile;