Progress
parent
827cd3d3dc
commit
062f7d3099
|
@ -74,11 +74,16 @@ def getActive():
|
||||||
|
|
||||||
def GetGroundStations():
|
def GetGroundStations():
|
||||||
stations = get_paginated_endpoint("https://network.satnogs.org/api/stations/?status=2")
|
stations = get_paginated_endpoint("https://network.satnogs.org/api/stations/?status=2")
|
||||||
|
stations += get_paginated_endpoint("https://network.satnogs.org/api/stations/?status=1")
|
||||||
|
|
||||||
for x in stations:
|
for x in stations:
|
||||||
|
|
||||||
if x["last_seen"] == None:
|
if x["last_seen"] == None:
|
||||||
stations.remove(x)
|
stations.remove(x)
|
||||||
continue
|
continue
|
||||||
|
if x["status"] == "Offline":
|
||||||
|
stations.remove(x)
|
||||||
|
continue
|
||||||
|
|
||||||
if datetime.strptime(x["last_seen"],'%Y-%m-%dT%H:%M:%Sz') < (datetime.utcnow()- timedelta(10,0,0,0)):
|
if datetime.strptime(x["last_seen"],'%Y-%m-%dT%H:%M:%Sz') < (datetime.utcnow()- timedelta(10,0,0,0)):
|
||||||
stations.remove(x)
|
stations.remove(x)
|
||||||
|
@ -87,6 +92,10 @@ def GetGroundStations():
|
||||||
stations.remove(x)
|
stations.remove(x)
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
if x["status"] == "Offline":
|
||||||
|
stations.remove(x)
|
||||||
|
continue
|
||||||
|
|
||||||
if datetime.strptime(x["last_seen"],'%Y-%m-%dT%H:%M:%Sz') < (datetime.utcnow()- timedelta(10,0,0,0)):
|
if datetime.strptime(x["last_seen"],'%Y-%m-%dT%H:%M:%Sz') < (datetime.utcnow()- timedelta(10,0,0,0)):
|
||||||
stations.remove(x)
|
stations.remove(x)
|
||||||
|
|
||||||
|
@ -153,7 +162,7 @@ def index():
|
||||||
def api_active_stations():
|
def api_active_stations():
|
||||||
sations = []
|
sations = []
|
||||||
for x in Stations:
|
for x in Stations:
|
||||||
sations.append({'id':x['id'],'name':x['name'],'lat_lng':[x["lat"],x['lng']]})
|
sations.append({'id':x['id'],'name':x['name'],'lat_lng':[x["lat"],x['lng'],x["altitude"]],'type':x["status"],'description':x["description"],'total_obs':x["observations"],'qthlocator':x["qthlocator"]})
|
||||||
return json.dumps(sations)
|
return json.dumps(sations)
|
||||||
|
|
||||||
@app.route('/stations_from_sat/<string:norad>')
|
@app.route('/stations_from_sat/<string:norad>')
|
||||||
|
|
|
@ -1,37 +1,44 @@
|
||||||
self.importScripts("satellite.js");
|
self.importScripts("satellite.js");
|
||||||
|
self.importScripts("moment.min.js");
|
||||||
|
self.importScripts("https://cesiumjs.org/releases/1.53/Build/Cesium/Cesium.js")
|
||||||
|
|
||||||
norad = ""
|
norad = ""
|
||||||
groundStations = []
|
groundStations = []
|
||||||
TLE = []
|
satrec = null
|
||||||
Orbits = []
|
Orbits = []
|
||||||
|
name = ""
|
||||||
|
|
||||||
onmessage = function(e) {
|
onmessage = function(e) {
|
||||||
norad = e.data[0]
|
norad = e.data[0]
|
||||||
TLE = e.data[1]
|
name = e.data[1][0]
|
||||||
|
satrec = self.satellite_js.twoline2satrec(e.data[1][1],e.data[1][2]);
|
||||||
getStations()
|
getStations()
|
||||||
getOrbit()
|
Orbits = getObrit()
|
||||||
}
|
}
|
||||||
|
|
||||||
setInterval(function(){
|
setInterval(function(){
|
||||||
getStations()
|
getStations()
|
||||||
}, 20000);
|
}, 10000);
|
||||||
|
|
||||||
setInterval(function(){
|
setInterval(function(){
|
||||||
var satrec = self.satellite_js.twoline2satrec(TLE[1],TLE[2]);
|
getObrit()
|
||||||
|
}, 60000*5);
|
||||||
|
|
||||||
|
setInterval(function(){
|
||||||
|
|
||||||
var gmst = self.satellite_js.gstime(new Date());
|
var gmst = self.satellite_js.gstime(new Date());
|
||||||
var positionAndVelocity = self.satellite_js.propagate(satrec, new Date());
|
var positionAndVelocity = self.satellite_js.propagate(satrec, new Date());
|
||||||
var positionEci = positionAndVelocity.position
|
var positionEci = positionAndVelocity.position
|
||||||
var positionGd = self.satellite_js.eciToGeodetic(positionEci, gmst)
|
var positionGd = self.satellite_js.eciToGeodetic(positionEci, gmst)
|
||||||
var curLat = degress(positionGd.latitude)
|
|
||||||
var curLng = degress(positionGd.longitude)
|
|
||||||
if (groundStations[1] == undefined){
|
if (groundStations[1] == undefined){
|
||||||
groundStations.push([])
|
groundStations.push([])
|
||||||
}
|
}
|
||||||
|
|
||||||
postMessage([norad,TLE[0],[curLat,curLng],groundStations[0],groundStations[1],Orbits])
|
postMessage([norad,name,self.Cesium.Ellipsoid.WGS84.cartographicToCartesian(new self.Cesium.Cartographic(positionGd.longitude, positionGd.latitude, (positionGd.height*1000))),groundStations[0],groundStations[1],Orbits])
|
||||||
|
|
||||||
|
|
||||||
}, 1000);
|
}, 10000);
|
||||||
|
|
||||||
function getStations(){
|
function getStations(){
|
||||||
var xhttp = new XMLHttpRequest();
|
var xhttp = new XMLHttpRequest();
|
||||||
|
@ -48,17 +55,19 @@ function degress (radians) {
|
||||||
return radians * 180 / Math.PI;
|
return radians * 180 / Math.PI;
|
||||||
};
|
};
|
||||||
|
|
||||||
function getOrbit(){
|
|
||||||
var satrec = self.satellite_js.twoline2satrec(TLE[1],TLE[2]);
|
function getObrit(){
|
||||||
gmst = self.satellite_js.gstime(new Date());
|
|
||||||
while(Orbits.length < 300){
|
satelliteOrbit = []
|
||||||
gmst = gmst+0.00833333333
|
for (var i = 0; i < 30; i++){
|
||||||
if (gmst > 6.28318530718){
|
time = moment().subtract(10,"m").add(i*1,"m")
|
||||||
return
|
var gmst = self.satellite_js.gstime(new Date(time.valueOf()));
|
||||||
}
|
var positionAndVelocity = self.satellite_js.propagate(satrec, new Date(time.valueOf()));
|
||||||
positionAndVelocity = self.satellite_js.propagate(satrec, (new Date() / 1000/60));
|
var positionEci = positionAndVelocity.position
|
||||||
positionEci = positionAndVelocity.position
|
var positionGd = self.satellite_js.eciToGeodetic(positionEci, gmst)
|
||||||
positionGd = self.satellite_js.eciToGeodetic(positionEci, gmst)
|
|
||||||
Orbits.push([degress(positionGd.latitude),degress(positionGd.longitude)])
|
satelliteOrbit = satelliteOrbit.concat(self.Cesium.Ellipsoid.WGS84.cartographicToCartesian(new self.Cesium.Cartographic(positionGd.longitude, positionGd.latitude, positionGd.height*1000)));
|
||||||
}
|
}
|
||||||
}
|
return satelliteOrbit
|
||||||
|
|
||||||
|
}
|
|
@ -1,6 +1,7 @@
|
||||||
<head>
|
<head>
|
||||||
<script src="https://cesiumjs.org/releases/1.53/Build/Cesium/Cesium.js"></script>
|
<script src="https://cesiumjs.org/releases/1.53/Build/Cesium/Cesium.js"></script>
|
||||||
<link href="https://cesiumjs.org/releases/1.53/Build/Cesium/Widgets/widgets.css" rel="stylesheet">
|
<link href="https://cesiumjs.org/releases/1.53/Build/Cesium/Widgets/widgets.css" rel="stylesheet">
|
||||||
|
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
|
||||||
<script src="moment.min.js"></script>
|
<script src="moment.min.js"></script>
|
||||||
<script src="satellite.js"></script>
|
<script src="satellite.js"></script>
|
||||||
|
|
||||||
|
@ -16,38 +17,172 @@
|
||||||
<div id="cesiumContainer" style="width: 100%; height:100%"></div>
|
<div id="cesiumContainer" style="width: 100%; height:100%"></div>
|
||||||
<script>
|
<script>
|
||||||
Cesium.Ion.defaultAccessToken = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiIwYmEwOTc5YS01N2I3LTRhYmQtOGE0MS1lNTkyMWU2ZmM3YWUiLCJpZCI6Njg1OCwic2NvcGVzIjpbImFzciIsImdjIl0sImlhdCI6MTU0NzU5ODkxOX0.p4alNyuyt_Eufuo8xX_SB6HKHuSixBTxgiVpD6UGI3Y';
|
Cesium.Ion.defaultAccessToken = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiIwYmEwOTc5YS01N2I3LTRhYmQtOGE0MS1lNTkyMWU2ZmM3YWUiLCJpZCI6Njg1OCwic2NvcGVzIjpbImFzciIsImdjIl0sImlhdCI6MTU0NzU5ODkxOX0.p4alNyuyt_Eufuo8xX_SB6HKHuSixBTxgiVpD6UGI3Y';
|
||||||
var viewer = new Cesium.Viewer('cesiumContainer');
|
var viewer = new Cesium.Viewer('cesiumContainer',{timeline:false,vrButton:false,homeButton:false,animation:false,baseLayerPicker:true});
|
||||||
var satrec = satellite_js.twoline2satrec("1 43017U 17073E 19015.35565251 .00000543 00000-0 48600-4 0 9995","2 43017 97.7201 302.7888 0257714 301.1255 56.4906 14.78360070 62455");
|
viewer.terrainProvider = Cesium.createWorldTerrain();
|
||||||
getObrit()
|
Orbits = {}
|
||||||
|
Satelites = {}
|
||||||
|
Workers = {}
|
||||||
|
Stations = {}
|
||||||
|
Lines = {}
|
||||||
|
|
||||||
function getObrit(){
|
$.get("/active_stations", function(data, status){
|
||||||
|
data = JSON.parse(data)
|
||||||
satelliteOrbit = []
|
dataS = data
|
||||||
for (var i = 0; i < 3000; i++){
|
data.forEach(function(x){
|
||||||
time = moment().add(i*10,"m")
|
description = "<b>ID: "+x["id"]+"</b><br><b>Total Observations: "+x["total_obs"]+"</b><br><b>Status: "+x["type"]+"</b><br><b>QTH: "+x["qthlocator"]+"</b><br></b>Description: </b>"+x["description"]
|
||||||
var gmst = satellite_js.gstime(new Date(time.valueOf()));
|
Color = Cesium.Color.GREEN
|
||||||
var positionAndVelocity = satellite_js.propagate(satrec, new Date(time.valueOf()));
|
if(x["type"]=="Testing"){
|
||||||
var positionEci = positionAndVelocity.position
|
Color = Cesium.Color.ORANGE
|
||||||
var positionGd = satellite_js.eciToGeodetic(positionEci, gmst)
|
}
|
||||||
|
Stations[x["id"]] = viewer.entities.add({
|
||||||
satelliteOrbit = satelliteOrbit.concat(Cesium.Ellipsoid.WGS84.cartographicToCartesian(new Cesium.Cartographic(positionGd.longitude, positionGd.latitude, positionGd.height*1000)));
|
position : Cesium.Cartesian3.fromDegrees(x["lat_lng"][1],x["lat_lng"][0],x["lat_lng"][2]),
|
||||||
|
name: x["name"],
|
||||||
|
id: x["id"],
|
||||||
|
description:description,
|
||||||
|
point : {
|
||||||
|
pixelSize : 5,
|
||||||
|
color : Color,
|
||||||
|
|
||||||
|
outlineColor : Cesium.Color.WHITE,
|
||||||
|
outlineWidth : 2
|
||||||
}
|
}
|
||||||
viewer.entities.add({
|
});
|
||||||
id: 1,
|
});
|
||||||
name: 'Orbit Polyline',
|
});
|
||||||
polyline: {
|
|
||||||
positions: satelliteOrbit,
|
|
||||||
width: 5,
|
function UpdateMap(e) {
|
||||||
|
var norad = e.data[0]
|
||||||
|
var name = e.data[1]
|
||||||
|
var satPos = e.data[2]
|
||||||
|
|
||||||
|
var observingStations = e.data[3]
|
||||||
|
var transmitters = e.data[4]
|
||||||
|
var Orbit = e.data[5]
|
||||||
|
|
||||||
|
if(Object.keys(Orbits).includes(norad)){
|
||||||
|
Orbits[norad].polyline = {
|
||||||
|
positions: Orbit,
|
||||||
|
width: 1,
|
||||||
followSurface: false,
|
followSurface: false,
|
||||||
material: new Cesium.Material({fabric : { type : 'Color', uniforms : {color : new Cesium.Color(1.0, 1.0, 0.0, 1.0)}}}),
|
material: new Cesium.ColorMaterialProperty(Cesium.Color(1.0, 1.0, 0.0, 0.5)),
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
Orbits[norad] = viewer.entities.add({
|
||||||
|
nane: name+" Obirt",
|
||||||
|
polyline: {
|
||||||
|
positions: Orbit,
|
||||||
|
width: 1,
|
||||||
|
followSurface: false,
|
||||||
|
material: new Cesium.ColorMaterialProperty(Cesium.Color(1.0, 1.0, 0.0, 0.5)),
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function degress (radians) {
|
|
||||||
return radians * 180 / Math.PI;
|
popupText = "<b>Name: "+name+"</b><br><b>Norad: "+norad+"</b><br><b>Station Count: "+observingStations.length+"</b><br>"
|
||||||
};
|
transmitters.forEach(function(x){
|
||||||
|
//console.log(x + " "+norad)
|
||||||
|
popupText = popupText + '<div class="trans" style="background-color:'+x[1]+'";>'+x[0]+"</div>"
|
||||||
|
})
|
||||||
|
|
||||||
|
if(Object.keys(Satelites).includes(norad)){
|
||||||
|
|
||||||
|
Satelites[norad].position = satPos
|
||||||
|
Satelites[norad].description = popupText
|
||||||
|
}else{
|
||||||
|
Satelites[norad] =viewer.entities.add({
|
||||||
|
position : satPos,
|
||||||
|
name: name,
|
||||||
|
id: norad,
|
||||||
|
description:popupText,
|
||||||
|
point : {
|
||||||
|
pixelSize : 10,
|
||||||
|
color : Cesium.Color.RED,
|
||||||
|
outlineWidth : 2
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if(Object.keys(Lines).includes(norad)){
|
||||||
|
Object.keys(Lines[norad]).forEach(
|
||||||
|
function(x){
|
||||||
|
|
||||||
|
viewer.entities.remove(Lines[norad][x])
|
||||||
|
delete Lines[norad][x]
|
||||||
|
})
|
||||||
|
|
||||||
|
}else{
|
||||||
|
Lines[norad] = {}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
observingStations.forEach(function(x){
|
||||||
|
|
||||||
|
|
||||||
|
Lines[norad][x[0]] = viewer.entities.add({polyline: {
|
||||||
|
followSurface: false,
|
||||||
|
width:4,
|
||||||
|
positions: new Cesium.PositionPropertyArray([
|
||||||
|
new Cesium.ReferenceProperty(
|
||||||
|
viewer.entities,
|
||||||
|
Satelites[norad].id,
|
||||||
|
[ 'position' ]
|
||||||
|
),
|
||||||
|
new Cesium.ReferenceProperty(
|
||||||
|
viewer.entities,
|
||||||
|
Stations[x[0]].id,
|
||||||
|
[ 'position' ]
|
||||||
|
)
|
||||||
|
]),
|
||||||
|
material: new Cesium.ColorMaterialProperty(Cesium.Color.fromCssColorString(x[1]))
|
||||||
|
|
||||||
|
}
|
||||||
|
})})
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
$.get("/occuring_sats", function(data, status){
|
||||||
|
data = JSON.parse(data)
|
||||||
|
Object.keys(data).forEach(function(x){
|
||||||
|
worker = new Worker('Worker.js');
|
||||||
|
worker.onmessage = UpdateMap
|
||||||
|
worker.postMessage([x,data[x]]);
|
||||||
|
Workers[x] =worker
|
||||||
|
});
|
||||||
|
});
|
||||||
|
setInterval(function(){
|
||||||
|
$.get("/occuring_sats", function(data, status){
|
||||||
|
data = JSON.parse(data)
|
||||||
|
Object.keys(Workers).forEach(function(x){
|
||||||
|
if(Object.keys(data).includes(x)){}else{
|
||||||
|
console.log(x)
|
||||||
|
Workers[x].terminate()
|
||||||
|
delete Workers[x]
|
||||||
|
viewer.entities.remove(Satelites[x])
|
||||||
|
viewer.entities.remove(Orbits[x])
|
||||||
|
viewer.entities.remove(Satelites[x])
|
||||||
|
viewer.entities.remove(Orbits[x])
|
||||||
|
delete Satelites[x]
|
||||||
|
delete Orbits[x]
|
||||||
|
delete Workers[x]
|
||||||
|
}
|
||||||
|
});
|
||||||
|
Object.keys(data).forEach(function(x){
|
||||||
|
worker = new Worker('Worker.js');
|
||||||
|
worker.onmessage = UpdateMap
|
||||||
|
worker.postMessage([x,data[x]]);
|
||||||
|
Workers[x] =worker
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}, 60000);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue