Models/CesiumTerrainCatalogItem.js

"use strict";

/*global require*/

var CesiumTerrainProvider = require("terriajs-cesium/Source/Core/CesiumTerrainProvider")
  .default;
var defined = require("terriajs-cesium/Source/Core/defined").default;

var IonResource = require("terriajs-cesium/Source/Core/IonResource").default;
var raiseErrorToUser = require("./raiseErrorToUser");

var TerrainCatalogItem = require("./TerrainCatalogItem");
var inherit = require("../Core/inherit");
var i18next = require("i18next").default;

/**
 * A {@link TerrainCatalogItem} representing a Cesium terrain provider.
 *
 * @alias CesiumTerrainCatalogItem
 * @constructor
 * @extends TerrainCatalogItem
 *
 * @param {Terria} terria The Terria instance.
 */
var CesiumTerrainCatalogItem = function(terria) {
  TerrainCatalogItem.call(this, terria);

  /**
   * Gets or sets the ID of the Cesium Ion asset to access. If this property is set, the {@link CesiumTerrainCatalogItem#url}
   * property is ignored.
   * @type {Number}
   */
  this.ionAssetId = undefined;

  /**
   * Gets or sets the Cesium Ion access token to use to access the terrain. If not specified, the token specified
   * using the `cesiumIonAccessToken` property in `config.json` is used. This property is ignored if
   * {@link CesiumTerrainCatalogItem#ionAssetId} is not set.
   * @type {String}
   */
  this.ionAccessToken = undefined;

  /**
   * Gets or sets the Cesium Ion access token to use to access the terrain. If not specified, the default Ion
   * server, `https://api.cesium.com/`, is used. This property is ignored if
   * {@link CesiumTerrainCatalogItem#ionAssetId} is not set.
   * @type {String}
   */
  this.ionServer = undefined;
};

inherit(TerrainCatalogItem, CesiumTerrainCatalogItem);

Object.defineProperties(CesiumTerrainCatalogItem.prototype, {
  /**
   * Gets the type of data item represented by this instance.
   * @memberOf CesiumTerrainCatalogItem.prototype
   * @type {String}
   */
  type: {
    get: function() {
      return "cesium-terrain";
    }
  },

  /**
   * Gets a human-readable name for this type of data source, 'Tile Map Server'.
   * @memberOf CesiumTerrainCatalogItem.prototype
   * @type {String}
   */
  typeName: {
    get: function() {
      return i18next.t("models.cesiumTerrain.name");
    }
  }
});

CesiumTerrainCatalogItem.prototype._createTerrainProvider = function() {
  var resource = this.url;
  if (defined(this.ionAssetId)) {
    resource = IonResource.fromAssetId(this.ionAssetId, {
      accessToken:
        this.ionAccessToken ||
        this.terria.configParameters.cesiumIonAccessToken,
      server: this.ionServer
    }).otherwise(e => {
      raiseErrorToUser(this.terria, e);
    });
  }

  return new CesiumTerrainProvider({
    url: resource
  });
};

module.exports = CesiumTerrainCatalogItem;