From 5032f03fc11cd231decd2d7cfd5dd3576a7e45ea Mon Sep 17 00:00:00 2001 From: Jogi Hofmüller Date: Tue, 23 Aug 2011 16:59:29 +0000 Subject: - created tracker.wsgi as wsgi app - imported updated javascript libraries git-svn-id: https://svn.spreadspace.org/mur.sat@147 7de4ea59-55d0-425e-a1af-a3118ea81d4c --- tools/mmd/orbtrak.js | 298 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 298 insertions(+) create mode 100644 tools/mmd/orbtrak.js (limited to 'tools/mmd/orbtrak.js') diff --git a/tools/mmd/orbtrak.js b/tools/mmd/orbtrak.js new file mode 100644 index 0000000..c2582bd --- /dev/null +++ b/tools/mmd/orbtrak.js @@ -0,0 +1,298 @@ +/**************************************************************************** +* OrbTrak: A satellite orbit visualization library * +* Copyright Andrew T. West, 2008 * +* Last update: 07-Jun-2008 * +***************************************************************************** +* * +* This program is free software; you can redistribute it and/or modify it * +* under the terms of the GNU General Public License as published by the * +* Free Software Foundation; either version 2 of the License or any later * +* version. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * +* General Public License for more details. * +* * +*****************************************************************************/ + +// orbtrak.js and predictlib.js both work for one satellite now +// Jogi, 2011-08-22 + +var Orb = + { + satelliteMarkers: new Array(), + satellitePoint: new Object (), + satLayer: new OpenLayers.Layer.Vector ("satLayer"), + homeLayer: new OpenLayers.Layer.Vector ("homeLayer"), + trackLayer: new OpenLayers.Layer.Vector ("trackLayer"), + track: new Array (), + from: new OpenLayers.Projection ("EPSG:4326"), + to: new OpenLayers.Projection ("EPSG:900913"), + + startOSMTracking: function (minutes, longitude, latitude, altitude, name) + { + PLib.InitializeData(); + PLib.configureGroundStation(latitude, longitude, altitude, name); + document.getElementById ("gsName").innerHTML = name; + document.getElementById ("gsLongitude").innerHTML = longitude; + document.getElementById ("gsLatitude").innerHTML = latitude; + document.getElementById ("gsAltitude").innerHTML = altitude; + Orb.createOSMSatellite (); + + var map = new OpenLayers.Map ("osm"); + map.addLayers ([new OpenLayers.Layer.OSM (), Orb.trackLayer, Orb.satLayer, Orb.homeLayer]); + map.zoomTo (1); + + var satStyle = {fillColor: "#FFED00", pointRadius: 3, stroke: false}; + var homeStyle = {fillColor: "#00ff00", pointRadius: 3, stroke: false}; + var home = new OpenLayers.LonLat (longitude, latitude).transform (Orb.from, Orb.to); + + Orb.createSatelliteTrack (minutes); + Orb.homeLayer.addFeatures ([ + new OpenLayers.Feature.Vector ( + new OpenLayers.Geometry.Point (home.lon, home.lat), + null, homeStyle)]); + // map.zoomToMaxExtent (); + Orb.satLayer.addFeatures ([ + new OpenLayers.Feature.Vector (Orb.satellitePoint, + null, satStyle)]); + setTimeout ("Orb.updateOSMSatellite ()", document.getElementById ("refresh").value); + }, + + createSatelliteTrack: function (minutes) + { + if (document.getElementById ("previewMinutes") != null) + minutes = document.getElementById ("previewMinutes").value; + Orb.trackLayer.destroyFeatures (); + var curve = new Array (); + var points = new Array (); + var track = PLib.calculateTrack (minutes); + var lineStyle = {strokeColor: '#003366', strokeOpacity: 1, strokeWidth: 1}; + var last = "east"; + + for (var i = 0; i < track.length; i++) + { + var lonlat = new OpenLayers.LonLat (track[i][0], track[i][1]).transform (Orb.from, Orb.to); + var lon = "" + track[i][0]; + if (lon.substring (0, 1) == "-") + { + if (last == "east") + { + curve.push (new OpenLayers.Feature.Vector (new OpenLayers.Geometry.LineString (points), null, lineStyle)) + points = new Array (); + } + last = "west"; + } + else + last = "east"; + points.push (new OpenLayers.Geometry.Point (lonlat.lon, lonlat.lat)); + } + curve.push (new OpenLayers.Feature.Vector (new OpenLayers.Geometry.LineString (points), null, lineStyle)) + Orb.trackLayer.addFeatures (curve); + }, + + updateOSMSatellite: function () + { + var satInfo; + var satellites = Orb.satLayer.features; + + satInfo = PLib.QuickFind (PLib.sat.name); + var pos = new OpenLayers.LonLat (satInfo.longitude, satInfo.latitude).transform (Orb.from, Orb.to); + satellites[0].move (pos); + Orb.printSatellite (satInfo); + setTimeout ("Orb.updateOSMSatellite ()", document.getElementById ("refresh").value); + }, + + createOSMSatellite: function () + { + var satInfo; + satInfo = PLib.QuickFind (PLib.sat.name); + var pos = new OpenLayers.LonLat (satInfo.longitude, satInfo.latitude).transform (Orb.from, Orb.to); + Orb.satellitePoint = new OpenLayers.Geometry.Point (pos.lon, pos.lat); + }, + + startTracking: function(map, homeLat, homeLng) + { + Orb.map = map; + Orb.crossBrowserSetStyle(map, "background-image: url(orbimages/world.jpg); overflow: hidden;", true); + + var frag = document.createDocumentFragment(); + var div = document.createElement("div"); + div.id = "home"; + Orb.crossBrowserSetStyle(div, "position:relative; width: 24px; height: 24px; background-image: url(orbimages/home.gif);", false); + frag.appendChild(div); + Orb.map.appendChild(frag); + Orb.home = document.getElementById("home"); + + PLib.InitializeData(); + Orb.setHomeCoordinates(homeLat, homeLng); + Orb.createSatelliteMarkers(); + Orb.updateSatellites(); + }, + + setHomeCoordinates: function(homeLat, homeLng) + { + PLib.configureGroundStation(homeLat, homeLng); + + Orb.home.style.top = ((-homeLat + 90) * 1.5 - 12.0) + "px"; + Orb.home.style.left = ((parseInt(homeLng) + 180) * 1.5 - 12.0) + "px"; + }, + + crossBrowserSetStyle: function(element, css, append) + { + var obj, attributeName; + var useStyleObject = element.style.setAttribute; + + obj = useStyleObject ? element.style : element; + attributeName = useStyleObject ? "cssText" : "style"; + + if (append) + css += obj.getAttribute(attributeName); + + obj.setAttribute(attributeName, css); + }, + + createOneMarker: function(txt) + { + var frag = document.createDocumentFragment(); + var markerCount = Orb.satelliteMarkers.length; + + var div = document.createElement("div"); + div.id = "satelliteMarker" + markerCount; + Orb.crossBrowserSetStyle(div, "position:absolute; width: 24px; height: 24px; background-image: url(orbimages/saticon.gif);", false); + var innerDiv = document.createElement("div"); + Orb.crossBrowserSetStyle(innerDiv, "position:absolute; left: 7px; top: 5px;"); + var txt = document.createTextNode(txt); + + innerDiv.appendChild(txt); + div.appendChild(innerDiv); + frag.appendChild(div); + Orb.map.appendChild(frag); + + Orb.satelliteMarkers[markerCount] = document.getElementById(div.id) + }, + + createSatelliteMarkers: function() + { + for (var i = 1; i <= PLib.sat.length; i++) + Orb.createOneMarker(i); + }, + + updateSatellites: function() + { + var satInfo; + + for (var i = 0; i < PLib.sat.length; i++) + { + satInfo = PLib.QuickFind(PLib.sat[i].name); + + Orb.satelliteMarkers[i].style.top = ((-satInfo.latitude + 90) * 1.5 - 12.0) + "px"; + Orb.satelliteMarkers[i].style.left = ((satInfo.longitude + 180) * 1.5 - 12.0) + "px"; + Orb.printSatellite (satInfo); + } + + setTimeout("Orb.updateSatellites()", 1000); + }, + + // added by Jogi + // 2011-08-21 + printSatellite: function (satInfo) + { + document.getElementById ("longitude").innerHTML = satInfo.longitude; + document.getElementById ("latitude").innerHTML = satInfo.latitude; + document.getElementById ("elevation").innerHTML = satInfo.elevation; + document.getElementById ("azimuth").innerHTML = satInfo.azimuth; + document.getElementById ("altitude").innerHTML = satInfo.altitude; + }, + + createCell: function(tr, className, txt) + { + var td = document.createElement("td"); + td.className = className; + txt = document.createTextNode(txt); + td.appendChild(txt); + tr.appendChild(td); + }, + + createHeaderColumn: function(tr, txt) + { + var th = document.createElement("th"); + th.className = "orb-header"; + txt = document.createTextNode(txt); + th.appendChild(txt); + tr.appendChild(th); + }, + + generateTable: function(divTable) + { + var tr, visibilityText, detailClassName; + var frag = document.createDocumentFragment(); + var satInfoColl = PLib.getTodaysPasses(); + + while (divTable.childNodes.length > 0) + { + divTable.removeChild(divTable.firstChild); + } + + var tbl = document.createElement("table"); + Orb.crossBrowserSetStyle(tbl, "border-collapse: collapse; margin-left: auto; margin-right: auto;", false); + + var thead = document.createElement("thead"); + tr = document.createElement("tr"); + + Orb.createHeaderColumn(tr, '# on Map'); + Orb.createHeaderColumn(tr, 'Name'); + Orb.createHeaderColumn(tr, 'Pass #'); + Orb.createHeaderColumn(tr, 'Date'); + Orb.createHeaderColumn(tr, 'Local Time'); + Orb.createHeaderColumn(tr, 'Peak Elev.'); + Orb.createHeaderColumn(tr, 'Azimuth'); + Orb.createHeaderColumn(tr, 'Range (km)'); + Orb.createHeaderColumn(tr, 'Visibility'); + + thead.appendChild(tr); + tbl.appendChild(thead); + + var tbody = document.createElement("tbody"); + + for (var i = 0; i < satInfoColl.length; i++) + { + tr = document.createElement("tr"); + + detailClassName = satInfoColl[i].visibility == "+" ? "orb-detailVisible" : "orb-detail"; + + Orb.createCell(tr, detailClassName, satInfoColl[i].number); + Orb.createCell(tr, detailClassName, satInfoColl[i].name); + Orb.createCell(tr, detailClassName, satInfoColl[i].passNo); + Orb.createCell(tr, detailClassName, PLib.formatDateOnly(satInfoColl[i].dateTimeStart)); + Orb.createCell(tr, detailClassName, PLib.formatTimeOnly(satInfoColl[i].dateTimeStart) + " - " + PLib.formatTimeOnly(satInfoColl[i].dateTimeEnd)); + Orb.createCell(tr, detailClassName, satInfoColl[i].peakElevation + "\u00B0"); + Orb.createCell(tr, detailClassName, satInfoColl[i].riseAzimuth + ", " + satInfoColl[i].peakAzimuth + ", " + satInfoColl[i].decayAzimuth); + Orb.createCell(tr, detailClassName, satInfoColl[i].riseRange + ", " + satInfoColl[i].peakRange + ", " + satInfoColl[i].decayRange); + + switch(satInfoColl[i].visibility) + { + case "+": + visibilityText = 'Visible'; + break; + case "*": + visibilityText = 'Not Visible'; + break; + default: + visibilityText = 'Eclipsed'; + } + + Orb.createCell(tr, detailClassName, visibilityText); + + tbody.appendChild(tr); + } + + tbl.appendChild(tbody); + frag.appendChild(tbl); + divTable.appendChild(frag); + } + } + +// vim: ts=2 tw=0 expandtab +// EOF -- cgit v1.2.3