123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415 |
- import Cartesian2 from "../Core/Cartesian2.js";
- import Cartographic from "../Core/Cartographic.js";
- import defaultValue from "../Core/defaultValue.js";
- import defined from "../Core/defined.js";
- import DeveloperError from "../Core/DeveloperError.js";
- import GeographicProjection from "../Core/GeographicProjection.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 WebMercatorTilingScheme from "../Core/WebMercatorTilingScheme.js";
- import when from "../ThirdParty/when.js";
- import UrlTemplateImageryProvider from "./UrlTemplateImageryProvider.js";
- function TileMapServiceImageryProvider(options) {
- options = defaultValue(options, defaultValue.EMPTY_OBJECT);
-
- if (!defined(options.url)) {
- throw new DeveloperError("options.url is required.");
- }
-
- var deferred = when.defer();
- UrlTemplateImageryProvider.call(this, deferred.promise);
- this._tmsResource = undefined;
- this._xmlResource = undefined;
- this._options = options;
- this._deferred = deferred;
- this._metadataError = undefined;
- this._metadataSuccess = this._metadataSuccess.bind(this);
- this._metadataFailure = this._metadataFailure.bind(this);
- this._requestMetadata = this._requestMetadata.bind(this);
- var resource;
- var that = this;
- when(options.url)
- .then(function (url) {
- resource = Resource.createIfNeeded(url);
- resource.appendForwardSlash();
- that._tmsResource = resource;
- that._xmlResource = resource.getDerivedResource({
- url: "tilemapresource.xml",
- });
- that._requestMetadata();
- })
- .otherwise(function (e) {
- deferred.reject(e);
- });
- }
- if (defined(Object.create)) {
- TileMapServiceImageryProvider.prototype = Object.create(
- UrlTemplateImageryProvider.prototype
- );
- TileMapServiceImageryProvider.prototype.constructor = TileMapServiceImageryProvider;
- }
- TileMapServiceImageryProvider.prototype._requestMetadata = function () {
-
- this._xmlResource
- .fetchXML()
- .then(this._metadataSuccess)
- .otherwise(this._metadataFailure);
- };
- function confineRectangleToTilingScheme(rectangle, tilingScheme) {
- if (rectangle.west < tilingScheme.rectangle.west) {
- rectangle.west = tilingScheme.rectangle.west;
- }
- if (rectangle.east > tilingScheme.rectangle.east) {
- rectangle.east = tilingScheme.rectangle.east;
- }
- if (rectangle.south < tilingScheme.rectangle.south) {
- rectangle.south = tilingScheme.rectangle.south;
- }
- if (rectangle.north > tilingScheme.rectangle.north) {
- rectangle.north = tilingScheme.rectangle.north;
- }
- return rectangle;
- }
- function calculateSafeMinimumDetailLevel(
- tilingScheme,
- rectangle,
- minimumLevel
- ) {
-
-
-
- var swTile = tilingScheme.positionToTileXY(
- Rectangle.southwest(rectangle),
- minimumLevel
- );
- var neTile = tilingScheme.positionToTileXY(
- Rectangle.northeast(rectangle),
- minimumLevel
- );
- var tileCount =
- (Math.abs(neTile.x - swTile.x) + 1) * (Math.abs(neTile.y - swTile.y) + 1);
- if (tileCount > 4) {
- return 0;
- }
- return minimumLevel;
- }
- TileMapServiceImageryProvider.prototype._metadataSuccess = function (xml) {
- var tileFormatRegex = /tileformat/i;
- var tileSetRegex = /tileset/i;
- var tileSetsRegex = /tilesets/i;
- var bboxRegex = /boundingbox/i;
- var format, bbox, tilesets;
- var tilesetsList = [];
- var xmlResource = this._xmlResource;
- var metadataError = this._metadataError;
- var deferred = this._deferred;
- var requestMetadata = this._requestMetadata;
-
-
- var nodeList = xml.childNodes[0].childNodes;
- for (var i = 0; i < nodeList.length; i++) {
- if (tileFormatRegex.test(nodeList.item(i).nodeName)) {
- format = nodeList.item(i);
- } else if (tileSetsRegex.test(nodeList.item(i).nodeName)) {
- tilesets = nodeList.item(i);
- var tileSetNodes = nodeList.item(i).childNodes;
-
- for (var j = 0; j < tileSetNodes.length; j++) {
- if (tileSetRegex.test(tileSetNodes.item(j).nodeName)) {
-
- tilesetsList.push(tileSetNodes.item(j));
- }
- }
- } else if (bboxRegex.test(nodeList.item(i).nodeName)) {
- bbox = nodeList.item(i);
- }
- }
- var message;
- if (!defined(tilesets) || !defined(bbox)) {
- message =
- "Unable to find expected tilesets or bbox attributes in " +
- xmlResource.url +
- ".";
- metadataError = TileProviderError.handleError(
- metadataError,
- this,
- this.errorEvent,
- message,
- undefined,
- undefined,
- undefined,
- requestMetadata
- );
- if (!metadataError.retry) {
- deferred.reject(new RuntimeError(message));
- }
- this._metadataError = metadataError;
- return;
- }
- var options = this._options;
- var fileExtension = defaultValue(
- options.fileExtension,
- format.getAttribute("extension")
- );
- var tileWidth = defaultValue(
- options.tileWidth,
- parseInt(format.getAttribute("width"), 10)
- );
- var tileHeight = defaultValue(
- options.tileHeight,
- parseInt(format.getAttribute("height"), 10)
- );
- var minimumLevel = defaultValue(
- options.minimumLevel,
- parseInt(tilesetsList[0].getAttribute("order"), 10)
- );
- var maximumLevel = defaultValue(
- options.maximumLevel,
- parseInt(tilesetsList[tilesetsList.length - 1].getAttribute("order"), 10)
- );
- var tilingSchemeName = tilesets.getAttribute("profile");
- var tilingScheme = options.tilingScheme;
- if (!defined(tilingScheme)) {
- if (
- tilingSchemeName === "geodetic" ||
- tilingSchemeName === "global-geodetic"
- ) {
- tilingScheme = new GeographicTilingScheme({
- ellipsoid: options.ellipsoid,
- });
- } else if (
- tilingSchemeName === "mercator" ||
- tilingSchemeName === "global-mercator"
- ) {
- tilingScheme = new WebMercatorTilingScheme({
- ellipsoid: options.ellipsoid,
- });
- } else {
- message =
- xmlResource.url +
- "specifies an unsupported profile attribute, " +
- tilingSchemeName +
- ".";
- metadataError = TileProviderError.handleError(
- metadataError,
- this,
- this.errorEvent,
- message,
- undefined,
- undefined,
- undefined,
- requestMetadata
- );
- if (!metadataError.retry) {
- deferred.reject(new RuntimeError(message));
- }
- this._metadataError = metadataError;
- return;
- }
- }
-
- var rectangle = Rectangle.clone(options.rectangle);
- if (!defined(rectangle)) {
- var sw;
- var ne;
- var swXY;
- var neXY;
-
-
- var flipXY = defaultValue(options.flipXY, false);
- if (flipXY) {
- swXY = new Cartesian2(
- parseFloat(bbox.getAttribute("miny")),
- parseFloat(bbox.getAttribute("minx"))
- );
- neXY = new Cartesian2(
- parseFloat(bbox.getAttribute("maxy")),
- parseFloat(bbox.getAttribute("maxx"))
- );
- } else {
- swXY = new Cartesian2(
- parseFloat(bbox.getAttribute("minx")),
- parseFloat(bbox.getAttribute("miny"))
- );
- neXY = new Cartesian2(
- parseFloat(bbox.getAttribute("maxx")),
- parseFloat(bbox.getAttribute("maxy"))
- );
- }
-
-
-
-
- var isGdal2tiles =
- tilingSchemeName === "geodetic" || tilingSchemeName === "mercator";
- if (
- tilingScheme.projection instanceof GeographicProjection ||
- isGdal2tiles
- ) {
- sw = Cartographic.fromDegrees(swXY.x, swXY.y);
- ne = Cartographic.fromDegrees(neXY.x, neXY.y);
- } else {
- var projection = tilingScheme.projection;
- sw = projection.unproject(swXY);
- ne = projection.unproject(neXY);
- }
- rectangle = new Rectangle(
- sw.longitude,
- sw.latitude,
- ne.longitude,
- ne.latitude
- );
- }
-
- rectangle = confineRectangleToTilingScheme(rectangle, tilingScheme);
-
- minimumLevel = calculateSafeMinimumDetailLevel(
- tilingScheme,
- rectangle,
- minimumLevel
- );
- var templateResource = this._tmsResource.getDerivedResource({
- url: "{z}/{x}/{reverseY}." + fileExtension,
- });
- deferred.resolve({
- url: templateResource,
- tilingScheme: tilingScheme,
- rectangle: rectangle,
- tileWidth: tileWidth,
- tileHeight: tileHeight,
- minimumLevel: minimumLevel,
- maximumLevel: maximumLevel,
- tileDiscardPolicy: options.tileDiscardPolicy,
- credit: options.credit,
- });
- };
- TileMapServiceImageryProvider.prototype._metadataFailure = function (error) {
-
- var options = this._options;
- var fileExtension = defaultValue(options.fileExtension, "png");
- var tileWidth = defaultValue(options.tileWidth, 256);
- var tileHeight = defaultValue(options.tileHeight, 256);
- var maximumLevel = options.maximumLevel;
- var tilingScheme = defined(options.tilingScheme)
- ? options.tilingScheme
- : new WebMercatorTilingScheme({ ellipsoid: options.ellipsoid });
- var rectangle = defaultValue(options.rectangle, tilingScheme.rectangle);
-
- rectangle = confineRectangleToTilingScheme(rectangle, tilingScheme);
-
- var minimumLevel = calculateSafeMinimumDetailLevel(
- tilingScheme,
- rectangle,
- options.maximumLevel
- );
- var templateResource = this._tmsResource.getDerivedResource({
- url: "{z}/{x}/{reverseY}." + fileExtension,
- });
- this._deferred.resolve({
- url: templateResource,
- tilingScheme: tilingScheme,
- rectangle: rectangle,
- tileWidth: tileWidth,
- tileHeight: tileHeight,
- minimumLevel: minimumLevel,
- maximumLevel: maximumLevel,
- tileDiscardPolicy: options.tileDiscardPolicy,
- credit: options.credit,
- });
- };
- export default TileMapServiceImageryProvider;
|