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
95 lines (82 loc) • 3.73 kB
JavaScript
/**
* @class earthTrekSatellite
* @module EarthTrek
* @author SATrek
* @author Alejandro Sanchez <alejandro.sanchez.trek@gmail.com>
* @description EarthTrek - NASA Space Apps 2017 12 MAY 2017.
*/
var satellitePropagation = require('./earthtrek-propagation');
var JulianDate = require('cesium/Source/Core/JulianDate');
var Cartesian3 = require('cesium/Source/Core/Cartesian3');
var SampledPositionProperty = require('cesium/Source/DataSources/SampledPositionProperty');
var SampledProperty = require('cesium/Source/DataSources/SampledProperty');
var earthTrekSatellite = earthTrekSatellite || {};
earthTrekSatellite.calculatePosition = function(tleLine1, tleLine2, startTime, date, deltaStep, since) {
date.setSeconds(date.getSeconds() + deltaStep)
var propagate = satellitePropagation.getPositionAndVelocity(tleLine1, tleLine2, date);
var newPosition = propagate.position;
var samplePosition = {};
samplePosition.time = JulianDate.addSeconds(startTime, since, new JulianDate());
samplePosition.position = Cartesian3.fromDegrees(newPosition.longitude, newPosition.latitude, newPosition.height);
samplePosition.height = newPosition.height;
samplePosition.velocity = propagate.velocity;
return samplePosition;
}
earthTrekSatellite.calculatePositions = function(tleLine1, tleLine2, startTime, duration, frequency, date) {
var deltaStep = duration / (frequency > 0 ? frequency : 1);
var positions = [];
positions.times = [];
positions.positions = [];
positions.heights = [];
positions.velocities = [];
for (var since = 0; since <= duration; since += deltaStep) {
var samplePosition = this.calculatePosition(tleLine1, tleLine2, startTime, date, deltaStep, since);
positions.times.push(samplePosition.time);
positions.positions.push(samplePosition.position);
positions.heights.push(samplePosition.height);
positions.velocities.push(samplePosition.velocity);
}
return positions;
}
earthTrekSatellite.getSamples = function(tleLine1, tleLine2, startTime, duration, frequency) {
var previousDate = new Date(JulianDate.toIso8601(startTime));
previousDate.setSeconds(previousDate.getSeconds() - duration);
var previousTimeJulian = JulianDate.fromDate(previousDate);
var previousPositions = this.calculatePositions(tleLine1, tleLine2, previousTimeJulian, duration, frequency, previousDate);
var positions = new SampledPositionProperty();
positions.addSamples(
previousPositions.times,
previousPositions.positions
);
var heights = new SampledProperty(Number);
heights.addSamples(
previousPositions.times,
previousPositions.heights
);
var velocities = new SampledPositionProperty();
velocities.addSamples(
previousPositions.times,
previousPositions.velocities
);
var currentDate = new Date(JulianDate.toIso8601(startTime));
var latestPositions = this.calculatePositions(tleLine1, tleLine2, startTime, duration, frequency, currentDate);
positions.addSamples(
latestPositions.times,
latestPositions.positions
);
heights.addSamples(
latestPositions.times,
latestPositions.heights
);
velocities.addSamples(
latestPositions.times,
latestPositions.velocities
);
return {positions: positions, heights: heights, velocities: velocities};
}
earthTrekSatellite.addSamples = function(times, values) {
var property = new SampledPositionProperty();
property.addSamples(times, values);
return property;
}
module.exports = earthTrekSatellite;