/* * @Descripttion: * @version: 1.0 * @Author: zhangti * @Date: 2019-09-29 11:55:55 * @LastEditors : sueRimn * @LastEditTime : 2020-01-02 17:25:04 */ /** * 卫星过境封装类 */ import config from './config.js'; import CVTools from './cvTool.js'; import mouseManager from './mouseManager.js'; import Entitys from './entitys.js'; import entityFactory from './entityFactory.js'; import Handler from './handler.js'; import Primitives from './primitives.js'; export default class satelliteTransit{ constructor(v){ /** * 核心类 */ this.CoreV = v; /** * 时钟 */ this.STClock = v.clock; /** * 时间速率 */ this.STSpeed = 10; /** * 卫星实体 */ this.satelliteAll = []; /** * 通信 */ this.Transits = []; /** * 工具 */ this.Tools = new CVTools(); /** * mouseManager * 坐标转换 */ this.mouseManager = new mouseManager(v); //实体对象 this.entitys = new Entitys(v); //图形 this.Primitives = new Primitives(v); //格式数据存储 //查看方式区分开 以免冲突 this.passTime = []; this.passTime_old = []; //刷新的时间 this.renderTime = null; //拾取的对象 this.pickedFeature = null; //标识符 this.iden = true; //实体 this.EntityObj = []; //线实体 this.lineEntity = []; } /** * 初始化卫星过境 */ initST(){ let _self = this; _self.handlerAction = new Handler(_self.CoreV); //单击 _self.handlerAction.Action(function(e){ try { if(!e.position){ return false; } _self.pickedFeature = _self.mouseManager.piObj(e.position); if (!Cesium.defined(_self.pickedFeature) && _self.pickedFeature == undefined){ return false; }; if(_self.pickedFeature.id.description == undefined){ //自己创建的 return false; }; let f_name = _self.pickedFeature.id.name,f_position,position; if(_self.pickedFeature.id.idea == "radar"){ position = _self.pickedFeature.id.position.getValue(_self.STClock.currentTime); _self.pickedFeature.type = "radar"; }else{ position = _self.pickedFeature.id.position.getValue(_self.STClock.currentTime); _self.pickedFeature.type = "satellite"; } f_position = _self.mouseManager.piEllipsoid(position); _self.pickedFeature.id.description = _self.infoTable_2(f_name,f_position); console.log(f_name,f_position); //viewer.selectedEntity = selectedEntity; _self.pickedFeature.id.name = f_name; _self.pickedFeature.temp = _self.pickedFeature.id.description + "

Passes

"; _self.iden = false; //点击事件改变标识符 } catch (error) { console.log(error); } },_self.handlerAction.LEFT_CLICK) _self.loadCZML(); } loadCZML(){ //load数据 let _self = this; _self.CoreV.dataSources.add(Cesium.CzmlDataSource.load(config.DATADIR + '/test.czml')).then(function(dataSource) { _self.dataSource = dataSource; _self.radar = dataSource.entities.getById("Facility/AGI"); let satellite1 = dataSource.entities.getById("Satellite/ISS"); let satellite2 = dataSource.entities.getById("Satellite/Geoeye1"); let transit1 = dataSource.entities.getById("Facility/AGI-to-Satellite/ISS"); let transit2 = dataSource.entities.getById("Facility/AGI-to-Satellite/Geoeye1"); _self.satelliteAll = [satellite1,satellite2]; _self.Transits = [transit1,transit2]; _self.radar.idea = "rader"; try{ _self.scan(); _self.satelliteInfo(); //_self.createEntity([_self.radar]); _self.communication(); }catch(e){ console.log(e); } }) } /** * 卫星过境通信效果 */ communication(){ let _self = this; _self.p_line = []; //创建线的点 //雷达 if(_self.radar == null){ return false; } let r_position = _self.radar.position.getValue(_self.STClock.currentTime); let r_point = _self.mouseManager.piEllipsoid(r_position); _self.rr_point = [parseInt(r_point.longitude / Math.PI * 180), parseInt(r_point.latitude / Math.PI * 180)]; if(_self.satelliteAll.length == 0){ return false; } //遍历卫星 for(let i in _self.satelliteAll){ _self.p_line[i] = []; let sate = _self.satelliteAll[i]; let s_position = sate.position.getValue(_self.STClock.currentTime); _self.s_point = _self.mouseManager.piEllipsoid(s_position); _self.p_line[i].push(r_position.clone()); _self.p_line[i].push(s_position.clone()); let lineObj = new entityFactory({type:"createLine",data:{positions: _self.p_line[i],width:1}}); _self.lineEntity.push(_self.entitys.add(lineObj)); } } /** * 判断一个点是否在圆的内部 * @param point 测试点坐标 * @param circle 圆心坐标 * @param r 圆半径 * 返回true为真,false为假 * */ pointInsideCircle (point, circle, r) { if (r===0) return false var dx = circle[0] - point[0] var dy = circle[1] - point[1] return dx * dx + dy * dy <= r * r } /** * 卫星信息 */ satelliteInfo(){ let _self = this; if(_self.Transits.length == 0){ return false; }; _self.formatTransit(); _self.selectedEntity = _self.entitys.createEntity(); _self.selectedEntity.name = "PASS"; _self.selectedEntity.description = _self.infoTable_1(dayjs(Cesium.JulianDate.addHours(_self.STClock.currentTime,-8,new Cesium.JulianDate())).format("YYYY-MM-DD HH:mm:ss")); _self.CoreV.selectedEntity = _self.selectedEntity; let pass_flag = function(clock){ try { if(_self.satelliteAll.length == 0){ return false; } for(let i in _self.satelliteAll){ //遍历卫星 let sate = _self.satelliteAll[i]; let position = sate.position.getValue(clock.currentTime); let s_point = _self.mouseManager.piEllipsoid(position); _self.p_line[i].pop(); _self.p_line[i].push(position.clone()); _self.ss_point = [parseInt(s_point.longitude / Math.PI * 180), parseInt(s_point.latitude / Math.PI * 180)] let flag = _self.pointInsideCircle(_self.ss_point,_self.rr_point,30); if(flag){ _self.lineEntity[i].show = true; }else{ _self.lineEntity[i].show = false; } } } catch (error) { console.log(error); } } _self.STClock.onTick.addEventListener(function(clock) { try { if(!clock.shouldAnimate)return; if(_self.iden)_self.selectedEntity.description = _self.infoTable_1(_self.pass(clock));//标识符 进来展示所有卫星信息 if(!_self.iden){ if(_self.pickedFeature == null)return; if("radar" == _self.pickedFeature.type){ _self.pickedFeature.id.description = _self.pickedFeature.temp + _self.infoTable_1(_self.pass(clock)); }else{ let position = _self.pickedFeature.id.position.getValue(clock.currentTime); let f_position = _self.mouseManager.piEllipsoid(position); _self.pickedFeature.id.description = _self.infoTable_2( _self.pickedFeature.id.name,f_position) + '

Passes

' + _self.infoTable_3(_self.pass(clock),_self.pickedFeature.id.name); } } pass_flag(clock); //判断是否在地面雷达通信范围 } catch (error) { console.log(error); } }); _self.STClock.onStop.addEventListener(function(clock){ //格式化卫星数据 if(_self.Transits.length == 0){ return false; }; _self.formatTransit(); }); } /** * 格式化通信数据 */ formatTransit(){ let _self = this; if(_self.Transits.length == 0){ return false; }; _self.passTime = [],_self.passTime_old = []; //查看方式区分开 以免冲突 _self.Tools.arrForEach(_self.Transits,function(transit,index){ let intervals = [],intervals_old = []; let n_interval = transit.availability._intervals; _self.Tools.arrForEach(n_interval,function(interval,index){ let start = dayjs(Cesium.JulianDate.addHours(interval.start,-8,new Cesium.JulianDate())).format("YYYY-MM-DD HH:mm:ss"); let stop = dayjs(Cesium.JulianDate.addHours(interval.stop,-8,new Cesium.JulianDate())).format("YYYY-MM-DD HH:mm:ss"); intervals.push({name:transit.name,"startTime":start,"stopTime":stop,"interval":dayjs(stop).diff(dayjs(start), 'millisecond')}); intervals_old.push({name:transit.name,"startTime":start,"stopTime":stop,"interval":dayjs(stop).diff(dayjs(start), 'millisecond')}); }); _self.passTime.push(intervals); _self.passTime_old.push(intervals_old); }); } /** * 创建雷达实体 */ createEntity(radars){ try{ let _self = this; if(radars.length == 0){ return false; } _self.Tools.arrForEach(radars,function(radar){ let l ,r ; let positions = radar.position.getValue(_self.STClock.currentTime); _self.r_point = positions; if(positions.length == 0){ return false; }; let cartographic = _self.mouseManager.piEllipsoid(positions); let lat = Cesium.Math.toDegrees(cartographic.latitude),lon = Cesium.Math.toDegrees(cartographic.longitude), height = cartographic.height; //radarscan r = new Cesium.HeadingPitchRoll(Cesium.Math.toRadians(90), Cesium.Math.toRadians(0),Cesium.Math.toRadians(0)); l = Cesium.Cartesian3.fromDegrees(lon, lat, height); _self.EntityObj.push(_self.entitys.add(_self.entitys.getCustomRadar(l,r))); }); }catch(e){ console.log(e); } } /** * 添加扫描物 */ scan(){ let _self = this; if(_self.satelliteAll.length == 0){ return false; }; _self.Tools.arrForEach(_self.satelliteAll,function(entity,index){ var cartesian = entity.position.getValue(_self.STClock.currentTime); let positions = _self.mouseManager.worldToLonlat(cartesian); _self.bindScan(positions,entity); }); } pass(clock){ //当前时间 let currentTime = dayjs(Cesium.JulianDate.addHours(clock.currentTime,-8,new Cesium.JulianDate())).format("YYYY-MM-DD HH:mm:ss"); return currentTime; } index_rm(n){ if(this.passTime_old.length == 0){ return false; }; this.passTime_old[n].splice(0,1); //删除第一个 } /** * 绑定扫描物 */ bindScan(positions,entityObj){ //let modelMatrix = this.Primitives.countModelMatrix(positions); //this.scanEntity = new entityFactory({type:"createScan",data:{modelMatrix:modelMatrix,positions:positions,v:this.CoreV}}); this.scanEntity = new entityFactory({type:"dynamicCylinder",data:{positions:positions,entity:entityObj,v:this.CoreV,cylinder:{legnth:600000,slices:4,bottomRadius:600000/2},}}); this.EntityObj.push(this.entitys.add( this.scanEntity)); } /* * table 1 */ infoTable_1(currentTime){ try{ let _self = this,renderTime = _self.renderTime; if(_self.passTime_old.length == 0){ return false; }; var tr = "",table = ``; for(var n in _self.passTime_old){ if(_self.passTime_old[n].length == 0)continue; var interval_pass = _self.passTime_old[n][0]; //始终取第一个 renderTime = dayjs(interval_pass.startTime).diff(dayjs(currentTime)); if(renderTime <= 0){ if(renderTime <= -(interval_pass.interval)){ _self.index_rm(n); }else{ renderTime = "PASS"; } } tr += ``; } return table + tr + `
卫星倒计时(ms)通信开始(date)通信结束(date)通信时长(ms)
${interval_pass.name}${renderTime}${interval_pass.startTime} ${interval_pass.stopTime} ${interval_pass.interval}
`; }catch(e){ console.log(e); } } /* * table 2 */ infoTable_2(f_name,cartesian){ if(f_name == undefined && cartesian == undefined){ return false; }; let tr = "",table = `

Position

`; let f_point = [ parseInt(cartesian.longitude / Math.PI * 180), parseInt(cartesian.latitude / Math.PI * 180)]; tr = ``; return table + tr + `
NameLatitudeLongitudeElevation
${f_name}${f_point[0]}°${f_point[1]}° ${parseInt(cartesian.height)}
`; } /* * table 3 */ infoTable_3(currentTime,featureName){ let _self = this,renderTime = _self.renderTime; if(_self.passTime.length == 0 && featureName == undefined){ return false; }; let t_interval = function(){ for(var i in _self.passTime){if(_self.passTime[i][0].name.indexOf(featureName)!=-1)return _self.passTime[i];} } let intervals = t_interval(); var tr = "",table = ``; _self.Tools.arrForEach(intervals,function(interval,index){ renderTime = dayjs(interval.startTime).diff(dayjs(currentTime)); if(renderTime <= 0)renderTime = 0; tr += ``; }); return table + tr + `
卫星倒计时(ms)通信开始(date)通信结束(date)通信时长(ms)
${interval.name}${renderTime}${interval.startTime} ${interval.stopTime} ${interval.interval}
`; } /** * 向后飞行 */ STBack(){ this.STSpeed = -50; this.STClock.multiplier = this.STSpeed; } /** * 向前飞行 */ STForward(){ this.STSpeed = 50; this.STClock.multiplier = this.STSpeed; } /** * 飞行速度 */ STspeed(speedNum){ console.log(speedNum); this.STClock.multiplier = speedNum; } /** * 开始飞行 */ startST(){ this.STClock.shouldAnimate = true; } /** * 暂停飞行 */ pauseST(){ this.STClock.shouldAnimate = false; } /** * 清除飞行 */ removeST(){ let _self = this; if(_self.EntityObj.length == 0){ return false; } _self.Tools.arrForEach(_self.EntityObj,function(entity,index){ _self.entitys.remove(entity); }); _self.CoreV.dataSources.remove(_self.dataSource); _self.CoreV.clock.shouldAnimate = false; _self.handlerAction.destroy(); _self.handlerAction = null; _self.EntityObj = []; } }