UNPKG

terriajs

Version:

Geospatial data visualization platform.

149 lines (122 loc) 4.29 kB
'use strict'; /*global require*/ var defined = require('terriajs-cesium/Source/Core/defined'); var defineProperties = require('terriajs-cesium/Source/Core/defineProperties'); var DeveloperError = require('terriajs-cesium/Source/Core/DeveloperError'); var CatalogItem = require('./CatalogItem'); var inherit = require('../Core/inherit'); var TerriaError = require('../Core/TerriaError'); /** * A {@link CatalogItem} that is added to the map as 3D terrain. * * @alias TerrainCatalogItem * @constructor * @extends CatalogItem * @abstract * * @param {Terria} terria The Terria instance. */ var TerrainCatalogItem = function(terria) { CatalogItem.call(this, terria); this._terrainProvider = undefined; this._originalTerrainProvider = undefined; }; inherit(CatalogItem, TerrainCatalogItem); defineProperties(TerrainCatalogItem.prototype, { /** * Gets the terrain provider object associated with this data source. * This property is undefined if the data source is not enabled. * @memberOf TerrainCatalogItem.prototype * @type {Object} */ terrainProvider : { get : function() { return this._terrainProvider; } }, /** * Gets a value indicating whether this data source, when enabled, can be reordered with respect to other data sources. * Data sources that cannot be reordered are typically displayed above reorderable data sources. * @memberOf TerrainCatalogItem.prototype * @type {Boolean} */ supportsReordering : { get : function() { return false; } }, /** * Gets a value indicating whether the opacity of this data source can be changed. * @memberOf TerrainCatalogItem.prototype * @type {Boolean} */ supportsOpacity : { get : function() { return false; } } }); TerrainCatalogItem.prototype._createTerrainProvider = function() { throw new DeveloperError('_createTerrainProvider must be implemented in the derived class.'); }; TerrainCatalogItem.prototype._showInCesium = function() { this._disableOtherTerrainItems(); var terrainProvider = this._terrainProvider = this._createTerrainProvider(); var scene = this.terria.cesium.scene; this._originalTerrainProvider = scene.terrainProvider; scene.terrainProvider = terrainProvider; }; TerrainCatalogItem.prototype._hideInCesium = function() { if (!defined(this._originalTerrainProvider)) { return; } this.terria.cesium.scene.terrainProvider = this._originalTerrainProvider; this._originalTerrainProvider = undefined; this._terrainProvider = undefined; }; TerrainCatalogItem.prototype._showInLeaflet = function() { this.isShown = false; throw new TerriaError({ sender: this, title: 'Not supported in 2D', message: '"' + this.name + '" cannot be show in the 2D view. Switch to 3D and try again.' }); }; TerrainCatalogItem.prototype._hideInLeaflet = function() { // Nothing to be done. }; TerrainCatalogItem.prototype._enableInCesium = function() { // Nothing to be done. }; TerrainCatalogItem.prototype._disableInCesium = function() { // Nothing to be done. }; TerrainCatalogItem.prototype._enableInLeaflet = function() { // Nothing to be done. }; TerrainCatalogItem.prototype._disableInLeaflet = function() { // Nothing to be done. }; TerrainCatalogItem.prototype._disableOtherTerrainItems = function() { var items = this.terria.nowViewing.items; for (var i = 0; i < items.length; i++) { var item = items[i]; if (item !== this && hasTerrainProvider(item)) { item.isShown = false; } } }; function hasTerrainProvider(catalogItem) { if (defined(catalogItem.terrainProvider)) { return true; } if (catalogItem.isMappable && defined(catalogItem.items)) { for (var i = 0; i < catalogItem.items.length; ++i) { if (hasTerrainProvider(catalogItem.items[i])) { return true; } } } return false; } module.exports = TerrainCatalogItem;