├── .gitignore ├── README.md ├── exports.js ├── lib ├── constants.js ├── czml.js ├── math.js ├── orbit.js └── writer.js ├── package-lock.json ├── package.json └── test └── test.js /.gitignore: -------------------------------------------------------------------------------- 1 | test/samples/ 2 | node_modules/ 3 | test/Cesium* 4 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Basic usage 2 | 3 | From keplerian elements: 4 | ``` 5 | var czml = require("czml-writer"); 6 | 7 | var orbit = new czml.orbit.fromParams({ 8 | apogee: 426.9, // km 9 | perigee: 416.2, // km 10 | inclination: 51.65, // deg 11 | rightAscension: 304.1, // deg 12 | argumentOfPeriapsis: 117.8 // deg 13 | }); 14 | var output = orbit.czml(); 15 | ``` 16 | 17 | From two-line elements 18 | ``` 19 | var czml = require("czml-writer"); 20 | 21 | var tle = 'NOAA 14\n' + 22 | '1 23455U 94089A 97320.90946019 .00000140 00000-0 10191-3 0 2621\n' + 23 | '2 23455 99.0090 272.6745 0008546 223.1686 136.8816 14.11711747148495'; 24 | var orbit = new czml.orbit.fromTle(tle); 25 | var output = orbit.czml(); 26 | ``` 27 | 28 | To expose and use [kepler.js](https://github.com/jordanstephens/kepler.js) orbit object 29 | ``` 30 | var kepler = orbit.orbit; 31 | 32 | //angularMomentum 33 | var angularMomentum = kepler.angularMomentum(); 34 | 35 | //radialVelocity 36 | var radialVelocity = kepler.radialVelocity(); 37 | 38 | //eccentricity 39 | var eccentricity = kepler.eccentricity(); 40 | 41 | //semimajorAxis 42 | var semimajorAxis = kepler.semimajorAxis(); 43 | 44 | //semiminorAxis 45 | var semiminorAxis = kepler.semiminorAxis(); 46 | 47 | //semilatusRectum 48 | var semilatusRectum = kepler.semilatusRectum(); 49 | 50 | //inclination 51 | var inclination = kepler.inclination(); 52 | 53 | //nodeLine 54 | var nodeLine = kepler.nodeLine(); 55 | 56 | //rightAscension 57 | var rightAscension = kepler.rightAscension(); 58 | 59 | //argumentOfPeriapsis 60 | var argumentOfPeriapsis = kepler.argumentOfPeriapsis(); 61 | 62 | //trueAnomaly 63 | var trueAnomaly = kepler.trueAnomaly(); 64 | 65 | //apoapsis 66 | var apoapsis = kepler.apoapsis(); 67 | 68 | //periapsis 69 | var periapsis = kepler.periapsis(); 70 | 71 | //period 72 | var period = kepler.period(); 73 | ``` 74 | 75 | # Test Script 76 | 77 | Basic tests: 78 | `node test/test.js` 79 | 80 | Test script with some help to get started with Cesium 81 | `node test/test.js --cesiumDemo` 82 | -------------------------------------------------------------------------------- /exports.js: -------------------------------------------------------------------------------- 1 | window.czml = require("./lib/czml"); 2 | 3 | //https://cesiumjs.org/releases/1.1/Apps/Sandcastle/index.html?src=Hello%20World.html&label=Showcases -------------------------------------------------------------------------------- /lib/constants.js: -------------------------------------------------------------------------------- 1 | var constants = {}; 2 | 3 | module.exports = constants; 4 | 5 | constants.now = Math.round((new Date()).getTime() / 1000); 6 | 7 | constants.earth = {}; 8 | constants.earth.G = (6.674)*Math.pow(10,-11); // gravitational constant 9 | constants.earth.M = (5.972)*Math.pow(10,24); // mass -------------------------------------------------------------------------------- /lib/czml.js: -------------------------------------------------------------------------------- 1 | var czml = {}; 2 | 3 | module.exports = czml; 4 | 5 | czml.orbit = require("./orbit"); 6 | czml.constants = require("./constants"); -------------------------------------------------------------------------------- /lib/math.js: -------------------------------------------------------------------------------- 1 | var constants = require("./constants"); 2 | 3 | var math = {}; 4 | 5 | module.exports = math; 6 | 7 | //references: 8 | //http://orbitsimulator.com/gravity/articles/smaCalculator.html, 9 | //https://space.stackexchange.com/questions/18289/how-to-get-semi-major-axis-from-tle 10 | math.semiMajorAxis = function semiMajorAxis(meanMotion) { 11 | var P = (60*60*24)/meanMotion; //period 12 | var G = constants.earth.G; 13 | var M = constants.earth.M; 14 | var pi = Math.PI; 15 | 16 | return Math.pow( (Math.pow(P,2)*G*M) / (4*Math.pow(pi,2)) , 1/3)/1000; 17 | } -------------------------------------------------------------------------------- /lib/orbit.js: -------------------------------------------------------------------------------- 1 | var Kepler = require('kepler.js'); 2 | var TLE = require('tle') 3 | 4 | var writer = require("./writer"); 5 | var math = require("./math"); 6 | 7 | module.exports = orbit; 8 | 9 | function orbit(x) { 10 | this.orbit = x; 11 | this.settings = { 12 | duration: 60*60*48, // 2 days in seconds 13 | step: 60, // 60 seconds 14 | name: "Satellite", 15 | epoch: Math.round((new Date()).getTime() / 1000) 16 | } 17 | } 18 | 19 | orbit.fromParams = function fromParams(params) { 20 | var x = new Kepler.Orbit.fromParams(params); 21 | return new orbit(x); 22 | } 23 | 24 | orbit.fromTle = function fromTle(tle) { 25 | var tle_ = TLE.parse(tle); 26 | var x = new Kepler.Orbit.fromParams({ 27 | semimajorAxis: math.semiMajorAxis(tle_.motion), // km 28 | eccentricity: tle_.eccentricity, 29 | inclination: tle_.inclination, // deg 30 | rightAscension: tle_.ascension, // deg 31 | argumentOfPeriapsis: tle_.perigee // deg 32 | }); 33 | var y = new orbit(x); 34 | y.setName(tle_.name); 35 | y.setEpoch(tle_.date.getTime()/1000); 36 | return y; 37 | } 38 | 39 | //getter 40 | orbit.prototype.getSettings = function getSettings() { 41 | return this.settings; 42 | } 43 | 44 | orbit.prototype.update = function propagate(time) { 45 | this.orbit = this.orbit.update(time); 46 | this.settings.epoch += time; 47 | } 48 | 49 | orbit.prototype.czml = function czml() { 50 | return writer.write(this.orbit, this.settings); 51 | } 52 | 53 | orbit.prototype.setDuration = function setDuration(x) { 54 | this.settings.duration = x; 55 | } 56 | 57 | orbit.prototype.setStep = function setStep(x) { 58 | this.settings.step = x; 59 | } 60 | 61 | orbit.prototype.setName = function setName(x) { 62 | this.settings.name = x; 63 | } 64 | 65 | orbit.prototype.setEpoch = function setEpoch(x) { 66 | this.settings.epoch = x; 67 | } -------------------------------------------------------------------------------- /lib/writer.js: -------------------------------------------------------------------------------- 1 | var Kepler = require('kepler.js'); 2 | 3 | var writer = {}; 4 | 5 | module.exports = writer; 6 | 7 | writer.write = function write(orbit, settings) { 8 | start = settings.epoch; 9 | dur = settings.duration; 10 | var end = start + dur; 11 | interval = new Date(start*1000).toISOString() + "/" + new Date(end*1000).toISOString(); 12 | startDate = new Date(start*1000).toISOString(); 13 | 14 | var czml = []; 15 | czml[0] = { 16 | "id": "document", 17 | "name": "simple", 18 | "version": "1.0", 19 | "clock": { 20 | "interval": interval, 21 | "currentTime": startDate, 22 | "multiplier": 60, 23 | "range": "LOOP_STOP", 24 | "step": "SYSTEM_CLOCK_MULTIPLIER" 25 | } 26 | } 27 | czml[1] = instance(orbit, settings); 28 | return czml; 29 | } 30 | 31 | function instance(orbit, settings) { 32 | 33 | startEpoch = settings.epoch; 34 | duration = settings.duration; 35 | step = settings.step; 36 | name = settings.name; 37 | 38 | //use kepler.js to simulate the orbit 39 | propagation = cartesianPropagation(orbit, step, duration); 40 | 41 | //check if period is too small 42 | if (!propagation) { 43 | return 0; 44 | } 45 | 46 | //start epoch 47 | start = formatDate(startEpoch); 48 | 49 | //end epoch 50 | end = formatDate(startEpoch + duration); 51 | 52 | //generate path based on start/end/period 53 | path = generatePath(propagation.kepler.period(), startEpoch, startEpoch + duration); 54 | 55 | //check if period is too small 56 | if (!path) { 57 | return 0; 58 | } 59 | 60 | var czml = { 61 | "id": "Satellite/" + name, 62 | "name": name, 63 | "availability": start + "/" + end, 64 | "description": name, 65 | "billboard": { 66 | "eyeOffset": { 67 | "cartesian": [ 68 | 0, 0, 0 69 | ] 70 | }, 71 | "horizontalOrigin": "CENTER", 72 | "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADJSURBVDhPnZHRDcMgEEMZjVEYpaNklIzSEfLfD4qNnXAJSFWfhO7w2Zc0Tf9QG2rXrEzSUeZLOGm47WoH95x3Hl3jEgilvDgsOQUTqsNl68ezEwn1vae6lceSEEYvvWNT/Rxc4CXQNGadho1NXoJ+9iaqc2xi2xbt23PJCDIB6TQjOC6Bho/sDy3fBQT8PrVhibU7yBFcEPaRxOoeTwbwByCOYf9VGp1BYI1BA+EeHhmfzKbBoJEQwn1yzUZtyspIQUha85MpkNIXB7GizqDEECsAAAAASUVORK5CYII=", 73 | "pixelOffset": { 74 | "cartesian2": [ 75 | 0, 0 76 | ] 77 | }, 78 | "scale": 1.5, 79 | "show": true, 80 | "verticalOrigin": "CENTER" 81 | }, 82 | "label": { 83 | "fillColor": { 84 | "rgba": [ 85 | 255, 0, 255, 255 86 | ] 87 | }, 88 | "font": "11pt Lucida Console", 89 | "horizontalOrigin": "LEFT", 90 | "outlineColor": { 91 | "rgba": [ 92 | 0, 0, 0, 255 93 | ] 94 | }, 95 | "outlineWidth": 2, 96 | "pixelOffset": { 97 | "cartesian2": [ 98 | 12, 0 99 | ] 100 | }, 101 | "show": true, 102 | "style": "FILL_AND_OUTLINE", 103 | "text": name, 104 | "verticalOrigin": "CENTER" 105 | }, 106 | "path": { 107 | "show": [{ 108 | "interval": start + "/" + end, 109 | "boolean": true 110 | }], 111 | "width": 1, 112 | "material": { 113 | "solidColor": { 114 | "color": { 115 | "rgba": [ 116 | 255, 0, 255, 255 117 | ] 118 | } 119 | } 120 | }, 121 | "resolution": 120, 122 | "leadTime": path.leadTime, 123 | "trailTime": path.trailTime 124 | 125 | }, 126 | "position": { 127 | "interpolationAlgorithm": "LAGRANGE", 128 | "interpolationDegree": 5, 129 | "referenceFrame": "INERTIAL", 130 | "epoch": start, 131 | "cartesian": propagation.cartesian 132 | } 133 | }; 134 | 135 | return czml; 136 | } 137 | 138 | function generatePath(period, start, end) { 139 | 140 | var leadTime = []; 141 | var trailTime = []; 142 | var curr = start; 143 | 144 | //if the period is less than 30 minutes, return error 145 | if (period < (60 * 30)) { 146 | return 0; 147 | } else { 148 | while (curr < end) { 149 | interval = formatDate(curr) + "/" + formatDate(curr + period); 150 | leadTime.push({ interval: interval, epoch: formatDate(curr), number: [0, period, period, 0] }); 151 | trailTime.push({ interval: interval, epoch: formatDate(curr), number: [0, 0, period, period] }); 152 | curr += period; 153 | } 154 | 155 | obj = { 156 | leadTime: leadTime, 157 | trailTime: trailTime 158 | } 159 | return obj; 160 | } 161 | 162 | } 163 | 164 | function cartesianPropagation(orbit, step, duration) { 165 | 166 | //if the period is less than 30 minutes, return error 167 | if (orbit.period() < (60 * 30)) { 168 | return 0; 169 | } else { 170 | 171 | data = JSON.parse(orbit.r.inspect()); 172 | var cartesian = [0, data[0] * 1000, data[1] * 1000, data[2] * 1000]; 173 | 174 | for (var i = 0; i <= duration; i += step) { 175 | 176 | orbit = orbit.update(step); 177 | data = JSON.parse(orbit.r.inspect()); 178 | 179 | cartesian.push(i); 180 | cartesian.push(data[0] * 1000); 181 | cartesian.push(data[1] * 1000); 182 | cartesian.push(data[2] * 1000); 183 | } 184 | 185 | obj = { 186 | cartesian: cartesian, 187 | kepler: orbit 188 | } 189 | 190 | return obj; 191 | } 192 | } 193 | 194 | function formatDate(seconds) { 195 | return new Date(seconds * 1000).toISOString(); 196 | } 197 | 198 | function lzero(str, len) { 199 | str += ''; // cast to string 200 | while (str.length < len) str = "0" + str; 201 | return str; 202 | } -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "czml", 3 | "version": "0.0.1", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@types/concat-stream": { 8 | "version": "1.6.0", 9 | "resolved": "http://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.0.tgz", 10 | "integrity": "sha1-OU2+C7X+5Gs42JZzXoto7yOQ0A0=", 11 | "requires": { 12 | "@types/node": "*" 13 | } 14 | }, 15 | "@types/form-data": { 16 | "version": "0.0.33", 17 | "resolved": "http://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", 18 | "integrity": "sha1-yayFsqX9GENbjIXZ7LUObWyJP/g=", 19 | "requires": { 20 | "@types/node": "*" 21 | } 22 | }, 23 | "@types/node": { 24 | "version": "9.6.40", 25 | "resolved": "https://registry.npmjs.org/@types/node/-/node-9.6.40.tgz", 26 | "integrity": "sha512-M3HHoXXndsho/sTbQML2BJr7/uwNhMg8P0D4lb+UsM65JQZx268faiz9hKpY4FpocWqpwlLwa8vevw8hLtKjOw==" 27 | }, 28 | "@types/qs": { 29 | "version": "6.5.1", 30 | "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.5.1.tgz", 31 | "integrity": "sha512-mNhVdZHdtKHMMxbqzNK3RzkBcN1cux3AvuCYGTvjEIQT2uheH3eCAyYsbMbh2Bq8nXkeOWs1kyDiF7geWRFQ4Q==" 32 | }, 33 | "array-equal": { 34 | "version": "1.0.0", 35 | "resolved": "http://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", 36 | "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=" 37 | }, 38 | "asap": { 39 | "version": "2.0.6", 40 | "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", 41 | "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" 42 | }, 43 | "asynckit": { 44 | "version": "0.4.0", 45 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 46 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" 47 | }, 48 | "balanced-match": { 49 | "version": "1.0.0", 50 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 51 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" 52 | }, 53 | "binary": { 54 | "version": "0.3.0", 55 | "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", 56 | "integrity": "sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk=", 57 | "requires": { 58 | "buffers": "~0.1.1", 59 | "chainsaw": "~0.1.0" 60 | } 61 | }, 62 | "bloodline": { 63 | "version": "1.0.1", 64 | "resolved": "https://registry.npmjs.org/bloodline/-/bloodline-1.0.1.tgz", 65 | "integrity": "sha1-E/kwNaTtPG0pUwgkkkWg7XZ7NeI=" 66 | }, 67 | "brace-expansion": { 68 | "version": "1.1.11", 69 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 70 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 71 | "requires": { 72 | "balanced-match": "^1.0.0", 73 | "concat-map": "0.0.1" 74 | } 75 | }, 76 | "buffer-from": { 77 | "version": "1.1.1", 78 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", 79 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" 80 | }, 81 | "buffers": { 82 | "version": "0.1.1", 83 | "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", 84 | "integrity": "sha1-skV5w77U1tOWru5tmorn9Ugqt7s=" 85 | }, 86 | "caseless": { 87 | "version": "0.12.0", 88 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", 89 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" 90 | }, 91 | "chainsaw": { 92 | "version": "0.1.0", 93 | "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", 94 | "integrity": "sha1-XqtQsor+WAdNDVgpE4iCi15fvJg=", 95 | "requires": { 96 | "traverse": ">=0.3.0 <0.4" 97 | } 98 | }, 99 | "combined-stream": { 100 | "version": "1.0.7", 101 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", 102 | "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", 103 | "requires": { 104 | "delayed-stream": "~1.0.0" 105 | } 106 | }, 107 | "concat-map": { 108 | "version": "0.0.1", 109 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 110 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" 111 | }, 112 | "concat-stream": { 113 | "version": "1.6.2", 114 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", 115 | "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", 116 | "requires": { 117 | "buffer-from": "^1.0.0", 118 | "inherits": "^2.0.3", 119 | "readable-stream": "^2.2.2", 120 | "typedarray": "^0.0.6" 121 | } 122 | }, 123 | "core-util-is": { 124 | "version": "1.0.2", 125 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 126 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 127 | }, 128 | "delayed-stream": { 129 | "version": "1.0.0", 130 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 131 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" 132 | }, 133 | "es6-object-assign": { 134 | "version": "1.1.0", 135 | "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz", 136 | "integrity": "sha1-wsNYJlYkfDnqEHyx5mUrb58kUjw=" 137 | }, 138 | "es6-shim": { 139 | "version": "0.24.0", 140 | "resolved": "http://registry.npmjs.org/es6-shim/-/es6-shim-0.24.0.tgz", 141 | "integrity": "sha1-cTifpDM838eQ4S+7blYdYQi+HgU=" 142 | }, 143 | "form-data": { 144 | "version": "2.3.3", 145 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", 146 | "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", 147 | "requires": { 148 | "asynckit": "^0.4.0", 149 | "combined-stream": "^1.0.6", 150 | "mime-types": "^2.1.12" 151 | } 152 | }, 153 | "fs.realpath": { 154 | "version": "1.0.0", 155 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 156 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" 157 | }, 158 | "fstream": { 159 | "version": "0.1.31", 160 | "resolved": "https://registry.npmjs.org/fstream/-/fstream-0.1.31.tgz", 161 | "integrity": "sha1-czfwWPu7vvqMn1YaKMqwhJICyYg=", 162 | "requires": { 163 | "graceful-fs": "~3.0.2", 164 | "inherits": "~2.0.0", 165 | "mkdirp": "0.5", 166 | "rimraf": "2" 167 | } 168 | }, 169 | "get-port": { 170 | "version": "3.2.0", 171 | "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", 172 | "integrity": "sha1-3Xzn3hh8Bsi/NTeWrHHgmfCYDrw=" 173 | }, 174 | "glob": { 175 | "version": "7.1.3", 176 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", 177 | "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", 178 | "requires": { 179 | "fs.realpath": "^1.0.0", 180 | "inflight": "^1.0.4", 181 | "inherits": "2", 182 | "minimatch": "^3.0.4", 183 | "once": "^1.3.0", 184 | "path-is-absolute": "^1.0.0" 185 | } 186 | }, 187 | "graceful-fs": { 188 | "version": "3.0.11", 189 | "resolved": "http://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.11.tgz", 190 | "integrity": "sha1-dhPHeKGv6mLyXGMKCG1/Osu92Bg=", 191 | "requires": { 192 | "natives": "^1.1.0" 193 | } 194 | }, 195 | "http-basic": { 196 | "version": "7.0.0", 197 | "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-7.0.0.tgz", 198 | "integrity": "sha1-gvClBr6UJzLsje6+6A50bvVzbbo=", 199 | "requires": { 200 | "@types/concat-stream": "^1.6.0", 201 | "@types/node": "^9.4.1", 202 | "caseless": "~0.12.0", 203 | "concat-stream": "^1.4.6", 204 | "http-response-object": "^3.0.1", 205 | "parse-cache-control": "^1.0.1" 206 | } 207 | }, 208 | "http-response-object": { 209 | "version": "3.0.1", 210 | "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.1.tgz", 211 | "integrity": "sha512-6L0Fkd6TozA8kFSfh9Widst0wfza3U1Ex2RjJ6zNDK0vR1U1auUR6jY4Nn2Xl7CCy0ikFmxW1XcspVpb9RvwTg==", 212 | "requires": { 213 | "@types/node": "^9.3.0" 214 | } 215 | }, 216 | "inflight": { 217 | "version": "1.0.6", 218 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 219 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 220 | "requires": { 221 | "once": "^1.3.0", 222 | "wrappy": "1" 223 | } 224 | }, 225 | "inherits": { 226 | "version": "2.0.3", 227 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 228 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 229 | }, 230 | "intersect": { 231 | "version": "1.0.1", 232 | "resolved": "https://registry.npmjs.org/intersect/-/intersect-1.0.1.tgz", 233 | "integrity": "sha1-MyZQ4QhU2MCsWMGSvcJ6i/fnoww=" 234 | }, 235 | "isarray": { 236 | "version": "1.0.0", 237 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 238 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 239 | }, 240 | "kepler.js": { 241 | "version": "github:jordanstephens/kepler.js#bf43c94b82f3e71c154e0bfd841d411def7919b7", 242 | "from": "github:jordanstephens/kepler.js", 243 | "requires": { 244 | "array-equal": "^1.0.0", 245 | "es6-object-assign": "^1.0.1", 246 | "es6-shim": "~0.24.0", 247 | "intersect": "^1.0.1", 248 | "sylvester": "0.0.21" 249 | } 250 | }, 251 | "match-stream": { 252 | "version": "0.0.2", 253 | "resolved": "https://registry.npmjs.org/match-stream/-/match-stream-0.0.2.tgz", 254 | "integrity": "sha1-mesFAJOzTf+t5CG5rAtBCpz6F88=", 255 | "requires": { 256 | "buffers": "~0.1.1", 257 | "readable-stream": "~1.0.0" 258 | }, 259 | "dependencies": { 260 | "isarray": { 261 | "version": "0.0.1", 262 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", 263 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" 264 | }, 265 | "readable-stream": { 266 | "version": "1.0.34", 267 | "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", 268 | "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", 269 | "requires": { 270 | "core-util-is": "~1.0.0", 271 | "inherits": "~2.0.1", 272 | "isarray": "0.0.1", 273 | "string_decoder": "~0.10.x" 274 | } 275 | }, 276 | "string_decoder": { 277 | "version": "0.10.31", 278 | "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", 279 | "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" 280 | } 281 | } 282 | }, 283 | "mime-db": { 284 | "version": "1.37.0", 285 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", 286 | "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==" 287 | }, 288 | "mime-types": { 289 | "version": "2.1.21", 290 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz", 291 | "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==", 292 | "requires": { 293 | "mime-db": "~1.37.0" 294 | } 295 | }, 296 | "minimatch": { 297 | "version": "3.0.4", 298 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 299 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 300 | "requires": { 301 | "brace-expansion": "^1.1.7" 302 | } 303 | }, 304 | "minimist": { 305 | "version": "0.0.8", 306 | "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 307 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" 308 | }, 309 | "mkdirp": { 310 | "version": "0.5.1", 311 | "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 312 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 313 | "requires": { 314 | "minimist": "0.0.8" 315 | } 316 | }, 317 | "natives": { 318 | "version": "1.1.6", 319 | "resolved": "https://registry.npmjs.org/natives/-/natives-1.1.6.tgz", 320 | "integrity": "sha512-6+TDFewD4yxY14ptjKaS63GVdtKiES1pTPyxn9Jb0rBqPMZ7VcCiooEhPNsr+mqHtMGxa/5c/HhcC4uPEUw/nA==" 321 | }, 322 | "once": { 323 | "version": "1.4.0", 324 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 325 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 326 | "requires": { 327 | "wrappy": "1" 328 | } 329 | }, 330 | "over": { 331 | "version": "0.0.5", 332 | "resolved": "https://registry.npmjs.org/over/-/over-0.0.5.tgz", 333 | "integrity": "sha1-8phS5w/X4l82DgE6jsRMgq7bVwg=" 334 | }, 335 | "parse-cache-control": { 336 | "version": "1.0.1", 337 | "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", 338 | "integrity": "sha1-juqz5U+laSD+Fro493+iGqzC104=" 339 | }, 340 | "path-is-absolute": { 341 | "version": "1.0.1", 342 | "resolved": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 343 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" 344 | }, 345 | "process-nextick-args": { 346 | "version": "2.0.0", 347 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", 348 | "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" 349 | }, 350 | "promise": { 351 | "version": "8.0.2", 352 | "resolved": "https://registry.npmjs.org/promise/-/promise-8.0.2.tgz", 353 | "integrity": "sha512-EIyzM39FpVOMbqgzEHhxdrEhtOSDOtjMZQ0M6iVfCE+kWNgCkAyOdnuCWqfmflylftfadU6FkiMgHZA2kUzwRw==", 354 | "requires": { 355 | "asap": "~2.0.6" 356 | } 357 | }, 358 | "pullstream": { 359 | "version": "0.4.1", 360 | "resolved": "https://registry.npmjs.org/pullstream/-/pullstream-0.4.1.tgz", 361 | "integrity": "sha1-1vs79a7Wl+gxFQ6xACwlo/iuExQ=", 362 | "requires": { 363 | "over": ">= 0.0.5 < 1", 364 | "readable-stream": "~1.0.31", 365 | "setimmediate": ">= 1.0.2 < 2", 366 | "slice-stream": ">= 1.0.0 < 2" 367 | }, 368 | "dependencies": { 369 | "isarray": { 370 | "version": "0.0.1", 371 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", 372 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" 373 | }, 374 | "readable-stream": { 375 | "version": "1.0.34", 376 | "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", 377 | "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", 378 | "requires": { 379 | "core-util-is": "~1.0.0", 380 | "inherits": "~2.0.1", 381 | "isarray": "0.0.1", 382 | "string_decoder": "~0.10.x" 383 | } 384 | }, 385 | "string_decoder": { 386 | "version": "0.10.31", 387 | "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", 388 | "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" 389 | } 390 | } 391 | }, 392 | "qs": { 393 | "version": "6.6.0", 394 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.6.0.tgz", 395 | "integrity": "sha512-KIJqT9jQJDQx5h5uAVPimw6yVg2SekOKu959OCtktD3FjzbpvaPr8i4zzg07DOMz+igA4W/aNM7OV8H37pFYfA==" 396 | }, 397 | "readable-stream": { 398 | "version": "2.3.6", 399 | "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", 400 | "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", 401 | "requires": { 402 | "core-util-is": "~1.0.0", 403 | "inherits": "~2.0.3", 404 | "isarray": "~1.0.0", 405 | "process-nextick-args": "~2.0.0", 406 | "safe-buffer": "~5.1.1", 407 | "string_decoder": "~1.1.1", 408 | "util-deprecate": "~1.0.1" 409 | } 410 | }, 411 | "rimraf": { 412 | "version": "2.6.2", 413 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", 414 | "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", 415 | "requires": { 416 | "glob": "^7.0.5" 417 | } 418 | }, 419 | "safe-buffer": { 420 | "version": "5.1.2", 421 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 422 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 423 | }, 424 | "setimmediate": { 425 | "version": "1.0.5", 426 | "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", 427 | "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" 428 | }, 429 | "slice-stream": { 430 | "version": "1.0.0", 431 | "resolved": "https://registry.npmjs.org/slice-stream/-/slice-stream-1.0.0.tgz", 432 | "integrity": "sha1-WzO9ZvATsaf4ZGCwPUY97DmtPqA=", 433 | "requires": { 434 | "readable-stream": "~1.0.31" 435 | }, 436 | "dependencies": { 437 | "isarray": { 438 | "version": "0.0.1", 439 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", 440 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" 441 | }, 442 | "readable-stream": { 443 | "version": "1.0.34", 444 | "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", 445 | "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", 446 | "requires": { 447 | "core-util-is": "~1.0.0", 448 | "inherits": "~2.0.1", 449 | "isarray": "0.0.1", 450 | "string_decoder": "~0.10.x" 451 | } 452 | }, 453 | "string_decoder": { 454 | "version": "0.10.31", 455 | "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", 456 | "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" 457 | } 458 | } 459 | }, 460 | "string_decoder": { 461 | "version": "1.1.1", 462 | "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 463 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 464 | "requires": { 465 | "safe-buffer": "~5.1.0" 466 | } 467 | }, 468 | "sylvester": { 469 | "version": "0.0.21", 470 | "resolved": "https://registry.npmjs.org/sylvester/-/sylvester-0.0.21.tgz", 471 | "integrity": "sha1-KYexzivS84sNzio0OIiEv6RADqc=" 472 | }, 473 | "sync-request": { 474 | "version": "6.0.0", 475 | "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.0.0.tgz", 476 | "integrity": "sha512-jGNIAlCi9iU4X3Dm4oQnNQshDD3h0/1A7r79LyqjbjUnj69sX6mShAXlhRXgImsfVKtTcnra1jfzabdZvp+Lmw==", 477 | "requires": { 478 | "http-response-object": "^3.0.1", 479 | "sync-rpc": "^1.2.1", 480 | "then-request": "^6.0.0" 481 | } 482 | }, 483 | "sync-rpc": { 484 | "version": "1.3.4", 485 | "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.4.tgz", 486 | "integrity": "sha512-Iug+t1ICVFenUcTnDu8WXFnT+k8IVoLKGh8VA3eXUtl2Rt9SjKX3YEv33OenABqpTPL9QEaHv1+CNn2LK8vMow==", 487 | "requires": { 488 | "get-port": "^3.1.0" 489 | } 490 | }, 491 | "then-request": { 492 | "version": "6.0.0", 493 | "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.0.tgz", 494 | "integrity": "sha512-xA+7uEMc+jsQIoyySJ93Ad08Kuqnik7u6jLS5hR91Z3smAoCfL3M8/MqMlobAa9gzBfO9pA88A/AntfepkkMJQ==", 495 | "requires": { 496 | "@types/concat-stream": "^1.6.0", 497 | "@types/form-data": "0.0.33", 498 | "@types/node": "^8.0.0", 499 | "@types/qs": "^6.2.31", 500 | "caseless": "~0.12.0", 501 | "concat-stream": "^1.6.0", 502 | "form-data": "^2.2.0", 503 | "http-basic": "^7.0.0", 504 | "http-response-object": "^3.0.1", 505 | "promise": "^8.0.0", 506 | "qs": "^6.4.0" 507 | }, 508 | "dependencies": { 509 | "@types/node": { 510 | "version": "8.10.38", 511 | "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.38.tgz", 512 | "integrity": "sha512-EibsnbJerd0hBFaDjJStFrVbVBAtOy4dgL8zZFw0uOvPqzBAX59Ci8cgjg3+RgJIWhsB5A4c+pi+D4P9tQQh/A==" 513 | } 514 | } 515 | }, 516 | "tle": { 517 | "version": "1.2.3", 518 | "resolved": "https://registry.npmjs.org/tle/-/tle-1.2.3.tgz", 519 | "integrity": "sha512-f3lWVhYU/TW6bFV7FFIfdJqjS5MdrIJ7paNC0bkUeeiba9in3038ZuVtuO6tdaetGxwDxRp2KNLP+zQihs5f3A==", 520 | "requires": { 521 | "bloodline": "~1.0.0" 522 | } 523 | }, 524 | "traverse": { 525 | "version": "0.3.9", 526 | "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", 527 | "integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=" 528 | }, 529 | "typedarray": { 530 | "version": "0.0.6", 531 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", 532 | "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" 533 | }, 534 | "unzip": { 535 | "version": "0.1.11", 536 | "resolved": "https://registry.npmjs.org/unzip/-/unzip-0.1.11.tgz", 537 | "integrity": "sha1-iXScY7BY19kNYZ+GuYqhU107l/A=", 538 | "requires": { 539 | "binary": ">= 0.3.0 < 1", 540 | "fstream": ">= 0.1.30 < 1", 541 | "match-stream": ">= 0.0.2 < 1", 542 | "pullstream": ">= 0.4.1 < 1", 543 | "readable-stream": "~1.0.31", 544 | "setimmediate": ">= 1.0.1 < 2" 545 | }, 546 | "dependencies": { 547 | "isarray": { 548 | "version": "0.0.1", 549 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", 550 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" 551 | }, 552 | "readable-stream": { 553 | "version": "1.0.34", 554 | "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", 555 | "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", 556 | "requires": { 557 | "core-util-is": "~1.0.0", 558 | "inherits": "~2.0.1", 559 | "isarray": "0.0.1", 560 | "string_decoder": "~0.10.x" 561 | } 562 | }, 563 | "string_decoder": { 564 | "version": "0.10.31", 565 | "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", 566 | "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" 567 | } 568 | } 569 | }, 570 | "util-deprecate": { 571 | "version": "1.0.2", 572 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 573 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 574 | }, 575 | "wrappy": { 576 | "version": "1.0.2", 577 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 578 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 579 | } 580 | } 581 | } 582 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "czml-writer", 3 | "version": "1.0.3", 4 | "description": "A package for creating CZML orbits", 5 | "author": "Matthew Sabatini ", 6 | "main": "lib/czml.js", 7 | "repository": { 8 | "type": "git", 9 | "url": "https://github.com/themsabs/czml-writer" 10 | }, 11 | "dependencies": { 12 | "kepler.js": "github:jordanstephens/kepler.js", 13 | "sync-request": "^6.0.0", 14 | "tle": "^1.2.3", 15 | "unzip": "^0.1.11" 16 | }, 17 | "license": "Apache-2.0" 18 | } 19 | -------------------------------------------------------------------------------- /test/test.js: -------------------------------------------------------------------------------- 1 | var czml = require("../lib/czml"); 2 | 3 | const fs = require('fs'); 4 | var request = require('sync-request'); 5 | var request2 = require('request'); 6 | var unzip = require('unzip'); 7 | 8 | var cesiumDemo = 0; 9 | process.argv.forEach(function (val, index, array) { 10 | if(val == "--cesiumDemo") 11 | cesiumDemo = 1; 12 | }); 13 | 14 | var orbits = []; 15 | 16 | var orbit1 = new czml.orbit.fromParams({ 17 | apogee: 426.9, // km 18 | perigee: 416.2, // km 19 | inclination: 51.65, // deg 20 | rightAscension: 304.1, // deg 21 | argumentOfPeriapsis: 117.8 // deg 22 | }); 23 | orbits.push(orbit1); 24 | 25 | var tle = 'ISS (ZARYA)\n' + 26 | '1 25544U 98067A 08264.51782528 -.00002182 00000-0 -11606-4 0 2927\n' + 27 | '2 25544 51.6416 247.4627 0006703 130.5360 325.0288 15.72125391563537'; 28 | var orbit2 = new czml.orbit.fromTle(tle); 29 | orbit2.setEpoch(czml.constants.now); //override TLE epoch 30 | orbits.push(orbit2); 31 | 32 | var tle = 'NOAA 14\n' + 33 | '1 23455U 94089A 97320.90946019 .00000140 00000-0 10191-3 0 2621\n' + 34 | '2 23455 99.0090 272.6745 0008546 223.1686 136.8816 14.11711747148495'; 35 | var orbit3 = new czml.orbit.fromTle(tle); 36 | orbit3.setEpoch(czml.constants.now); //override TLE epoch 37 | orbits.push(orbit3); 38 | 39 | console.log(orbit3.getSettings()); 40 | console.log(orbit3.orbit); 41 | 42 | //for loop save to samples 43 | for (var i = 0; i < orbits.length; i++) { 44 | fs.writeFile(__dirname + "/samples/sample"+i+".czml", JSON.stringify(orbits[i].czml()), function(err) { 45 | if (err) { 46 | return console.log(err); 47 | process.exit(); 48 | } 49 | console.log("The czml was saved to samples!"); 50 | }); 51 | } 52 | 53 | //check for latest Cesium version 54 | var tag = 0; 55 | var url = 0; 56 | 57 | var res = request('GET', 'https://api.github.com/repos/AnalyticalGraphicsInc/cesium/releases/latest', { 58 | headers: { 59 | 'User-Agent': 'request' 60 | }, 61 | }); 62 | 63 | var body = JSON.parse(res.getBody('utf8')); 64 | tag = body.tag_name; 65 | url = body.assets[0].browser_download_url; 66 | 67 | 68 | //check if Cesium is downloaded and has a folder 69 | if (tag && url && cesiumDemo) { 70 | 71 | if (!fs.existsSync(__dirname + "/Cesium-" + tag)) { 72 | //download Cesium 73 | request2(url) 74 | .pipe(fs.createWriteStream(__dirname + "/Cesium-" + tag + ".zip")) 75 | .on('close', function(x) { 76 | console.log('File written!'); 77 | console.log("Please unzip \n" + __dirname + "/Cesium-" + tag + ".zip \nto\n" + __dirname + "/Cesium-" + tag + "\nand then re-run this test to see the full Cesium demo."); 78 | console.log("Run the following commands inside of the Cesium directory:\nnpm install\nnode server.js\nopen localhost:8080/Apps/Sandcastle/index.html?src=CZML.html") 79 | }); 80 | 81 | } else { 82 | //Cesium is installed 83 | console.log("Add the following lines after: Sandcastle.addDefaultToolbarButton('Satellites', function() {\n\n") 84 | for (var i = 0; i < orbits.length; i++) 85 | console.log("viewer.dataSources.add(Cesium.CzmlDataSource.load('../../SampleData/sample"+i+".czml'));"); 86 | for (var i = 0; i < orbits.length; i++) { 87 | fs.writeFile(__dirname + "/Cesium-" + tag + "/Apps/SampleData/sample"+i+".czml", JSON.stringify(orbits[i].czml()), function(err) { 88 | if (err) { 89 | return console.log(err); 90 | } 91 | console.log("Saved to Cesium SampleData"); 92 | 93 | }); 94 | } 95 | } 96 | } --------------------------------------------------------------------------------