terriajs
Version:
Geospatial data visualization platform.
162 lines (129 loc) • 5.52 kB
JavaScript
;
/*global require*/
var defineProperties = require('terriajs-cesium/Source/Core/defineProperties');
var knockout = require('terriajs-cesium/Source/ThirdParty/knockout');
var when = require('terriajs-cesium/Source/ThirdParty/when');
var TerriaError = require('../Core/TerriaError');
var CatalogGroup = require('./CatalogGroup');
var inherit = require('../Core/inherit');
var UrthecastCatalogItem = require('./UrthecastCatalogItem');
var urthecastClient = require('urthecast');
/**
* A {@link CatalogGroup} representing a collection of avalible Urthecast sensor platforms.
*
* @alias UrthecastCatalogGroup
* @constructor
* @extends CatalogGroup
*
* @param {Terria} terria The Terria instance.
*/
var UrthecastCatalogGroup = function(terria) {
CatalogGroup.call(this, terria);
/**
* Gets or sets a hash of names of blacklisted data layers. A layer that appears in this hash
* will not be shown to the user. In this hash, the keys should be the Title of the layers to blacklist,
* and the values should be "true". This property is observable.
* @type {Object}
*/
this.blacklist = undefined;
knockout.track(this, ['blacklist']);
};
inherit(CatalogGroup, UrthecastCatalogGroup);
defineProperties(UrthecastCatalogGroup.prototype, {
/**
* Gets the type of data member represented by this instance.
* @memberOf UrthecastCatalogGroup.prototype
* @type {String}
*/
type : {
get : function() {
return 'urthecast-group';
}
},
/**
* Gets a human-readable name for this type of data source, such as 'Urthcast Sensor Platforms'.
* @memberOf UrthecastCatalogGroup.prototype
* @type {String}
*/
typeName : {
get : function() {
return 'Urthcast Sensor Platforms';
}
},
});
UrthecastCatalogGroup.prototype._load = function() {
var catalogGroup = this;
var deferred = when.defer();
var apiKey = catalogGroup.terria.configParameters.urthecastApiKey;
var apiSecret = catalogGroup.terria.configParameters.urthecastApiSecret;
if (!apiKey || !apiSecret) {
deferred.reject(createTerriaError(
catalogGroup.terria,
'Please Provide an Urthecast API Key and Secret',
'Visit [developers.urthecast.com](https://developers.urthecast.com) to obatin your Urthecast API key and secret. If you already have an API key and secret and are having trouble please visit [support.urthecast.com](https://support.urthecast.com) for more information.'
)
);
return deferred.promise;
}
urthecastClient(apiKey, apiSecret).v1.satellite_tracker('/sensor_platforms', {}, function(err, res) {
if (err) {
deferred.reject(createTerriaError(catalogGroup.terria, res.body.messages[0]));
return;
}
createSensorPlatformsGroup(catalogGroup, res.body.payload);
deferred.resolve();
});
return deferred.promise;
};
function createSensorPlatformsGroup(catalogGroup, sensorPlatforms) {
var sensorPlatformsGroup = new CatalogGroup(catalogGroup.terria);
sensorPlatformsGroup.name = 'Sensor Platforms';
for (var i = 0; i < sensorPlatforms.length; i++) {
var sensor = sensorPlatforms[i];
if (catalogGroup.blacklist && catalogGroup.blacklist[sensor.name]) {
console.log('Provider Feedback: Filtering out ' + sensor.name + ' because it is blacklisted.');
} else {
var result = new CatalogGroup(catalogGroup.terria);
result.name = sensor.name;
sensorPlatformsGroup.items.push(result);
createCatalogItem(result, sensor);
}
}
catalogGroup.add(sensorPlatformsGroup);
}
function createCatalogItem(catalogGroup, sensor) {
// NOTE there is no Urthecast API that returns available renderers.
// See https://developers.urthecast.com/docs/map-tiles#service-url for renderer list.
var renderers = [
{ name: 'True RGB', id: 'rgb' },
{ name: 'Normalized Difference Vegetation Index (NDVI)', id: 'ndvi' },
{ name: 'Enhanced Vegetation Index (EVI)', id: 'evi' },
{ name: 'Normalized Difference Water Index (NDWI)', id: 'ndwi' },
{ name: 'False-color NIR', id: 'false-color-nir' },
];
for (var i = 0; i < renderers.length; i++ ) {
var item = new UrthecastCatalogItem(catalogGroup.terria);
item.name = renderers[i].name;
item.platform = sensor.key;
item.renderer = renderers[i].id;
item.description = true;
catalogGroup.add(item);
}
}
function createTerriaError(terria, title, message) {
if (!message) {
message = getDefaultErrorMessage(terria);
}
return new TerriaError({
title: title,
message: message
});
}
function getDefaultErrorMessage(terria) {
var message = '<p>';
message += 'This error may indicate that the group you opened is temporarily unavailable or there is a problem with your internet connection. Try opening the group again, and if the problem persists, please report it by sending an email to ';
message += '<a href="mailto:' + terria.supportEmail + '">' + terria.supportEmail + '</a>.';
message += '</p>';
return message;
}
module.exports = UrthecastCatalogGroup;