UNPKG

earthtrek-core

Version:

Global Nominee NASA Space Apps Challenge 2017 Buenos Aires - Global Finalist (Best Use of Data) NASA Space Apps Challenge 2017 - 1D, 2D, 3D, Go! Challenge

392 lines (325 loc) 17.5 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); /** * @class EarthTrek * @module EarthTrek * @author SATrek * @author Alejandro Sanchez <alejandro.sanchez.trek@gmail.com> * @description EarthTrek - NASA Space Apps 2017 23 APR 2017. */ /**EXTERNAL */ /***/ exports.earthTrekInstance = earthTrekInstance; var _events = require('events'); var _events2 = _interopRequireDefault(_events); var _cesium = require('./utils/cesium'); var _cesium2 = _interopRequireDefault(_cesium); var _underscore = require('underscore'); var _underscore2 = _interopRequireDefault(_underscore); var _earthtrekEntity = require('./earthtrek-entity'); var _earthtrekEntity2 = _interopRequireDefault(_earthtrekEntity); var _earthtrekData = require('./earthtrek-data'); var _earthtrekData2 = _interopRequireDefault(_earthtrekData); var _earthtrekSatellite = require('./earthtrek-satellite'); var _earthtrekSatellite2 = _interopRequireDefault(_earthtrekSatellite); var _earthtrekLayerCollection = require('./earthtrek-layer-collection'); var _earthtrekLayerCollection2 = _interopRequireDefault(_earthtrekLayerCollection); var _earthtrekUtils = require('./utils/earthtrek-utils'); var _earthtrekUtils2 = _interopRequireDefault(_earthtrekUtils); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var instance = null; /** * * @returns {*} */ function earthTrekInstance() { return instance; } var EarthTrekCore = function () { /** * Constructor * @param options */ function EarthTrekCore(options) { _classCallCheck(this, EarthTrekCore); window.CESIUM_BASE_URL = './'; require('cesium/Build/Cesium/Widgets/widgets.css'); require('../../src/css/main.css'); require('../../src/css/left-toolbar.css'); if (!instance) { instance = this; } if (!options.mainContainer) { throw new Error('Invalid Main Container'); } if (!options.startTime) { throw new Error('Invalid Start Time'); } if (!options.endTime) { throw new Error('Invalid End Time'); } if (!options.initialTime) { this.initialTime = _cesium2.default.JulianDate.fromDate(new Date(options.endTime)); } if (!options.maxDistanceCamera) { options.maxDistanceCamera = 10000000000; //10,000,000,000 meters } if (!options.enableLighting) { options.enableLighting = false; } if (!options.showFeatures) { options.showFeatures = true; } if (!options.orbitalDataUpdateTime) { options.orbitalDataUpdateTime = 10; } if (!options.multiplier) { options.multiplier = 10; //intervals } if (!options.orbitDuration) { options.orbitDuration = 7200; //seconds } if (!options.frequency) { options.frequency = 50; //intervals } if (!options.entities) { options.entities = { orbitDuration: options.orbitDuration, frequency: options.frequency }; } if (!options.env) { options.env = 'dev'; } this.startTime = _cesium2.default.JulianDate.fromDate(new Date(options.startTime)); this.endTime = _cesium2.default.JulianDate.fromDate(new Date(options.endTime)); this.initialTime = _cesium2.default.JulianDate.fromDate(new Date(options.initialTime)); if (options.imageryProvider != undefined) { this.imageryProvider = options.imageryProvider; } this.previousTime = _earthtrekUtils2.default.isoDate(this.initialTime.toString()); this.lastPropagationTime = this.initialTime; this.multiplier = options.multiplier; this.mainContainerId = options.mainContainer; this.maxDistanceCamera = options.maxDistanceCamera; this.enableLighting = options.enableLighting; this.orbitalDataUpdateTime = options.orbitalDataUpdateTime; this.orbitDuration = options.orbitDuration; this.frequency = options.frequency; if (options.env == 'dev') { this.debugMode = true; } this.options = options; this.entities = []; this.layers = new _earthtrekLayerCollection2.default(); this.eventEmitter = new _events2.default.EventEmitter(); this.createViewer(); return instance; } _createClass(EarthTrekCore, [{ key: 'getLayers', value: function getLayers() { return this.layers; } /** * * @returns {events.EventEmitter} */ }, { key: 'getEventEmitter', value: function getEventEmitter() { return this.eventEmitter; } /** * getClock * @returns {Cesium.Clock|*} */ }, { key: 'getClock', value: function getClock() { if (this.clock === undefined) { this.clock = new _cesium2.default.Clock({ startTime: this.startTime, endTime: this.endTime, currentTime: this.initialTime, multiplier: this.multiplier, clockStep: _cesium2.default.ClockStep.SYSTEM_CLOCK_MULTIPLIER }); } return this.clock; } /** * Create Viewer * @param mainContainer * @returns {Cesium.Viewer|*} */ }, { key: 'createViewer', value: function createViewer() { if (this.viewer === undefined) { var viewerOptions = { clock: this.getClock(), baseLayerPicker: false, requestWaterMask: true, automaticallyTrackDataSourceClocks: false, navigationHelpButton: false, infoBox: false, creditContainer: "credit", terrainExaggeration: 10 }; if (this.imageryProvider) { viewerOptions.imageryProvider = this.imageryProvider; } this.viewer = new _cesium2.default.Viewer(this.mainContainerId, viewerOptions); this.viewer.scene.globe.tileCacheSize = 1000; this.viewer.scene.globe.enableLighting = this.enableLighting; this.getClock().onTick.addEventListener(this.onClockUpdate, this); this.viewer.timeline.zoomTo(this.startTime, this.endTime); this.viewer.camera.frustum.far = this.maxDistanceCamera; this.viewer.camera.defaultZoomAmount = 500000.0; if (this.debugMode == true) { this.viewer.scene.debugShowFramesPerSecond = true; } } this.lastOrbitalDataUpdated = this.clock.currentTime; return this.viewer; } /** * Get Viewer * @returns {Cesium.Viewer} */ }, { key: 'getViewer', value: function getViewer() { return this.viewer; } }, { key: 'pullSatellitesData', value: function pullSatellitesData(callback) { var _this = this; _earthtrekData2.default.getFullData({ getCache: this.options.getCache }, function (satellites) { satellites.forEach(function (satelliteData) { var entity = _this.viewer.entities.getById(satelliteData.satId); callback(satelliteData, entity); }); _this.getEventEmitter().emit('entities-added', { entities: _this.entities }); }); } /** * Add Entity * @param satelliteData */ }, { key: 'addEntity', value: function addEntity(satelliteData) { var earthTrekEntity = new _earthtrekEntity2.default(satelliteData, this.getClock().currentTime, this.options.entities); var entity = this.viewer.entities.add(earthTrekEntity.getEntityData()); this.entities.push(entity); this.getEventEmitter().emit('entity-added', { entity: entity, satelliteData: satelliteData, earthTrekEntity: earthTrekEntity }); } /** * on Clock Update * @param clock */ }, { key: 'onClockUpdate', value: function onClockUpdate(clock) { var isoDateTime = clock.currentTime.toString(); var time = _earthtrekUtils2.default.isoDate(isoDateTime); if (time !== this.previousTime) { this.getEventEmitter().emit('date-updated', { time: time }); // updateLayers(); } this.updateEntities(time); if (this.viewer.selectedEntity != null && (_cesium2.default.JulianDate.secondsDifference(this.clock.currentTime, this.lastOrbitalDataUpdated) > this.orbitalDataUpdateTime || _cesium2.default.JulianDate.secondsDifference(this.lastOrbitalDataUpdated, this.clock.currentTime) > this.orbitalDataUpdateTime)) { this.getEventEmitter().emit('update-orbital-data', { entity: this.viewer.selectedEntity }); this.lastOrbitalDataUpdated = this.clock.currentTime; } } }, { key: 'on', /** * Register events * @param event * @param callback */ value: function on(event, callback) { this.getEventEmitter().on(event, callback); } /** * Raise Event events * @param event * @param params */ }, { key: 'raise', value: function raise(event) { var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; this.getEventEmitter().emit(event, params); } /** * Update Entities * @param isoTime */ }, { key: 'updateEntities', value: function updateEntities(isoTime) { var _this2 = this; var currentTime = this.getClock().currentTime; if (_cesium2.default.JulianDate.secondsDifference(this.getClock().currentTime, this.lastPropagationTime) > this.orbitDuration || _cesium2.default.JulianDate.secondsDifference(this.lastPropagationTime, this.getClock().currentTime) > this.orbitDuration) { var p1 = new Promise(function (resolve, reject) { if (isoTime !== _this2.previousTime) { _this2.previousTime = isoTime; _this2.lastPropagationTime = currentTime; var startDate = new Date(isoTime); startDate.setDate(startDate.getDate()); var endDate = new Date(isoTime); endDate.setDate(endDate.getDate() + 1); return resolve(_earthtrekData2.default.getTLEs(_earthtrekData2.default.getSatelliteIds(), { startDate: startDate, endDate: endDate })); } else { reject(time); } }); p1.then(function (tles) { tles.data.forEach(function (tle) { var entity = _this2.viewer.entities.getById(tle.satId); if (entity != null) { entity.properties.tle.setValue(tle.tle); entity.properties.data.setValue(_underscore2.default.extend(entity.properties.data.getValue(), tle.data)); } }); return new Promise(propagation).then(function () { _this2.getEventEmitter().emit('entities-updated'); }); }, function (isoTime) { return new Promise(propagation).then(function () { _this2.getEventEmitter().emit('entities-updated'); }); }); var that = this; var propagation = function propagation(resolve) { that.entities.forEach(function (entity) { var newStart = that.clock.currentTime; var tle1 = entity.properties.getValue(newStart).tle[0]; var tle2 = entity.properties.getValue(newStart).tle[1]; var samples = _earthtrekSatellite2.default.getSamples(tle1, tle2, newStart, that.orbitDuration, that.frequency); entity.position = samples.positions; entity.velocity = samples.velocities; entity.altitude = samples.heights; that.getEventEmitter().emit('entity-updated', { entity: entity, newStart: newStart }); }); that.lastPropagationTime = that.clock.currentTime; return resolve(); }; } } }]); return EarthTrekCore; }(); exports.default = EarthTrekCore;