From 2c7febcbc2e98fef21b3988ccb62e615c5742668 Mon Sep 17 00:00:00 2001 From: hpinkos Date: Fri, 9 Feb 2018 15:25:42 -0500 Subject: [PATCH 01/10] createOpenStreetMapImageryProvider -> OpenStreetMapImageryProvider createTileMapServiceImageryProvider -> TileMapServiceImageryProvider --- Apps/CesiumViewer/CesiumViewer.js | 6 +- .../gallery/Imagery Layers Manipulation.html | 4 +- .../gallery/Imagery Layers Split.html | 2 +- .../Imagery Layers Texture Filters.html | 4 +- Apps/Sandcastle/gallery/Imagery Layers.html | 2 +- Apps/Sandcastle/gallery/Offline.html | 2 +- CHANGES.md | 4 + Source/Core/CesiumTerrainProvider.js | 2 +- .../Scene/ArcGisMapServerImageryProvider.js | 4 +- Source/Scene/BingMapsImageryProvider.js | 4 +- Source/Scene/CesiumIon.js | 10 +- Source/Scene/CesiumIonResource.js | 22 +- .../GoogleEarthEnterpriseImageryProvider.js | 4 +- .../GoogleEarthEnterpriseMapsProvider.js | 4 +- Source/Scene/ImageryProvider.js | 4 +- Source/Scene/OpenStreetMapImageryProvider.js | 145 ++++++++++ Source/Scene/SingleTileImageryProvider.js | 4 +- Source/Scene/TileMapServiceImageryProvider.js | 256 ++++++++++++++++++ Source/Scene/UrlTemplateImageryProvider.js | 4 +- Source/Scene/WebMapServiceImageryProvider.js | 4 +- .../Scene/WebMapTileServiceImageryProvider.js | 4 +- .../createOpenStreetMapImageryProvider.js | 80 +----- .../createTileMapServiceImageryProvider.js | 236 +--------------- .../BaseLayerPicker/BaseLayerPicker.js | 6 +- .../createDefaultImageryProviderViewModels.js | 18 +- Source/Widgets/CesiumWidget/CesiumWidget.js | 2 +- Specs/Scene/ImageryLayerSpec.js | 10 +- ...js => OpenStreetMapImageryProviderSpec.js} | 32 +-- ...s => TileMapServiceImageryProviderSpec.js} | 60 ++-- 29 files changed, 521 insertions(+), 418 deletions(-) create mode 100644 Source/Scene/OpenStreetMapImageryProvider.js create mode 100644 Source/Scene/TileMapServiceImageryProvider.js rename Specs/Scene/{createOpenStreetMapImageryProviderSpec.js => OpenStreetMapImageryProviderSpec.js} (91%) rename Specs/Scene/{createTileMapServiceImageryProviderSpec.js => TileMapServiceImageryProviderSpec.js} (94%) diff --git a/Apps/CesiumViewer/CesiumViewer.js b/Apps/CesiumViewer/CesiumViewer.js index 73edd88034f6..7b80fcbceee0 100644 --- a/Apps/CesiumViewer/CesiumViewer.js +++ b/Apps/CesiumViewer/CesiumViewer.js @@ -8,7 +8,7 @@ define([ 'Cesium/DataSources/CzmlDataSource', 'Cesium/DataSources/GeoJsonDataSource', 'Cesium/DataSources/KmlDataSource', - 'Cesium/Scene/createTileMapServiceImageryProvider', + 'Cesium/Scene/TileMapServiceImageryProvider', 'Cesium/Widgets/Viewer/Viewer', 'Cesium/Widgets/Viewer/viewerCesiumInspectorMixin', 'Cesium/Widgets/Viewer/viewerDragDropMixin', @@ -23,7 +23,7 @@ define([ CzmlDataSource, GeoJsonDataSource, KmlDataSource, - createTileMapServiceImageryProvider, + TileMapServiceImageryProvider, Viewer, viewerCesiumInspectorMixin, viewerDragDropMixin) { @@ -44,7 +44,7 @@ define([ var imageryProvider; if (endUserOptions.tmsImageryUrl) { - imageryProvider = createTileMapServiceImageryProvider({ + imageryProvider = new TileMapServiceImageryProvider({ url : endUserOptions.tmsImageryUrl }); } diff --git a/Apps/Sandcastle/gallery/Imagery Layers Manipulation.html b/Apps/Sandcastle/gallery/Imagery Layers Manipulation.html index 750c94a67c94..ea75de15216a 100644 --- a/Apps/Sandcastle/gallery/Imagery Layers Manipulation.html +++ b/Apps/Sandcastle/gallery/Imagery Layers Manipulation.html @@ -139,7 +139,7 @@ })); addBaseLayerOption( 'Natural Earth II (local)', - Cesium.createTileMapServiceImageryProvider({ + new Cesium.TileMapServiceImageryProvider({ url : Cesium.buildModuleUrl('Assets/Textures/NaturalEarthII') })); addBaseLayerOption( @@ -179,7 +179,7 @@ })); addAdditionalLayerOption( 'TileMapService Image', - Cesium.createTileMapServiceImageryProvider({ + new Cesium.TileMapServiceImageryProvider({ url : '../images/cesium_maptiler/Cesium_Logo_Color' }), 0.2); diff --git a/Apps/Sandcastle/gallery/Imagery Layers Split.html b/Apps/Sandcastle/gallery/Imagery Layers Split.html index 2ea5e9fefb00..6fbbfe19df40 100644 --- a/Apps/Sandcastle/gallery/Imagery Layers Split.html +++ b/Apps/Sandcastle/gallery/Imagery Layers Split.html @@ -58,7 +58,7 @@ }); var layers = viewer.imageryLayers; -var blackMarble = layers.addImageryProvider(Cesium.createTileMapServiceImageryProvider({ +var blackMarble = layers.addImageryProvider(new Cesium.TileMapServiceImageryProvider({ url : 'https://cesiumjs.org/blackmarble', credit : 'Black Marble imagery courtesy NASA Earth Observatory', flipXY : true // Only old gdal2tile.py generated tilesets need this flag. diff --git a/Apps/Sandcastle/gallery/Imagery Layers Texture Filters.html b/Apps/Sandcastle/gallery/Imagery Layers Texture Filters.html index c82ceb588ff8..f32c38509572 100644 --- a/Apps/Sandcastle/gallery/Imagery Layers Texture Filters.html +++ b/Apps/Sandcastle/gallery/Imagery Layers Texture Filters.html @@ -55,11 +55,11 @@ var layers = viewer.imageryLayers; layers.removeAll(); -var layerLinear = layers.addImageryProvider(Cesium.createTileMapServiceImageryProvider({ +var layerLinear = layers.addImageryProvider(new Cesium.TileMapServiceImageryProvider({ url : require.toUrl('Assets/Textures/NaturalEarthII') })); -var layerNearest = layers.addImageryProvider(Cesium.createTileMapServiceImageryProvider({ +var layerNearest = layers.addImageryProvider(new Cesium.TileMapServiceImageryProvider({ url : require.toUrl('Assets/Textures/NaturalEarthII') })); diff --git a/Apps/Sandcastle/gallery/Imagery Layers.html b/Apps/Sandcastle/gallery/Imagery Layers.html index 524d60262158..317b4f499fa7 100644 --- a/Apps/Sandcastle/gallery/Imagery Layers.html +++ b/Apps/Sandcastle/gallery/Imagery Layers.html @@ -35,7 +35,7 @@ }); var layers = viewer.imageryLayers; -var blackMarble = layers.addImageryProvider(Cesium.createTileMapServiceImageryProvider({ +var blackMarble = layers.addImageryProvider(new Cesium.TileMapServiceImageryProvider({ url : 'https://cesiumjs.org/blackmarble', credit : 'Black Marble imagery courtesy NASA Earth Observatory', flipXY : true // Only old gdal2tile.py generated tilesets need this flag. diff --git a/Apps/Sandcastle/gallery/Offline.html b/Apps/Sandcastle/gallery/Offline.html index 36d02c454644..dd503233b8d4 100644 --- a/Apps/Sandcastle/gallery/Offline.html +++ b/Apps/Sandcastle/gallery/Offline.html @@ -33,7 +33,7 @@ // https://github.com/AnalyticalGraphicsInc/cesium/wiki/Offline-Guide var viewer = new Cesium.Viewer('cesiumContainer', { - imageryProvider : Cesium.createTileMapServiceImageryProvider({ + imageryProvider : new Cesium.TileMapServiceImageryProvider({ url : Cesium.buildModuleUrl('Assets/Textures/NaturalEarthII') }), baseLayerPicker : false, diff --git a/CHANGES.md b/CHANGES.md index 0dcfd8ed5311..9821e38cdb50 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -3,8 +3,12 @@ Change Log ### 1.43 - 2018-03-01 +##### Deprecated :hourglass_flowing_sand: +* `createTileMapServiceImageryProvider` and `createOpenStreetMapImageryProvider` have been deprecated and will be removed in Cesium 1.46. Instead, pass the same options to `new TileMapServiceImageryProvider` and `new OpenStreetMapImageryProvider` respectively. + ##### Fixes :wrench: * Fixed bug where AxisAlignedBoundingBox did not copy over center value when cloning an undefined result. [#6183](https://github.com/AnalyticalGraphicsInc/cesium/pull/6183) +* Added `TileMapResourceImageryProvider` and `OpenStreetMapImageryProvider` classes to improve API consistency: [#4812](https://github.com/AnalyticalGraphicsInc/cesium/issues/4812) ### 1.42.1 - 2018-02-01 _This is an npm-only release to fix an issue with using Cesium in Node.js.__ diff --git a/Source/Core/CesiumTerrainProvider.js b/Source/Core/CesiumTerrainProvider.js index 613c0b95e708..d00bdb9f2ffe 100644 --- a/Source/Core/CesiumTerrainProvider.js +++ b/Source/Core/CesiumTerrainProvider.js @@ -85,7 +85,7 @@ define([ * * // Terrain geometry near the surface of the globe is difficult to view when using NaturalEarthII imagery, * // unless the TerrainProvider provides additional lighting information to shade the terrain (as shown above). - * var imageryProvider = Cesium.createTileMapServiceImageryProvider({ + * var imageryProvider = new Cesium.TileMapServiceImageryProvider({ * url : 'http://localhost:8080/Source/Assets/Textures/NaturalEarthII', * fileExtension : 'jpg' * }); diff --git a/Source/Scene/ArcGisMapServerImageryProvider.js b/Source/Scene/ArcGisMapServerImageryProvider.js index c6a6cf8d06b5..343e3701426e 100644 --- a/Source/Scene/ArcGisMapServerImageryProvider.js +++ b/Source/Scene/ArcGisMapServerImageryProvider.js @@ -90,9 +90,9 @@ define([ * * @see BingMapsImageryProvider * @see GoogleEarthEnterpriseMapsProvider - * @see createOpenStreetMapImageryProvider + * @see OpenStreetMapImageryProvider * @see SingleTileImageryProvider - * @see createTileMapServiceImageryProvider + * @see TileMapServiceImageryProvider * @see WebMapServiceImageryProvider * @see WebMapTileServiceImageryProvider * @see UrlTemplateImageryProvider diff --git a/Source/Scene/BingMapsImageryProvider.js b/Source/Scene/BingMapsImageryProvider.js index 14a284d1645e..f288ca4e8fb8 100644 --- a/Source/Scene/BingMapsImageryProvider.js +++ b/Source/Scene/BingMapsImageryProvider.js @@ -75,9 +75,9 @@ define([ * * @see ArcGisMapServerImageryProvider * @see GoogleEarthEnterpriseMapsProvider - * @see createOpenStreetMapImageryProvider + * @see OpenStreetMapImageryProvider * @see SingleTileImageryProvider - * @see createTileMapServiceImageryProvider + * @see TileMapServiceImageryProvider * @see WebMapServiceImageryProvider * @see WebMapTileServiceImageryProvider * @see UrlTemplateImageryProvider diff --git a/Source/Scene/CesiumIon.js b/Source/Scene/CesiumIon.js index 28540e4f41c8..9b50c592cf12 100644 --- a/Source/Scene/CesiumIon.js +++ b/Source/Scene/CesiumIon.js @@ -11,10 +11,10 @@ define([ './BingMapsImageryProvider', './Cesium3DTileset', './CesiumIonResource', - './createTileMapServiceImageryProvider', './GoogleEarthEnterpriseMapsProvider', './MapboxImageryProvider', './SingleTileImageryProvider', + './TileMapServiceImageryProvider', './UrlTemplateImageryProvider', './WebMapServiceImageryProvider', './WebMapTileServiceImageryProvider' @@ -31,10 +31,10 @@ define([ BingMapsImageryProvider, Cesium3DTileset, CesiumIonResource, - createTileMapServiceImageryProvider, GoogleEarthEnterpriseMapsProvider, MapboxImageryProvider, SingleTileImageryProvider, + TileMapServiceImageryProvider, UrlTemplateImageryProvider, WebMapServiceImageryProvider, WebMapTileServiceImageryProvider) { @@ -93,7 +93,7 @@ define([ * //Load an ImageryProvider with asset ID of 2347923 * Cesium.CesiumIon.createResource(2347923) * .then(function (resource) { - * viewer.imageryLayers.addProvider(Cesium.createTileMapServiceImageryProvider({url : resource })); + * viewer.imageryLayers.addProvider(new Cesium.TileMapServiceImageryProvider({url : resource })); * }); */ CesiumIon.createResource = function(assetId, options) { @@ -155,7 +155,7 @@ define([ GOOGLE_EARTH: createFactory(GoogleEarthEnterpriseMapsProvider), MAPBOX: createFactory(MapboxImageryProvider), SINGLE_TILE: createFactory(SingleTileImageryProvider), - TMS: createTileMapServiceImageryProvider, + TMS: createFactory(TileMapServiceImageryProvider), URL_TEMPLATE: createFactory(UrlTemplateImageryProvider), WMS: createFactory(WebMapServiceImageryProvider), WMTS: createFactory(WebMapTileServiceImageryProvider) @@ -191,7 +191,7 @@ define([ var externalType = endpoint.externalType; if (!defined(externalType)) { - return createTileMapServiceImageryProvider({ + return new TileMapServiceImageryProvider({ url: CesiumIonResource.create(endpoint, endpointResource) }); } diff --git a/Source/Scene/CesiumIonResource.js b/Source/Scene/CesiumIonResource.js index c23d85384868..e82f55286134 100644 --- a/Source/Scene/CesiumIonResource.js +++ b/Source/Scene/CesiumIonResource.js @@ -5,16 +5,7 @@ define([ '../Core/loadJson', '../Core/Resource', '../Core/RuntimeError', - '../ThirdParty/when', - './ArcGisMapServerImageryProvider', - './BingMapsImageryProvider', - './createTileMapServiceImageryProvider', - './GoogleEarthEnterpriseMapsProvider', - './MapboxImageryProvider', - './SingleTileImageryProvider', - './UrlTemplateImageryProvider', - './WebMapServiceImageryProvider', - './WebMapTileServiceImageryProvider' + '../ThirdParty/when' ], function( Check, defaultValue, @@ -22,16 +13,7 @@ define([ loadJson, Resource, RuntimeError, - when, - ArcGisMapServerImageryProvider, - BingMapsImageryProvider, - createTileMapServiceImageryProvider, - GoogleEarthEnterpriseMapsProvider, - MapboxImageryProvider, - SingleTileImageryProvider, - UrlTemplateImageryProvider, - WebMapServiceImageryProvider, - WebMapTileServiceImageryProvider) { + when) { 'use strict'; /** diff --git a/Source/Scene/GoogleEarthEnterpriseImageryProvider.js b/Source/Scene/GoogleEarthEnterpriseImageryProvider.js index e3602588038d..c6d4cad19262 100644 --- a/Source/Scene/GoogleEarthEnterpriseImageryProvider.js +++ b/Source/Scene/GoogleEarthEnterpriseImageryProvider.js @@ -83,9 +83,9 @@ define([ * @see GoogleEarthEnterpriseTerrainProvider * @see ArcGisMapServerImageryProvider * @see GoogleEarthEnterpriseMapsProvider - * @see createOpenStreetMapImageryProvider + * @see OpenStreetMapImageryProvider * @see SingleTileImageryProvider - * @see createTileMapServiceImageryProvider + * @see TileMapServiceImageryProvider * @see WebMapServiceImageryProvider * @see WebMapTileServiceImageryProvider * @see UrlTemplateImageryProvider diff --git a/Source/Scene/GoogleEarthEnterpriseMapsProvider.js b/Source/Scene/GoogleEarthEnterpriseMapsProvider.js index a1dbe9a1bd35..23b25861f02a 100644 --- a/Source/Scene/GoogleEarthEnterpriseMapsProvider.js +++ b/Source/Scene/GoogleEarthEnterpriseMapsProvider.js @@ -84,9 +84,9 @@ define([ * * @see ArcGisMapServerImageryProvider * @see BingMapsImageryProvider - * @see createOpenStreetMapImageryProvider + * @see OpenStreetMapImageryProvider * @see SingleTileImageryProvider - * @see createTileMapServiceImageryProvider + * @see TileMapServiceImageryProvider * @see WebMapServiceImageryProvider * @see WebMapTileServiceImageryProvider * @see UrlTemplateImageryProvider diff --git a/Source/Scene/ImageryProvider.js b/Source/Scene/ImageryProvider.js index ee8e77b37f30..669adcf5f0e5 100644 --- a/Source/Scene/ImageryProvider.js +++ b/Source/Scene/ImageryProvider.js @@ -27,8 +27,8 @@ define([ * * @see ArcGisMapServerImageryProvider * @see BingMapsImageryProvider - * @see createOpenStreetMapImageryProvider - * @see createTileMapServiceImageryProvider + * @see OpenStreetMapImageryProvider + * @see TileMapServiceImageryProvider * @see GoogleEarthEnterpriseImageryProvider * @see GoogleEarthEnterpriseMapsProvider * @see GridImageryProvider diff --git a/Source/Scene/OpenStreetMapImageryProvider.js b/Source/Scene/OpenStreetMapImageryProvider.js new file mode 100644 index 000000000000..52cc9fee1035 --- /dev/null +++ b/Source/Scene/OpenStreetMapImageryProvider.js @@ -0,0 +1,145 @@ +define([ + '../Core/Cartesian2', + '../Core/Cartesian3', + '../Core/Cartographic', + '../Core/appendForwardSlash', + '../Core/clone', + '../Core/combine', + '../Core/Credit', + '../Core/defaultValue', + '../Core/defined', + '../Core/defineProperties', + '../Core/deprecationWarning', + '../Core/DeveloperError', + '../Core/Event', + '../Core/GeographicTilingScheme', + '../Core/isArray', + '../Core/Math', + '../Core/Rectangle', + '../Core/Resource', + '../Core/WebMercatorTilingScheme', + '../ThirdParty/when', + './UrlTemplateImageryProvider' +], function( + Cartesian2, + Cartesian3, + Cartographic, + appendForwardSlash, + clone, + combine, + Credit, + defaultValue, + defined, + defineProperties, + deprecationWarning, + DeveloperError, + Event, + GeographicTilingScheme, + isArray, + CesiumMath, + Rectangle, + Resource, + WebMercatorTilingScheme, + when, + UrlTemplateImageryProvider) { + 'use strict'; + + var defaultCredit = new Credit({text: 'MapQuest, Open Street Map and contributors, CC-BY-SA'}); + + /** + * An imagery provider that provides tiled imagery hosted by OpenStreetMap + * or another provider of Slippy tiles. The default url connects to OpenStreetMap's volunteer-run + * servers, so you must conform to their + * {@link http://wiki.openstreetmap.org/wiki/Tile_usage_policy|Tile Usage Policy}. + * + * @param {Object} [options] Object with the following properties: + * @param {String} [options.url='https://a.tile.openstreetmap.org'] The OpenStreetMap server url. + * @param {String} [options.fileExtension='png'] The file extension for images on the server. + * @param {Rectangle} [options.rectangle=Rectangle.MAX_VALUE] The rectangle of the layer. + * @param {Number} [options.minimumLevel=0] The minimum level-of-detail supported by the imagery provider. + * @param {Number} [options.maximumLevel] The maximum level-of-detail supported by the imagery provider, or undefined if there is no limit. + * @param {Ellipsoid} [options.ellipsoid] The ellipsoid. If not specified, the WGS84 ellipsoid is used. + * @param {Credit|String} [options.credit='MapQuest, Open Street Map and contributors, CC-BY-SA'] A credit for the data source, which is displayed on the canvas. + * @returns {UrlTemplateImageryProvider} The imagery provider. + * + * @exception {DeveloperError} The rectangle and minimumLevel indicate that there are more than four tiles at the minimum level. Imagery providers with more than four tiles at the minimum level are not supported. + * + * @see ArcGisMapServerImageryProvider + * @see BingMapsImageryProvider + * @see GoogleEarthEnterpriseMapsProvider + * @see SingleTileImageryProvider + * @see TileMapServiceImageryProvider + * @see WebMapServiceImageryProvider + * @see WebMapTileServiceImageryProvider + * @see UrlTemplateImageryProvider + * + * + * @example + * var osm = new Cesium.OpenStreetMapImageryProvider({ + * url : 'https://a.tile.openstreetmap.org/' + * }); + * + * @see {@link http://wiki.openstreetmap.org/wiki/Main_Page|OpenStreetMap Wiki} + * @see {@link http://www.w3.org/TR/cors/|Cross-Origin Resource Sharing} + */ + function OpenStreetMapImageryProvider(options) { + options = defaultValue(options, {}); + + var url = defaultValue(options.url, 'https://a.tile.openstreetmap.org/'); + url = appendForwardSlash(url); + url += '{z}/{x}/{y}.' + defaultValue(options.fileExtension, 'png'); + + if (defined(options.proxy)) { + deprecationWarning('OpenStreetMapImageryProvider.proxy', 'The options.proxy parameter has been deprecated. Specify options.url as a Resource instance and set the proxy property there.'); + } + + var resource = Resource.createIfNeeded(url, { + proxy: options.proxy + }); + + var tilingScheme = new WebMercatorTilingScheme({ ellipsoid : options.ellipsoid }); + + var tileWidth = 256; + var tileHeight = 256; + + var minimumLevel = defaultValue(options.minimumLevel, 0); + var maximumLevel = options.maximumLevel; + + var rectangle = defaultValue(options.rectangle, tilingScheme.rectangle); + + // Check the number of tiles at the minimum level. If it's more than four, + // throw an exception, because starting at the higher minimum + // level will cause too many tiles to be downloaded and rendered. + 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); + //>>includeStart('debug', pragmas.debug); + if (tileCount > 4) { + throw new DeveloperError('The rectangle and minimumLevel indicate that there are ' + tileCount + ' tiles at the minimum level. Imagery providers with more than four tiles at the minimum level are not supported.'); + } + //>>includeEnd('debug'); + + var credit = defaultValue(options.credit, defaultCredit); + if (typeof credit === 'string') { + credit = new Credit({text: credit}); + } + + UrlTemplateImageryProvider.call(this, { + url: resource, + credit: credit, + tilingScheme: tilingScheme, + tileWidth: tileWidth, + tileHeight: tileHeight, + minimumLevel: minimumLevel, + maximumLevel: maximumLevel, + rectangle: rectangle + }); + } + + if (defined(Object.create)) { + OpenStreetMapImageryProvider.prototype = Object.create(UrlTemplateImageryProvider.prototype); + OpenStreetMapImageryProvider.prototype.constructor = OpenStreetMapImageryProvider; + } + + return OpenStreetMapImageryProvider; +}); diff --git a/Source/Scene/SingleTileImageryProvider.js b/Source/Scene/SingleTileImageryProvider.js index 2a2e676e9201..682453b05d96 100644 --- a/Source/Scene/SingleTileImageryProvider.js +++ b/Source/Scene/SingleTileImageryProvider.js @@ -44,8 +44,8 @@ define([ * @see ArcGisMapServerImageryProvider * @see BingMapsImageryProvider * @see GoogleEarthEnterpriseMapsProvider - * @see createOpenStreetMapImageryProvider - * @see createTileMapServiceImageryProvider + * @see OpenStreetMapImageryProvider + * @see TileMapServiceImageryProvider * @see WebMapServiceImageryProvider * @see WebMapTileServiceImageryProvider * @see UrlTemplateImageryProvider diff --git a/Source/Scene/TileMapServiceImageryProvider.js b/Source/Scene/TileMapServiceImageryProvider.js new file mode 100644 index 000000000000..567fe7e63d01 --- /dev/null +++ b/Source/Scene/TileMapServiceImageryProvider.js @@ -0,0 +1,256 @@ +define([ + '../Core/Cartesian2', + '../Core/Cartographic', + '../Core/defaultValue', + '../Core/defined', + '../Core/deprecationWarning', + '../Core/DeveloperError', + '../Core/GeographicTilingScheme', + '../Core/Rectangle', + '../Core/Resource', + '../Core/RuntimeError', + '../Core/TileProviderError', + '../Core/WebMercatorTilingScheme', + '../ThirdParty/when', + './UrlTemplateImageryProvider' +], function( + Cartesian2, + Cartographic, + defaultValue, + defined, + deprecationWarning, + DeveloperError, + GeographicTilingScheme, + Rectangle, + Resource, + RuntimeError, + TileProviderError, + WebMercatorTilingScheme, + when, + UrlTemplateImageryProvider) { + 'use strict'; + + function TileMapServiceImageryProvider(options) { + options = defaultValue(options, {}); + + //>>includeStart('debug', pragmas.debug); + if (!defined(options.url)) { + throw new DeveloperError('options.url is required.'); + } + //>>includeEnd('debug'); + + if (defined(options.proxy)) { + deprecationWarning('TileMapServiceImageryProvider.proxy', 'The options.proxy parameter has been deprecated. Specify options.url as a Resource instance and set the proxy property there.'); + } + + var deferred = when.defer(); + UrlTemplateImageryProvider.call(this, deferred.promise); + + var resource = Resource.createIfNeeded(options.url, { + proxy : options.proxy + }); + resource.appendForwardSlash(); + + this._tmsResource = resource; + this._xmlResource = resource.getDerivedResource({ + url : 'tilemapresource.xml' + }); + 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); + + this._requestMetadata(); + } + + if (defined(Object.create)) { + TileMapServiceImageryProvider.prototype = Object.create(UrlTemplateImageryProvider.prototype); + TileMapServiceImageryProvider.prototype.constructor = TileMapServiceImageryProvider; + } + + TileMapServiceImageryProvider.prototype._requestMetadata = function() { + // Try to load remaining parameters from XML + this._xmlResource.fetchXML().then(this._metadataSuccess).otherwise(this._metadataFailure); + }; + + 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 = []; //list of TileSets + var xmlResource = this._xmlResource; + var metadataError = this._metadataError; + var deferred = this._deferred; + var requestMetadata = this._requestMetadata; + + // Allowing options properties (already copied to that) to override XML values + + // Iterate XML Document nodes for properties + 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); // Node list of TileSets + var tileSetNodes = nodeList.item(i).childNodes; + // Iterate the nodes to find all TileSets + for (var j = 0; j < tileSetNodes.length; j++) { + if (tileSetRegex.test(tileSetNodes.item(j).nodeName)) { + // Add them to tilesets list + 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; + } + } + + // rectangle handling + var rectangle = Rectangle.clone(options.rectangle); + + if (!defined(rectangle)) { + var sw; + var ne; + var swXY; + var neXY; + + // In older versions of gdal x and y values were flipped, which is why we check for an option to flip + // the values here as well. Unfortunately there is no way to autodetect whether flipping is needed. + 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'))); + } + + // Determine based on the profile attribute if this tileset was generated by gdal2tiles.py, which + // uses 'mercator' and 'geodetic' profiles, or by a tool compliant with the TMS standard, which is + // 'global-mercator' and 'global-geodetic' profiles. In the gdal2Tiles case, X and Y are always in + // geodetic degrees. + var isGdal2tiles = tilingSchemeName === 'geodetic' || tilingSchemeName === 'mercator'; + if (tilingScheme instanceof GeographicTilingScheme || 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); + } + + // The rectangle must not be outside the bounds allowed by the tiling scheme. + 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; + } + + // Check the number of tiles at the minimum level. If it's more than four, + // try requesting the lower levels anyway, because starting at the higher minimum + // level will cause too many tiles to be downloaded and rendered. + 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) { + minimumLevel = 0; + } + + 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) { + // Can't load XML, still allow options and defaults + var options = this._options; + var fileExtension = defaultValue(options.fileExtension, 'png'); + var tileWidth = defaultValue(options.tileWidth, 256); + var tileHeight = defaultValue(options.tileHeight, 256); + var minimumLevel = defaultValue(options.minimumLevel, 0); + var maximumLevel = options.maximumLevel; + var tilingScheme = defined(options.tilingScheme) ? options.tilingScheme : new WebMercatorTilingScheme({ellipsoid : options.ellipsoid}); + var rectangle = defaultValue(options.rectangle, tilingScheme.rectangle); + + 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 + }); + }; + + return TileMapServiceImageryProvider; +}); diff --git a/Source/Scene/UrlTemplateImageryProvider.js b/Source/Scene/UrlTemplateImageryProvider.js index 029a097934d3..7eb8c6f24e1f 100644 --- a/Source/Scene/UrlTemplateImageryProvider.js +++ b/Source/Scene/UrlTemplateImageryProvider.js @@ -202,9 +202,9 @@ define([ * @see ArcGisMapServerImageryProvider * @see BingMapsImageryProvider * @see GoogleEarthEnterpriseMapsProvider - * @see createOpenStreetMapImageryProvider + * @see OpenStreetMapImageryProvider * @see SingleTileImageryProvider - * @see createTileMapServiceImageryProvider + * @see TileMapServiceImageryProvider * @see WebMapServiceImageryProvider * @see WebMapTileServiceImageryProvider */ diff --git a/Source/Scene/WebMapServiceImageryProvider.js b/Source/Scene/WebMapServiceImageryProvider.js index 6e9865cf3a8c..693e4b7e7746 100644 --- a/Source/Scene/WebMapServiceImageryProvider.js +++ b/Source/Scene/WebMapServiceImageryProvider.js @@ -71,9 +71,9 @@ define([ * @see ArcGisMapServerImageryProvider * @see BingMapsImageryProvider * @see GoogleEarthEnterpriseMapsProvider - * @see createOpenStreetMapImageryProvider + * @see OpenStreetMapImageryProvider * @see SingleTileImageryProvider - * @see createTileMapServiceImageryProvider + * @see TileMapServiceImageryProvider * @see WebMapTileServiceImageryProvider * @see UrlTemplateImageryProvider * diff --git a/Source/Scene/WebMapTileServiceImageryProvider.js b/Source/Scene/WebMapTileServiceImageryProvider.js index 997fd2ed4bb8..3cb15aaed5d6 100644 --- a/Source/Scene/WebMapTileServiceImageryProvider.js +++ b/Source/Scene/WebMapTileServiceImageryProvider.js @@ -130,9 +130,9 @@ define([ * @see ArcGisMapServerImageryProvider * @see BingMapsImageryProvider * @see GoogleEarthEnterpriseMapsProvider - * @see createOpenStreetMapImageryProvider + * @see OpenStreetMapImageryProvider * @see SingleTileImageryProvider - * @see createTileMapServiceImageryProvider + * @see TileMapServiceImageryProvider * @see WebMapServiceImageryProvider * @see UrlTemplateImageryProvider */ diff --git a/Source/Scene/createOpenStreetMapImageryProvider.js b/Source/Scene/createOpenStreetMapImageryProvider.js index 62ca813375e0..0ac83b37d2ab 100644 --- a/Source/Scene/createOpenStreetMapImageryProvider.js +++ b/Source/Scene/createOpenStreetMapImageryProvider.js @@ -1,29 +1,11 @@ define([ - '../Core/appendForwardSlash', - '../Core/Credit', - '../Core/defaultValue', - '../Core/defined', '../Core/deprecationWarning', - '../Core/DeveloperError', - '../Core/Rectangle', - '../Core/Resource', - '../Core/WebMercatorTilingScheme', - './UrlTemplateImageryProvider' + './OpenStreetMapImageryProvider' ], function( - appendForwardSlash, - Credit, - defaultValue, - defined, deprecationWarning, - DeveloperError, - Rectangle, - Resource, - WebMercatorTilingScheme, - UrlTemplateImageryProvider) { + OpenStreetMapImageryProvider) { 'use strict'; - var defaultCredit = new Credit({text: 'MapQuest, Open Street Map and contributors, CC-BY-SA'}); - /** * Creates a {@link UrlTemplateImageryProvider} instance that provides tiled imagery hosted by OpenStreetMap * or another provider of Slippy tiles. The default url connects to OpenStreetMap's volunteer-run @@ -42,20 +24,22 @@ define([ * @param {Credit|String} [options.credit='MapQuest, Open Street Map and contributors, CC-BY-SA'] A credit for the data source, which is displayed on the canvas. * @returns {UrlTemplateImageryProvider} The imagery provider. * + * @deprecated + * * @exception {DeveloperError} The rectangle and minimumLevel indicate that there are more than four tiles at the minimum level. Imagery providers with more than four tiles at the minimum level are not supported. * * @see ArcGisMapServerImageryProvider * @see BingMapsImageryProvider * @see GoogleEarthEnterpriseMapsProvider * @see SingleTileImageryProvider - * @see createTileMapServiceImageryProvider + * @see TileMapServiceImageryProvider * @see WebMapServiceImageryProvider * @see WebMapTileServiceImageryProvider * @see UrlTemplateImageryProvider * * * @example - * var osm = Cesium.createOpenStreetMapImageryProvider({ + * var osm = new Cesium.OpenStreetMapImageryProvider({ * url : 'https://a.tile.openstreetmap.org/' * }); * @@ -63,57 +47,9 @@ define([ * @see {@link http://www.w3.org/TR/cors/|Cross-Origin Resource Sharing} */ function createOpenStreetMapImageryProvider(options) { - options = defaultValue(options, {}); - - var url = defaultValue(options.url, 'https://a.tile.openstreetmap.org/'); - url = appendForwardSlash(url); - url += '{z}/{x}/{y}.' + defaultValue(options.fileExtension, 'png'); - - if (defined(options.proxy)) { - deprecationWarning('createOpenStreetMapImageryProvider.proxy', 'The options.proxy parameter has been deprecated. Specify options.url as a Resource instance and set the proxy property there.'); - } - - var resource = Resource.createIfNeeded(url, { - proxy: options.proxy - }); - - var tilingScheme = new WebMercatorTilingScheme({ ellipsoid : options.ellipsoid }); - - var tileWidth = 256; - var tileHeight = 256; - - var minimumLevel = defaultValue(options.minimumLevel, 0); - var maximumLevel = options.maximumLevel; - - var rectangle = defaultValue(options.rectangle, tilingScheme.rectangle); - - // Check the number of tiles at the minimum level. If it's more than four, - // throw an exception, because starting at the higher minimum - // level will cause too many tiles to be downloaded and rendered. - 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); - //>>includeStart('debug', pragmas.debug); - if (tileCount > 4) { - throw new DeveloperError('The rectangle and minimumLevel indicate that there are ' + tileCount + ' tiles at the minimum level. Imagery providers with more than four tiles at the minimum level are not supported.'); - } - //>>includeEnd('debug'); - - var credit = defaultValue(options.credit, defaultCredit); - if (typeof credit === 'string') { - credit = new Credit({text: credit}); - } + deprecationWarning('createOpenStreetMapImageryProvider', 'createOpenStreetMapImageryProvider is deprecated and will be removed in Cesium 1.46. Please use OpenStreetMapImageryProvider instead.'); - return new UrlTemplateImageryProvider({ - url: resource, - credit: credit, - tilingScheme: tilingScheme, - tileWidth: tileWidth, - tileHeight: tileHeight, - minimumLevel: minimumLevel, - maximumLevel: maximumLevel, - rectangle: rectangle - }); + return new OpenStreetMapImageryProvider(options); } return createOpenStreetMapImageryProvider; diff --git a/Source/Scene/createTileMapServiceImageryProvider.js b/Source/Scene/createTileMapServiceImageryProvider.js index cf1667f0211a..8d857f58b74a 100644 --- a/Source/Scene/createTileMapServiceImageryProvider.js +++ b/Source/Scene/createTileMapServiceImageryProvider.js @@ -1,33 +1,9 @@ define([ - '../Core/Cartesian2', - '../Core/Cartographic', - '../Core/defaultValue', - '../Core/defined', '../Core/deprecationWarning', - '../Core/DeveloperError', - '../Core/GeographicTilingScheme', - '../Core/Rectangle', - '../Core/Resource', - '../Core/RuntimeError', - '../Core/TileProviderError', - '../Core/WebMercatorTilingScheme', - '../ThirdParty/when', - './UrlTemplateImageryProvider' + './TileMapServiceImageryProvider' ], function( - Cartesian2, - Cartographic, - defaultValue, - defined, deprecationWarning, - DeveloperError, - GeographicTilingScheme, - Rectangle, - Resource, - RuntimeError, - TileProviderError, - WebMercatorTilingScheme, - when, - UrlTemplateImageryProvider) { + TileMapServiceImageryProvider) { 'use strict'; /** @@ -57,10 +33,12 @@ define([ * Specifying this option will do the same, allowing for loading of these incorrect tilesets. * @returns {UrlTemplateImageryProvider} The imagery provider. * + * @deprecated + * * @see ArcGisMapServerImageryProvider * @see BingMapsImageryProvider * @see GoogleEarthEnterpriseMapsProvider - * @see createOpenStreetMapImageryProvider + * @see OpenStreetMapImageryProvider * @see SingleTileImageryProvider * @see WebMapServiceImageryProvider * @see WebMapTileServiceImageryProvider @@ -71,7 +49,7 @@ define([ * @see {@link http://www.w3.org/TR/cors/|Cross-Origin Resource Sharing} * * @example - * var tms = Cesium.createTileMapServiceImageryProvider({ + * var tms = new Cesium.TileMapServiceImageryProvider({ * url : '../images/cesium_maptiler/Cesium_Logo_Color', * fileExtension: 'png', * maximumLevel: 4, @@ -83,207 +61,9 @@ define([ * }); */ function createTileMapServiceImageryProvider(options) { - options = defaultValue(options, {}); - - //>>includeStart('debug', pragmas.debug); - if (!defined(options.url)) { - throw new DeveloperError('options.url is required.'); - } - //>>includeEnd('debug'); - - if (defined(options.proxy)) { - deprecationWarning('createTileMapServiceImageryProvider.proxy', 'The options.proxy parameter has been deprecated. Specify options.url as a Resource instance and set the proxy property there.'); - } - - var resource = Resource.createIfNeeded(options.url, { - proxy : options.proxy - }); - resource.appendForwardSlash(); - - var xmlResource = resource.getDerivedResource({ - url: 'tilemapresource.xml' - }); - - var deferred = when.defer(); - var imageryProvider = new UrlTemplateImageryProvider(deferred.promise); - - var metadataError; - - function metadataSuccess(xml) { - var tileFormatRegex = /tileformat/i; - var tileSetRegex = /tileset/i; - var tileSetsRegex = /tilesets/i; - var bboxRegex = /boundingbox/i; - var format, bbox, tilesets; - var tilesetsList = []; //list of TileSets - - // Allowing options properties (already copied to that) to override XML values - - // Iterate XML Document nodes for properties - 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); // Node list of TileSets - var tileSetNodes = nodeList.item(i).childNodes; - // Iterate the nodes to find all TileSets - for(var j = 0; j < tileSetNodes.length; j++) { - if (tileSetRegex.test(tileSetNodes.item(j).nodeName)) { - // Add them to tilesets list - 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, imageryProvider, imageryProvider.errorEvent, message, undefined, undefined, undefined, requestMetadata); - if(!metadataError.retry) { - deferred.reject(new RuntimeError(message)); - } - return; - } - - 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, imageryProvider, imageryProvider.errorEvent, message, undefined, undefined, undefined, requestMetadata); - if(!metadataError.retry) { - deferred.reject(new RuntimeError(message)); - } - return; - } - } - - // rectangle handling - var rectangle = Rectangle.clone(options.rectangle); - - if (!defined(rectangle)) { - var sw; - var ne; - var swXY; - var neXY; - - // In older versions of gdal x and y values were flipped, which is why we check for an option to flip - // the values here as well. Unfortunately there is no way to autodetect whether flipping is needed. - 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'))); - } - - // Determine based on the profile attribute if this tileset was generated by gdal2tiles.py, which - // uses 'mercator' and 'geodetic' profiles, or by a tool compliant with the TMS standard, which is - // 'global-mercator' and 'global-geodetic' profiles. In the gdal2Tiles case, X and Y are always in - // geodetic degrees. - var isGdal2tiles = tilingSchemeName === 'geodetic' || tilingSchemeName === 'mercator'; - if (tilingScheme instanceof GeographicTilingScheme || 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); - } - - // The rectangle must not be outside the bounds allowed by the tiling scheme. - 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; - } - - // Check the number of tiles at the minimum level. If it's more than four, - // try requesting the lower levels anyway, because starting at the higher minimum - // level will cause too many tiles to be downloaded and rendered. - 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) { - minimumLevel = 0; - } - - var templateResource = resource.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 - }); - } - - function metadataFailure(error) { - // Can't load XML, still allow options and defaults - var fileExtension = defaultValue(options.fileExtension, 'png'); - var tileWidth = defaultValue(options.tileWidth, 256); - var tileHeight = defaultValue(options.tileHeight, 256); - var minimumLevel = defaultValue(options.minimumLevel, 0); - var maximumLevel = options.maximumLevel; - var tilingScheme = defined(options.tilingScheme) ? options.tilingScheme : new WebMercatorTilingScheme({ ellipsoid : options.ellipsoid }); - var rectangle = defaultValue(options.rectangle, tilingScheme.rectangle); - - var templateResource = resource.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 - }); - } - - function requestMetadata() { - // Try to load remaining parameters from XML - xmlResource.fetchXML().then(metadataSuccess).otherwise(metadataFailure); - } + deprecationWarning('createTileMapServiceImageryProvider', 'createTileMapServiceImageryProvider is deprecated and will be removed in Cesium 1.46. Please use TileMapServiceImageryProvider instead.'); - requestMetadata(); - return imageryProvider; + return new TileMapServiceImageryProvider(options); } return createTileMapServiceImageryProvider; diff --git a/Source/Widgets/BaseLayerPicker/BaseLayerPicker.js b/Source/Widgets/BaseLayerPicker/BaseLayerPicker.js index e0567620981d..5ca26d639481 100644 --- a/Source/Widgets/BaseLayerPicker/BaseLayerPicker.js +++ b/Source/Widgets/BaseLayerPicker/BaseLayerPicker.js @@ -59,7 +59,7 @@ define([ * tooltip : 'OpenStreetMap (OSM) is a collaborative project to create a free editable \ * map of the world.\nhttp://www.openstreetmap.org', * creationFunction : function() { - * return Cesium.createOpenStreetMapImageryProvider({ + * return new Cesium.OpenStreetMapImageryProvider({ * url : 'https://a.tile.openstreetmap.org/' * }); * } @@ -71,7 +71,7 @@ define([ * tooltip : 'The lights of cities and villages trace the outlines of civilization \ * in this global view of the Earth at night as seen by NASA/NOAA\'s Suomi NPP satellite.', * creationFunction : function() { - * return Cesium.createTileMapServiceImageryProvider({ + * return new Cesium.TileMapServiceImageryProvider({ * url : 'https://cesiumjs.org/blackmarble', * credit : 'Black Marble imagery courtesy NASA Earth Observatory', * flipXY : true @@ -84,7 +84,7 @@ define([ * iconUrl : Cesium.buildModuleUrl('Widgets/Images/ImageryProviders/naturalEarthII.png'), * tooltip : 'Natural Earth II, darkened for contrast.\nhttp://www.naturalearthdata.com/', * creationFunction : function() { - * return Cesium.createTileMapServiceImageryProvider({ + * return new Cesium.TileMapServiceImageryProvider({ * url : Cesium.buildModuleUrl('Assets/Textures/NaturalEarthII') * }); * } diff --git a/Source/Widgets/BaseLayerPicker/createDefaultImageryProviderViewModels.js b/Source/Widgets/BaseLayerPicker/createDefaultImageryProviderViewModels.js index 4ee11ebfbd9d..633c662bd933 100644 --- a/Source/Widgets/BaseLayerPicker/createDefaultImageryProviderViewModels.js +++ b/Source/Widgets/BaseLayerPicker/createDefaultImageryProviderViewModels.js @@ -3,8 +3,8 @@ define([ '../../Scene/ArcGisMapServerImageryProvider', '../../Scene/BingMapsImageryProvider', '../../Scene/BingMapsStyle', - '../../Scene/createOpenStreetMapImageryProvider', - '../../Scene/createTileMapServiceImageryProvider', + '../../Scene/OpenStreetMapImageryProvider', + '../../Scene/TileMapServiceImageryProvider', '../../Scene/MapboxImageryProvider', '../BaseLayerPicker/ProviderViewModel' ], function( @@ -12,8 +12,8 @@ define([ ArcGisMapServerImageryProvider, BingMapsImageryProvider, BingMapsStyle, - createOpenStreetMapImageryProvider, - createTileMapServiceImageryProvider, + OpenStreetMapImageryProvider, + TileMapServiceImageryProvider, MapboxImageryProvider, ProviderViewModel) { 'use strict'; @@ -148,7 +148,7 @@ mapping applications.\nhttp://www.esri.com', tooltip : 'OpenStreetMap (OSM) is a collaborative project to create a free editable map \ of the world.\nhttp://www.openstreetmap.org', creationFunction : function() { - return createOpenStreetMapImageryProvider({ + return new OpenStreetMapImageryProvider({ url : 'https://a.tile.openstreetmap.org/' }); } @@ -160,7 +160,7 @@ of the world.\nhttp://www.openstreetmap.org', tooltip : 'Reminiscent of hand drawn maps, Stamen watercolor maps apply raster effect \ area washes and organic edges over a paper texture to add warm pop to any map.\nhttp://maps.stamen.com', creationFunction : function() { - return createOpenStreetMapImageryProvider({ + return new OpenStreetMapImageryProvider({ url : 'https://stamen-tiles.a.ssl.fastly.net/watercolor/', credit : 'Map tiles by Stamen Design, under CC BY 3.0. Data by OpenStreetMap, under CC BY SA.' }); @@ -172,7 +172,7 @@ area washes and organic edges over a paper texture to add warm pop to any map.\n iconUrl : buildModuleUrl('Widgets/Images/ImageryProviders/stamenToner.png'), tooltip : 'A high contrast black and white map.\nhttp://maps.stamen.com', creationFunction : function() { - return createOpenStreetMapImageryProvider({ + return new OpenStreetMapImageryProvider({ url : 'https://stamen-tiles.a.ssl.fastly.net/toner/', credit : 'Map tiles by Stamen Design, under CC BY 3.0. Data by OpenStreetMap, under CC BY SA.' }); @@ -185,7 +185,7 @@ area washes and organic edges over a paper texture to add warm pop to any map.\n tooltip : 'The lights of cities and villages trace the outlines of civilization in this global view of the \ Earth at night as seen by NASA/NOAA\'s Suomi NPP satellite.', creationFunction : function() { - return createTileMapServiceImageryProvider({ + return new TileMapServiceImageryProvider({ url : 'https://cesiumjs.org/blackmarble', flipXY : true, credit : 'Black Marble imagery courtesy NASA Earth Observatory' @@ -198,7 +198,7 @@ Earth at night as seen by NASA/NOAA\'s Suomi NPP satellite.', iconUrl : buildModuleUrl('Widgets/Images/ImageryProviders/naturalEarthII.png'), tooltip : 'Natural Earth II, darkened for contrast.\nhttp://www.naturalearthdata.com/', creationFunction : function() { - return createTileMapServiceImageryProvider({ + return new TileMapServiceImageryProvider({ url : buildModuleUrl('Assets/Textures/NaturalEarthII') }); } diff --git a/Source/Widgets/CesiumWidget/CesiumWidget.js b/Source/Widgets/CesiumWidget/CesiumWidget.js index df849588a9ac..8ea39a87892a 100644 --- a/Source/Widgets/CesiumWidget/CesiumWidget.js +++ b/Source/Widgets/CesiumWidget/CesiumWidget.js @@ -180,7 +180,7 @@ define([ * * //Widget with OpenStreetMaps imagery provider and Cesium terrain provider hosted by AGI. * var widget = new Cesium.CesiumWidget('cesiumContainer', { - * imageryProvider : Cesium.createOpenStreetMapImageryProvider(), + * imageryProvider : new Cesium.OpenStreetMapImageryProvider(), * terrainProvider : new Cesium.CesiumTerrainProvider({ * url : 'https://assets.agi.com/stk-terrain/v1/tilesets/world/tiles' * }), diff --git a/Specs/Scene/ImageryLayerSpec.js b/Specs/Scene/ImageryLayerSpec.js index 074e12c8f140..b28c5c6b49d8 100644 --- a/Specs/Scene/ImageryLayerSpec.js +++ b/Specs/Scene/ImageryLayerSpec.js @@ -11,7 +11,7 @@ defineSuite([ 'Renderer/TextureMinificationFilter', 'Scene/ArcGisMapServerImageryProvider', 'Scene/BingMapsImageryProvider', - 'Scene/createTileMapServiceImageryProvider', + 'Scene/TileMapServiceImageryProvider', 'Scene/GlobeSurfaceTile', 'Scene/Imagery', 'Scene/ImageryLayerCollection', @@ -36,7 +36,7 @@ defineSuite([ TextureMinificationFilter, ArcGisMapServerImageryProvider, BingMapsImageryProvider, - createTileMapServiceImageryProvider, + TileMapServiceImageryProvider, GlobeSurfaceTile, Imagery, ImageryLayerCollection, @@ -487,7 +487,7 @@ defineSuite([ describe('createTileImagerySkeletons', function() { it('handles a base layer that does not cover the entire globe', function() { - var provider = createTileMapServiceImageryProvider({ + var provider = new TileMapServiceImageryProvider({ url : 'Data/TMS/SmallArea' }); @@ -536,7 +536,7 @@ defineSuite([ url : 'Data/Images/Blue.png' }); - var provider = createTileMapServiceImageryProvider({ + var provider = new TileMapServiceImageryProvider({ url : 'Data/TMS/SmallArea' }); @@ -582,7 +582,7 @@ defineSuite([ url : 'Data/Images/Green4x4.png' }); - var provider = createTileMapServiceImageryProvider({ + var provider = new TileMapServiceImageryProvider({ url : 'Data/TMS/SmallArea' }); diff --git a/Specs/Scene/createOpenStreetMapImageryProviderSpec.js b/Specs/Scene/OpenStreetMapImageryProviderSpec.js similarity index 91% rename from Specs/Scene/createOpenStreetMapImageryProviderSpec.js rename to Specs/Scene/OpenStreetMapImageryProviderSpec.js index 76d1fe74117b..465859dda2f0 100644 --- a/Specs/Scene/createOpenStreetMapImageryProviderSpec.js +++ b/Specs/Scene/OpenStreetMapImageryProviderSpec.js @@ -1,5 +1,5 @@ defineSuite([ - 'Scene/createOpenStreetMapImageryProvider', + 'Scene/OpenStreetMapImageryProvider', 'Core/DefaultProxy', 'Core/loadImage', 'Core/Math', @@ -13,7 +13,7 @@ defineSuite([ 'Scene/UrlTemplateImageryProvider', 'Specs/pollToPromise' ], function( - createOpenStreetMapImageryProvider, + OpenStreetMapImageryProvider, DefaultProxy, loadImage, CesiumMath, @@ -37,12 +37,12 @@ defineSuite([ }); it('return a UrlTemplateImageryProvider', function() { - var provider = createOpenStreetMapImageryProvider(); + var provider = new OpenStreetMapImageryProvider(); expect(provider).toBeInstanceOf(UrlTemplateImageryProvider); }); it('returns valid value for hasAlphaChannel', function() { - var provider = createOpenStreetMapImageryProvider({ + var provider = new OpenStreetMapImageryProvider({ url : 'made/up/osm/server/' }); @@ -58,7 +58,7 @@ defineSuite([ url : 'made/up/osm/server/' }); - var provider = createOpenStreetMapImageryProvider({ + var provider = new OpenStreetMapImageryProvider({ url : resource }); @@ -80,7 +80,7 @@ defineSuite([ }); it('supports a slash at the end of the URL', function() { - var provider = createOpenStreetMapImageryProvider({ + var provider = new OpenStreetMapImageryProvider({ url : 'made/up/osm/server/' }); @@ -102,7 +102,7 @@ defineSuite([ }); it('supports no slash at the endof the URL', function() { - var provider = createOpenStreetMapImageryProvider({ + var provider = new OpenStreetMapImageryProvider({ url : 'made/up/osm/server' }); @@ -124,7 +124,7 @@ defineSuite([ }); it('requestImage returns a promise for an image and loads it for cross-origin use', function() { - var provider = createOpenStreetMapImageryProvider({ + var provider = new OpenStreetMapImageryProvider({ url : 'made/up/osm/server/' }); @@ -152,14 +152,14 @@ defineSuite([ }); it('when no credit is supplied, a default one is used', function() { - var provider = createOpenStreetMapImageryProvider({ + var provider = new OpenStreetMapImageryProvider({ url : 'made/up/osm/server' }); expect(provider.credit).toBeDefined(); }); it('turns the supplied credit into a logo', function() { - var providerWithCredit = createOpenStreetMapImageryProvider({ + var providerWithCredit = new OpenStreetMapImageryProvider({ url : 'made/up/osm/server', credit : 'Thanks to our awesome made up source of this imagery!' }); @@ -168,7 +168,7 @@ defineSuite([ it('routes requests through a proxy if one is specified', function() { var proxy = new DefaultProxy('/proxy/'); - var provider = createOpenStreetMapImageryProvider({ + var provider = new OpenStreetMapImageryProvider({ url : 'made/up/osm/server', proxy : proxy }); @@ -194,7 +194,7 @@ defineSuite([ it('rectangle passed to constructor does not affect tile numbering', function() { var rectangle = new Rectangle(0.1, 0.2, 0.3, 0.4); - var provider = createOpenStreetMapImageryProvider({ + var provider = new OpenStreetMapImageryProvider({ url : 'made/up/osm/server', rectangle : rectangle }); @@ -227,7 +227,7 @@ defineSuite([ }); it('uses maximumLevel passed to constructor', function() { - var provider = createOpenStreetMapImageryProvider({ + var provider = new OpenStreetMapImageryProvider({ url : 'made/up/osm/server', maximumLevel : 5 }); @@ -235,7 +235,7 @@ defineSuite([ }); it('uses minimumLevel passed to constructor', function() { - var provider = createOpenStreetMapImageryProvider({ + var provider = new OpenStreetMapImageryProvider({ url : 'made/up/osm/server', minimumLevel : 1 }); @@ -243,7 +243,7 @@ defineSuite([ }); it('raises error event when image cannot be loaded', function() { - var provider = createOpenStreetMapImageryProvider({ + var provider = new OpenStreetMapImageryProvider({ url : 'made/up/osm/server' }); @@ -295,7 +295,7 @@ defineSuite([ var rectangle = new Rectangle(0.0, 0.0, CesiumMath.toRadians(1.0), CesiumMath.toRadians(1.0)); expect(function() { - return createOpenStreetMapImageryProvider({ + return new OpenStreetMapImageryProvider({ minimumLevel : 9, rectangle : rectangle }); diff --git a/Specs/Scene/createTileMapServiceImageryProviderSpec.js b/Specs/Scene/TileMapServiceImageryProviderSpec.js similarity index 94% rename from Specs/Scene/createTileMapServiceImageryProviderSpec.js rename to Specs/Scene/TileMapServiceImageryProviderSpec.js index c9db47dc9ce0..ce167b028315 100644 --- a/Specs/Scene/createTileMapServiceImageryProviderSpec.js +++ b/Specs/Scene/TileMapServiceImageryProviderSpec.js @@ -1,5 +1,5 @@ defineSuite([ - 'Scene/createTileMapServiceImageryProvider', + 'Scene/TileMapServiceImageryProvider', 'Core/Cartesian2', 'Core/Cartographic', 'Core/DefaultProxy', @@ -21,7 +21,7 @@ defineSuite([ 'Specs/pollToPromise', 'ThirdParty/when' ], function( - createTileMapServiceImageryProvider, + TileMapServiceImageryProvider, Cartesian2, Cartographic, DefaultProxy, @@ -54,14 +54,14 @@ defineSuite([ }); it('return a UrlTemplateImageryProvider', function() { - var provider = createTileMapServiceImageryProvider({ + var provider = new TileMapServiceImageryProvider({ url: 'made/up/tms/server/' }); expect(provider).toBeInstanceOf(UrlTemplateImageryProvider); }); it('resolves readyPromise', function() { - var provider = createTileMapServiceImageryProvider({ + var provider = new TileMapServiceImageryProvider({ url : 'made/up/tms/server/' }); @@ -76,7 +76,7 @@ defineSuite([ url: 'made/up/tms/server/' }); - var provider = createTileMapServiceImageryProvider({ + var provider = new TileMapServiceImageryProvider({ url : resource }); @@ -110,7 +110,7 @@ defineSuite([ }, 1); }; - var provider = createTileMapServiceImageryProvider({ + var provider = new TileMapServiceImageryProvider({ url : 'made/up/tms/server' }); @@ -145,7 +145,7 @@ defineSuite([ }, 1); }; - var provider = createTileMapServiceImageryProvider({ + var provider = new TileMapServiceImageryProvider({ url : 'made/up/tms/server' }); @@ -159,13 +159,13 @@ defineSuite([ it('requires the url to be specified', function() { function createWithoutUrl() { - return createTileMapServiceImageryProvider({}); + return new TileMapServiceImageryProvider({}); } expect(createWithoutUrl).toThrowDeveloperError(); }); it('returns valid value for hasAlphaChannel', function() { - var provider = createTileMapServiceImageryProvider({ + var provider = new TileMapServiceImageryProvider({ url : 'made/up/tms/server/' }); @@ -178,7 +178,7 @@ defineSuite([ it('supports a slash at the end of the URL', function() { var baseUrl = 'made/up/tms/server/'; - var provider = createTileMapServiceImageryProvider({ + var provider = new TileMapServiceImageryProvider({ url : baseUrl }); @@ -200,7 +200,7 @@ defineSuite([ }); it('supports no slash at the endof the URL', function() { - var provider = createTileMapServiceImageryProvider({ + var provider = new TileMapServiceImageryProvider({ url : 'http://made/up/tms/server' }); @@ -223,7 +223,7 @@ defineSuite([ it('supports a query string at the end of the URL', function() { var baseUrl = 'made/up/tms/server/'; - var provider = createTileMapServiceImageryProvider({ + var provider = new TileMapServiceImageryProvider({ url : baseUrl + '?a=some&b=query' }); @@ -245,7 +245,7 @@ defineSuite([ }); it('requestImage returns a promise for an image and loads it for cross-origin use', function() { - var provider = createTileMapServiceImageryProvider({ + var provider = new TileMapServiceImageryProvider({ url : 'made/up/tms/server/' }); @@ -272,7 +272,7 @@ defineSuite([ }); it('when no credit is supplied, the provider has no logo', function() { - var provider = createTileMapServiceImageryProvider({ + var provider = new TileMapServiceImageryProvider({ url : 'made/up/tms/server' }); return pollToPromise(function() { @@ -283,7 +283,7 @@ defineSuite([ }); it('turns the supplied credit into a logo', function() { - var providerWithCredit = createTileMapServiceImageryProvider({ + var providerWithCredit = new TileMapServiceImageryProvider({ url : 'made/up/gms/server', credit : 'Thanks to our awesome made up source of this imagery!' }); @@ -303,7 +303,7 @@ defineSuite([ deferred.reject(); //since the TMS server doesn't exist (and doesn't need too) we can just reject here. }); - var provider = createTileMapServiceImageryProvider({ + var provider = new TileMapServiceImageryProvider({ url : 'server.invalid', proxy : proxy }); @@ -322,7 +322,7 @@ defineSuite([ deferred.reject(); //since the TMS server doesn't exist (and doesn't need too) we can just reject here. }); - var provider = createTileMapServiceImageryProvider({ + var provider = new TileMapServiceImageryProvider({ url : 'http://server.invalid?query=1' }); @@ -334,7 +334,7 @@ defineSuite([ it('routes tile requests through a proxy if one is specified', function() { var proxy = new DefaultProxy('/proxy/'); - var provider = createTileMapServiceImageryProvider({ + var provider = new TileMapServiceImageryProvider({ url : 'made/up/tms/server', proxy : proxy }); @@ -360,7 +360,7 @@ defineSuite([ it('rectangle passed to constructor does not affect tile numbering', function() { var rectangle = new Rectangle(0.1, 0.2, 0.3, 0.4); - var provider = createTileMapServiceImageryProvider({ + var provider = new TileMapServiceImageryProvider({ url : 'made/up/tms/server', rectangle : rectangle }); @@ -393,7 +393,7 @@ defineSuite([ }); it('uses maximumLevel passed to constructor', function() { - var provider = createTileMapServiceImageryProvider({ + var provider = new TileMapServiceImageryProvider({ url : 'made/up/tms/server', maximumLevel : 5 }); @@ -406,7 +406,7 @@ defineSuite([ }); it('raises error event when image cannot be loaded', function() { - var provider = createTileMapServiceImageryProvider({ + var provider = new TileMapServiceImageryProvider({ url : 'made/up/tms/server' }); @@ -473,7 +473,7 @@ defineSuite([ deferred.resolve(xml); }; - var provider = createTileMapServiceImageryProvider({ + var provider = new TileMapServiceImageryProvider({ url : 'made/up/tms/server' }); @@ -511,7 +511,7 @@ defineSuite([ deferred.resolve(xml); }; - var provider = createTileMapServiceImageryProvider({ + var provider = new TileMapServiceImageryProvider({ url : 'made/up/tms/server' }); @@ -543,7 +543,7 @@ defineSuite([ deferred.resolve(xml); }; - var provider = createTileMapServiceImageryProvider({ + var provider = new TileMapServiceImageryProvider({ url : 'made/up/tms/server' }); @@ -575,7 +575,7 @@ defineSuite([ deferred.resolve(xml); }; - var provider = createTileMapServiceImageryProvider({ + var provider = new TileMapServiceImageryProvider({ url : 'made/up/tms/server' }); @@ -607,7 +607,7 @@ defineSuite([ deferred.resolve(xml); }; - var provider = createTileMapServiceImageryProvider({ + var provider = new TileMapServiceImageryProvider({ url : 'made/up/tms/server' }); @@ -648,7 +648,7 @@ defineSuite([ deferred.resolve(xml); }; - var provider = createTileMapServiceImageryProvider({ + var provider = new TileMapServiceImageryProvider({ url : 'made/up/tms/server' }); @@ -688,7 +688,7 @@ defineSuite([ deferred.resolve(xml); }; - var provider = createTileMapServiceImageryProvider({ + var provider = new TileMapServiceImageryProvider({ url : 'made/up/tms/server', flipXY : true }); @@ -729,7 +729,7 @@ defineSuite([ deferred.resolve(xml); }; - var provider = createTileMapServiceImageryProvider({ + var provider = new TileMapServiceImageryProvider({ url : 'made/up/tms/server', flipXY : true }); @@ -774,7 +774,7 @@ defineSuite([ }, 1); }; - var provider = createTileMapServiceImageryProvider({ + var provider = new TileMapServiceImageryProvider({ url : 'made/up/tms/server' }); From dc640fa4788b861129af48a44881b29791b5aeff Mon Sep 17 00:00:00 2001 From: hpinkos Date: Fri, 4 Jan 2019 13:02:28 -0500 Subject: [PATCH 02/10] fix merge --- CHANGES.md | 2 + Source/Scene/OpenStreetMapImageryProvider.js | 16 ++-- Source/Scene/TileMapServiceImageryProvider.js | 84 ++++++++++++++++--- 3 files changed, 79 insertions(+), 23 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index e4eabc4cdd4a..c01a1255c760 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -9,12 +9,14 @@ Change Log ##### Deprecated :hourglass_flowing_sand: * `Scene.clampToHeight` now takes an optional `width` argument before the `result` argument. The previous function definition will no longer work in 1.56. [#7287](https://github.com/AnalyticalGraphicsInc/cesium/pull/7287) +* `createTileMapServiceImageryProvider` and `createOpenStreetMapImageryProvider` have been deprecated and will be removed in Cesium 1.46. Instead, pass the same options to `new TileMapServiceImageryProvider` and `new OpenStreetMapImageryProvider` respectively. ##### Additions :tada: * Added support for textured ground entities (entities with unspecified `height`) and `GroundPrimitives` on 3D Tiles. [#7434](https://github.com/AnalyticalGraphicsInc/cesium/pull/7434) * Added support for polylines on 3D Tiles. [#7437](https://github.com/AnalyticalGraphicsInc/cesium/pull/7437) * Added `classificationType` property to `PolylineGraphics` and `GroundPolylinePrimitive` which specifies whether a polyline clamped to ground should be clamped to terrain, 3D Tiles, or both. [#7437](https://github.com/AnalyticalGraphicsInc/cesium/pull/7437) * Added the ability to specify the width of the intersection volume for `Scene.sampleHeight`, `Scene.clampToHeight`, `Scene.sampleHeightMostDetailed`, and `Scene.clampToHeightMostDetailed`. [#7287](https://github.com/AnalyticalGraphicsInc/cesium/pull/7287) +* Added `TileMapResourceImageryProvider` and `OpenStreetMapImageryProvider` classes to improve API consistency: [#4812](https://github.com/AnalyticalGraphicsInc/cesium/issues/4812) ##### Fixes :wrench: * Fixed an issue where classification primitives with the `CESIUM_3D_TILE` classification type would render on terrain. [#7422](https://github.com/AnalyticalGraphicsInc/cesium/pull/7422) diff --git a/Source/Scene/OpenStreetMapImageryProvider.js b/Source/Scene/OpenStreetMapImageryProvider.js index 52cc9fee1035..7cff2d9347f8 100644 --- a/Source/Scene/OpenStreetMapImageryProvider.js +++ b/Source/Scene/OpenStreetMapImageryProvider.js @@ -44,7 +44,7 @@ define([ UrlTemplateImageryProvider) { 'use strict'; - var defaultCredit = new Credit({text: 'MapQuest, Open Street Map and contributors, CC-BY-SA'}); + var defaultCredit = new Credit('MapQuest, Open Street Map and contributors, CC-BY-SA'); /** * An imagery provider that provides tiled imagery hosted by OpenStreetMap @@ -52,6 +52,9 @@ define([ * servers, so you must conform to their * {@link http://wiki.openstreetmap.org/wiki/Tile_usage_policy|Tile Usage Policy}. * + * @alias OpenStreetMapImageryProvider + * @constructor + * * @param {Object} [options] Object with the following properties: * @param {String} [options.url='https://a.tile.openstreetmap.org'] The OpenStreetMap server url. * @param {String} [options.fileExtension='png'] The file extension for images on the server. @@ -88,14 +91,7 @@ define([ var url = defaultValue(options.url, 'https://a.tile.openstreetmap.org/'); url = appendForwardSlash(url); url += '{z}/{x}/{y}.' + defaultValue(options.fileExtension, 'png'); - - if (defined(options.proxy)) { - deprecationWarning('OpenStreetMapImageryProvider.proxy', 'The options.proxy parameter has been deprecated. Specify options.url as a Resource instance and set the proxy property there.'); - } - - var resource = Resource.createIfNeeded(url, { - proxy: options.proxy - }); + var resource = Resource.createIfNeeded(url); var tilingScheme = new WebMercatorTilingScheme({ ellipsoid : options.ellipsoid }); @@ -121,7 +117,7 @@ define([ var credit = defaultValue(options.credit, defaultCredit); if (typeof credit === 'string') { - credit = new Credit({text: credit}); + credit = new Credit(credit); } UrlTemplateImageryProvider.call(this, { diff --git a/Source/Scene/TileMapServiceImageryProvider.js b/Source/Scene/TileMapServiceImageryProvider.js index 567fe7e63d01..77d2193e8578 100644 --- a/Source/Scene/TileMapServiceImageryProvider.js +++ b/Source/Scene/TileMapServiceImageryProvider.js @@ -30,6 +30,59 @@ define([ UrlTemplateImageryProvider) { 'use strict'; + /** + * An imagery provider that provides tiled imagery as generated by + * {@link http://www.maptiler.org/|MapTiler}, {@link http://www.klokan.cz/projects/gdal2tiles/|GDAL2Tiles}, etc. + * + * @alias TileMapServiceImageryProvider + * @constructor + * + * @param {Object} [options] Object with the following properties: + * @param {Resource|String|Promise|Promise} [options.url='.'] Path to image tiles on server. + * @param {String} [options.fileExtension='png'] The file extension for images on the server. + * @param {Credit|String} [options.credit=''] A credit for the data source, which is displayed on the canvas. + * @param {Number} [options.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. + * @param {Number} [options.maximumLevel] The maximum level-of-detail supported by the imagery provider, or undefined if there is no limit. + * @param {Rectangle} [options.rectangle=Rectangle.MAX_VALUE] The rectangle, in radians, covered by the image. + * @param {TilingScheme} [options.tilingScheme] The tiling scheme specifying how the ellipsoidal + * surface is broken into tiles. If this parameter is not provided, a {@link WebMercatorTilingScheme} + * is used. + * @param {Ellipsoid} [options.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. + * @param {Number} [options.tileWidth=256] Pixel width of image tiles. + * @param {Number} [options.tileHeight=256] Pixel height of image tiles. + * @param {Boolean} [options.flipXY] Older versions of gdal2tiles.py flipped X and Y values in tilemapresource.xml. + * Specifying this option will do the same, allowing for loading of these incorrect tilesets. + * @returns {UrlTemplateImageryProvider} The imagery provider. + * + * @see ArcGisMapServerImageryProvider + * @see BingMapsImageryProvider + * @see GoogleEarthEnterpriseMapsProvider + * @see createOpenStreetMapImageryProvider + * @see SingleTileImageryProvider + * @see WebMapServiceImageryProvider + * @see WebMapTileServiceImageryProvider + * @see UrlTemplateImageryProvider + * + * @see {@link http://www.maptiler.org/|MapTiler} + * @see {@link http://www.klokan.cz/projects/gdal2tiles/|GDAL2Tiles} + * @see {@link http://www.w3.org/TR/cors/|Cross-Origin Resource Sharing} + * + * @example + * var tms = Cesium.createTileMapServiceImageryProvider({ + * url : '../images/cesium_maptiler/Cesium_Logo_Color', + * fileExtension: 'png', + * maximumLevel: 4, + * rectangle: new Cesium.Rectangle( + * Cesium.Math.toRadians(-120.0), + * Cesium.Math.toRadians(20.0), + * Cesium.Math.toRadians(-60.0), + * Cesium.Math.toRadians(40.0)) + * }); + */ function TileMapServiceImageryProvider(options) { options = defaultValue(options, {}); @@ -39,22 +92,27 @@ define([ } //>>includeEnd('debug'); - if (defined(options.proxy)) { - deprecationWarning('TileMapServiceImageryProvider.proxy', 'The options.proxy parameter has been deprecated. Specify options.url as a Resource instance and set the proxy property there.'); - } - var deferred = when.defer(); UrlTemplateImageryProvider.call(this, deferred.promise); - var resource = Resource.createIfNeeded(options.url, { - proxy : options.proxy - }); - resource.appendForwardSlash(); + var resource; + var that = this; + when(options.url) + .then(function(url) { + resource = Resource.createIfNeeded(url); + resource.appendForwardSlash(); - this._tmsResource = resource; - this._xmlResource = resource.getDerivedResource({ - url : 'tilemapresource.xml' - }); + that._tmsResource = resource; + that._xmlResource = resource.getDerivedResource({ + url : 'tilemapresource.xml' + }); + }) + .otherwise(function(e) { + deferred.reject(e); + }); + + this._tmsResource = undefined; + this._xmlResource = undefined; this._options = options; this._deferred = deferred; this._metadataError = undefined; @@ -171,7 +229,7 @@ define([ // 'global-mercator' and 'global-geodetic' profiles. In the gdal2Tiles case, X and Y are always in // geodetic degrees. var isGdal2tiles = tilingSchemeName === 'geodetic' || tilingSchemeName === 'mercator'; - if (tilingScheme instanceof GeographicTilingScheme || isGdal2tiles) { + if (tilingScheme.projection instanceof GeographicProjection || isGdal2tiles) { sw = Cartographic.fromDegrees(swXY.x, swXY.y); ne = Cartographic.fromDegrees(neXY.x, neXY.y); } else { From c43d192f67116373e623f6c8ebe30c859fafb95a Mon Sep 17 00:00:00 2001 From: hpinkos Date: Fri, 4 Jan 2019 13:23:25 -0500 Subject: [PATCH 03/10] cleanup --- Source/Scene/IonImageryProvider.js | 6 +++--- Source/Scene/TileMapServiceImageryProvider.js | 6 ++++-- Specs/Scene/TileMapServiceImageryProviderSpec.js | 4 ++-- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/Source/Scene/IonImageryProvider.js b/Source/Scene/IonImageryProvider.js index 5cd92dc73bf3..1cf18bdb66c2 100644 --- a/Source/Scene/IonImageryProvider.js +++ b/Source/Scene/IonImageryProvider.js @@ -11,7 +11,7 @@ define([ '../ThirdParty/when', './ArcGisMapServerImageryProvider', './BingMapsImageryProvider', - './createTileMapServiceImageryProvider', + './TileMapServiceImageryProvider', './GoogleEarthEnterpriseMapsProvider', './MapboxImageryProvider', './SingleTileImageryProvider', @@ -31,7 +31,7 @@ define([ when, ArcGisMapServerImageryProvider, BingMapsImageryProvider, - createTileMapServiceImageryProvider, + TileMapServiceImageryProvider, GoogleEarthEnterpriseMapsProvider, MapboxImageryProvider, SingleTileImageryProvider, @@ -54,7 +54,7 @@ define([ GOOGLE_EARTH: createFactory(GoogleEarthEnterpriseMapsProvider), MAPBOX: createFactory(MapboxImageryProvider), SINGLE_TILE: createFactory(SingleTileImageryProvider), - TMS: createTileMapServiceImageryProvider, + TMS: createFactory(TileMapServiceImageryProvider), URL_TEMPLATE: createFactory(UrlTemplateImageryProvider), WMS: createFactory(WebMapServiceImageryProvider), WMTS: createFactory(WebMapTileServiceImageryProvider) diff --git a/Source/Scene/TileMapServiceImageryProvider.js b/Source/Scene/TileMapServiceImageryProvider.js index 77d2193e8578..aa96e26a8da2 100644 --- a/Source/Scene/TileMapServiceImageryProvider.js +++ b/Source/Scene/TileMapServiceImageryProvider.js @@ -5,6 +5,7 @@ define([ '../Core/defined', '../Core/deprecationWarning', '../Core/DeveloperError', + '../Core/GeographicProjection', '../Core/GeographicTilingScheme', '../Core/Rectangle', '../Core/Resource', @@ -20,6 +21,7 @@ define([ defined, deprecationWarning, DeveloperError, + GeographicProjection, GeographicTilingScheme, Rectangle, Resource, @@ -106,6 +108,8 @@ define([ that._xmlResource = resource.getDerivedResource({ url : 'tilemapresource.xml' }); + + that._requestMetadata(); }) .otherwise(function(e) { deferred.reject(e); @@ -120,8 +124,6 @@ define([ this._metadataSuccess = this._metadataSuccess.bind(this); this._metadataFailure = this._metadataFailure.bind(this); this._requestMetadata = this._requestMetadata.bind(this); - - this._requestMetadata(); } if (defined(Object.create)) { diff --git a/Specs/Scene/TileMapServiceImageryProviderSpec.js b/Specs/Scene/TileMapServiceImageryProviderSpec.js index 3ffa445100ae..b2ff2854a952 100644 --- a/Specs/Scene/TileMapServiceImageryProviderSpec.js +++ b/Specs/Scene/TileMapServiceImageryProviderSpec.js @@ -68,7 +68,7 @@ defineSuite([ }); it('resolves readyPromise when promise url is used', function() { - var provider = createTileMapServiceImageryProvider({ + var provider = new TileMapServiceImageryProvider({ url : when.resolve('made/up/tms/server/') }); @@ -95,7 +95,7 @@ defineSuite([ it('rejects readyPromise if options.url rejects', function() { var error = new Error(); - var provider = createTileMapServiceImageryProvider({ + var provider = new TileMapServiceImageryProvider({ url : when.reject(error) }); return provider.readyPromise.then(function() { From 27168b240ba2e66e6e056e3c12969afeb056b13e Mon Sep 17 00:00:00 2001 From: hpinkos Date: Mon, 7 Jan 2019 11:13:22 -0500 Subject: [PATCH 04/10] eslint --- Source/Scene/IonImageryProvider.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Scene/IonImageryProvider.js b/Source/Scene/IonImageryProvider.js index 1cf18bdb66c2..ed4c4f725fce 100644 --- a/Source/Scene/IonImageryProvider.js +++ b/Source/Scene/IonImageryProvider.js @@ -165,7 +165,7 @@ define([ var imageryProvider; var externalType = endpoint.externalType; if (!defined(externalType)) { - imageryProvider = createTileMapServiceImageryProvider({ + imageryProvider = new TileMapServiceImageryProvider({ url: new IonResource(endpoint, endpointResource) }); } else { From f512e79148f01d90320862beb237d1f460ef3d84 Mon Sep 17 00:00:00 2001 From: hpinkos Date: Mon, 7 Jan 2019 11:54:10 -0500 Subject: [PATCH 05/10] fix specs --- Source/Scene/TileMapServiceImageryProvider.js | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/Source/Scene/TileMapServiceImageryProvider.js b/Source/Scene/TileMapServiceImageryProvider.js index aa96e26a8da2..6c0a09d64362 100644 --- a/Source/Scene/TileMapServiceImageryProvider.js +++ b/Source/Scene/TileMapServiceImageryProvider.js @@ -97,6 +97,16 @@ define([ 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) @@ -114,16 +124,6 @@ define([ .otherwise(function(e) { deferred.reject(e); }); - - 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); } if (defined(Object.create)) { From 8138e4d975028bf89119cc899e8c13fc62f5a98d Mon Sep 17 00:00:00 2001 From: hpinkos Date: Thu, 21 Feb 2019 11:32:18 -0500 Subject: [PATCH 06/10] cleanup --- Apps/Sandcastle/gallery/Imagery Cutout.html | 2 +- .../gallery/Imagery Layers Manipulation.html | 192 ++++++++++-------- Source/Scene/TileMapServiceImageryProvider.js | 2 +- Source/Widgets/Viewer/Viewer.js | 2 +- 4 files changed, 106 insertions(+), 92 deletions(-) diff --git a/Apps/Sandcastle/gallery/Imagery Cutout.html b/Apps/Sandcastle/gallery/Imagery Cutout.html index d71be23999c6..eea8dba21712 100644 --- a/Apps/Sandcastle/gallery/Imagery Cutout.html +++ b/Apps/Sandcastle/gallery/Imagery Cutout.html @@ -42,7 +42,7 @@ 'use strict'; //Sandcastle_Begin var viewer = new Cesium.Viewer('cesiumContainer', { - imageryProvider : Cesium.createTileMapServiceImageryProvider({ + imageryProvider : new TileMapServiceImageryProvider({ url : Cesium.buildModuleUrl('Assets/Textures/NaturalEarthII') }), baseLayerPicker : false diff --git a/Apps/Sandcastle/gallery/Imagery Layers Manipulation.html b/Apps/Sandcastle/gallery/Imagery Layers Manipulation.html index a8f664ec408c..ef768048f989 100644 --- a/Apps/Sandcastle/gallery/Imagery Layers Manipulation.html +++ b/Apps/Sandcastle/gallery/Imagery Layers Manipulation.html @@ -21,24 +21,29 @@