建企业网站建设注意问题,牟平网站制作公司,2021世界500强企业排名,wordpress默认编辑器起因#xff1a;看了cesium官网卫星通信示例发现只有cmzl版本的#xff0c;决定自己动手写一个。欢迎大家一起探讨#xff0c;评论留言。 效果 全部代码在最后 起步
寻找卫星轨迹数据#xff0c;在网站space-track上找的#xff0c;自己注册账号QQ邮箱即可。
卫星轨道类… 起因看了cesium官网卫星通信示例发现只有cmzl版本的决定自己动手写一个。欢迎大家一起探讨评论留言。 效果 全部代码在最后 起步
寻找卫星轨迹数据在网站space-track上找的自己注册账号QQ邮箱即可。
卫星轨道类型 轨道高度 卫星用途LEO (低地球轨道) 500-2000km 对地观测、测地、通信、导航等MEO (中地球轨道) 2000-35786km 导航GEO(地球静止轨道) 35786km 通信 导航、气象观测等SSO (太阳同步轨道) 6000km 观测等IGSO(倾斜地球同步轨道) 35786km 导航 点击TLE就可以得到卫星的两个轨道数据 当然这个数据需要相对应的插件satellite.js转换成我们熟悉的经纬高 拔下来的数据存入json文件中: 最后构造卫星轨迹对象
import {twoline2satrec, gstime, eciToGeodetic,PositionAndVelocity, propagate, EciVec3,degreesLong
} from satellite.js;fetch(data/points.json).then(res res.json()).then(data {for (const key in data) {if (Object.prototype.hasOwnProperty.call(data, key)) {const element data[key];const satrec twoline2satrec(element.data[0], element.data[1]);const positionAndVelocity: PositionAndVelocity propagate(satrec, time);const positionEci positionAndVelocity.position as EciVec3number;obj[key] {country: element.country,times: [],positions: []};let lon, lat, alt;//一年365天 一天为间隔for (let index min; index nowTime; index index 86400000) {const gmst gstime(new Date(index));const positionGd eciToGeodetic(positionEci, gmst)lon positionGd.longitude,lat positionGd.latitude,alt positionGd.height;obj[key].times.push(index)obj[key].positions.push([degreesLong(lon), degreesLong(lat), alt])}}}})加载卫星和轨迹线
//用数据集方便管理
const satellites new Cesium.CustomDataSource(satellite);
const polylines new Cesium.CustomDataSource(statelliteLine);
function computeCirclularFlight(arr: Obj, hasLine: boolean true) {for (const key in arr) {if (Object.prototype.hasOwnProperty.call(arr, key)) {const element arr[key];const property new Cesium.SampledPositionProperty();const length element.positions.lengthconst positions: number[] []let p, tfor (let index 0; index length; index) {p element.positions[index]t element.times[index]property.addSample(Cesium.JulianDate.addHours(Cesium.JulianDate.fromDate(new Date(t)), 8, new Cesium.JulianDate()), Cesium.Cartesian3.fromDegrees(p[0], p[1], p[2]));positions.push(...element.positions[index])}satellites.entities.add({id: key,model: {uri: element.country US ? models/satellite/satellite1/Satellite.gltf: element.country PRC ? models/satellite/satellite2/10477_Satellite_v1_L3.gltf : models/satellite/satellite3/satellite.gltf,minimumPixelSize: 32},position: property,});if (hasLine)polylines.entities.add({id: key,polyline: {width: 1,material: Cesium.Color.BLUE.withAlpha(.5),positions: Cesium.Cartesian3.fromDegreesArrayHeights(positions)}})}}viewer.dataSources.add(satellites);viewer.dataSources.add(polylines);
}加载卫星和轨迹的效果
加载地面雷达
const radars new Cesium.CustomDataSource(radar);
const radarpoints: {id: string;lon: number;lat: number;radius: number
}[] [{ id: radar1, lon: 104, lat: 34, radius: 300000 },{ id: radar2, lon: -100, lat: 55, radius: 300000 },{ id: radar3, lon: 109.70841, lat: 19.365791, radius: 300000 },]//添加雷达radarpoints.forEach(i {createRadar(i.id, i.lon, i.lat, i.radius)})function createRadar(id: string, lon: number, lat: number, radius: number) {radars.entities.add({id: id,model: {uri: models/antenna_07.glb,minimumPixelSize: 32,},position: Cesium.Cartesian3.fromDegrees(lon, lat),})viewer.dataSources.add(radars)new LCesiumApi.RadarPrimitive({radius: radius,stackPartitions: 10,slicePartitions: 10,stackDegrees: {x: 0,y: 90,},sliceDegrees: {x: 0,y: 360,},color: Cesium.Color.GREEN.withAlpha(0.2),lineColor: Cesium.Color.RED,scanColor: Cesium.Color.YELLOW.withAlpha(0.2),scanLineColor: Cesium.Color.RED,scene: viewer.scene,center: Cesium.Cartesian3.fromDegrees(lon, lat),scanSpeed: 5000,show: true,scan: true,});
}关于雷达效果在我之前文章里面有 卫星与地面雷达通信
暂时只做了m(雷达)-n(卫星)m*n;没有做卫星之间的通信判断不过原理都是一样的.网上搜索了一下通信距离一般是3,580km计算此时卫星距雷达的距离,其实就是计算带高度的经纬度之间的距离
Cartesian3.distance(point1: Cartesian3, point2: Cartesian3)当卫星和地面卫星通信时创建连线离开设置为隐藏。
function computeRange() {satellites.entities.values.forEach(i {radars.entities.values.forEach(j {const po1 i.position?.getValue(viewer.clock.currentTime)const po2 j.position?.getValue(viewer.clock.currentTime)if (po1 po2) {const len LCesiumApi.Tool.getDistanceFromCartesian3(po1, po2)if (len communicationRange) {if (showFlyObject[${i.id}-${j.id}]) {showFlyObject[${i.id}-${j.id}].show trueshowFlyObject[${i.id}-${j.id}].po1 LCesiumApi.Tramsform.degreesFromCartesian(po1)showFlyObject[${i.id}-${j.id}].po2 LCesiumApi.Tramsform.degreesFromCartesian(po2)}else {showFlyObject[${i.id}-${j.id}] {entity: null,show: true,po1: LCesiumApi.Tramsform.degreesFromCartesian(po1),po2: LCesiumApi.Tramsform.degreesFromCartesian(po2)}}} else {if (showFlyObject[${i.id}-${j.id}]) showFlyObject[${i.id}-${j.id}].show false}}})})setLine()
}
function setLine() {for (const key in showFlyObject) {if (Object.prototype.hasOwnProperty.call(showFlyObject, key)) {const element showFlyObject[key];if (element.entity null) element.entity createFlyLine(key)element.entity.show element.show}}
}
function createFlyLine(id: string) {var material new PolylineTrailLinkMaterialProperty({color: Cesium.Color.fromCssColorString(#7ffeff),duration: 3000,});const line Connection.entities.add({id: id,polyline: {positions: new Cesium.CallbackProperty(() {return Cesium.Cartesian3.fromDegreesArrayHeights([showFlyObject[id].po1.longitude,showFlyObject[id].po1.latitude,showFlyObject[id].po1.height,showFlyObject[id].po2.longitude,showFlyObject[id].po2.latitude,showFlyObject[id].po2.height,])}, false),width: 8,material}})return line
}完整代码
templateMap onViewerLoadedonViewerLoaded :optionsoptions /
/template
script langts setup
import Map from /components/Cesium/lib/Map.vue;
import * as Cesium from cesium;
import { message } from ant-design-vue
import {twoline2satrec, gstime, eciToGeodetic,PositionAndVelocity, propagate, EciVec3,degreesLong
} from satellite.js;
import LCesiumApi from lib/main;
//ts-ignore
import { PolylineTrailLinkMaterialProperty } from ./PolylineTrailMaterialProperty.js
const options {imageryProvider: new Cesium.ArcGisMapServerImageryProvider({url: https://services.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer}),
}
let viewer: Cesium.Viewer
let start: Cesium.JulianDate
let stop: Cesium.JulianDate
let handler: Cesium.ScreenSpaceEventHandler;
const communicationRange 3580000;
const time new Date()
let max time.getTime()
let year 31622400000;
let min max - year;
type Obj {[index: string]: {country: string;times: number[];positions: [[number, number, number]] | number[][]}
}
const showFlyObject: {[index: string]: any
} {}
let obj: Obj {}
const radarpoints: {id: string;lon: number;lat: number;radius: number
}[] [{ id: radar1, lon: 104, lat: 34, radius: 300000 },{ id: radar2, lon: -100, lat: 55, radius: 300000 },{ id: radar3, lon: 109.70841, lat: 19.365791, radius: 300000 },]
const onViewerLoaded (Viewer: Cesium.Viewer) {viewer Viewerhandler new Cesium.ScreenSpaceEventHandler(viewer.canvas);//设置时间轴setTimeline()//读取卫星分布两行数据const nowTime time.getTime()fetch(data/points.json).then(res res.json()).then(data {for (const key in data) {if (Object.prototype.hasOwnProperty.call(data, key)) {const element data[key];const satrec twoline2satrec(element.data[0], element.data[1]);const positionAndVelocity: PositionAndVelocity propagate(satrec, time);const positionEci positionAndVelocity.position as EciVec3number;obj[key] {country: element.country,times: [],positions: []};let lon, lat, alt;//一年365天 一天为间隔for (let index min; index nowTime; index index 86400000) {const gmst gstime(new Date(index));const positionGd eciToGeodetic(positionEci, gmst)lon positionGd.longitude,lat positionGd.latitude,alt positionGd.height;obj[key].times.push(index)obj[key].positions.push([degreesLong(lon), degreesLong(lat), alt])}}}computeCirclularFlight(obj)})//添加点击事件addPick()//添加雷达radarpoints.forEach(i {createRadar(i.id, i.lon, i.lat, i.radius)})//添加过境扫描; (viewer as any).frameUpdate.addEventListener((delta: any) {computeRange()});
}
function setTimeline() {start Cesium.JulianDate.fromDate(new Date(min)); // 获取当前时间 这不是国内的时间start Cesium.JulianDate.addHours(start, 8, new Cesium.JulianDate()); // 添加八小时得到我们东八区的北京时间stop Cesium.JulianDate.fromDate(new Date(max)); // 设置一个结束时间意思是360秒之后时间结束viewer.clock.startTime start.clone(); // 给cesium时间轴设置开始的时间也就是上边的东八区时间viewer.clock.stopTime stop.clone(); // 设置cesium时间轴设置结束的时间viewer.clock.currentTime start.clone(); // 设置cesium时间轴设置当前的时间viewer.clock.clockRange Cesium.ClockRange.LOOP_STOP; // 时间结束了再继续重复来一遍//时间变化来控制速度 // 时间速率数字越大时间过的越快viewer.clock.multiplier 1;//给时间线设置边界viewer.timeline.zoomTo(start, stop);
}
const satellites new Cesium.CustomDataSource(satellite);
const polylines new Cesium.CustomDataSource(statelliteLine);
const radars new Cesium.CustomDataSource(radar);
const Connection new Cesium.CustomDataSource(connection);
function computeCirclularFlight(arr: Obj, hasLine: boolean true) {for (const key in arr) {if (Object.prototype.hasOwnProperty.call(arr, key)) {const element arr[key];const property new Cesium.SampledPositionProperty();const length element.positions.lengthconst positions: number[] []let p, tfor (let index 0; index length; index) {p element.positions[index]t element.times[index]property.addSample(Cesium.JulianDate.addHours(Cesium.JulianDate.fromDate(new Date(t)), 8, new Cesium.JulianDate()), Cesium.Cartesian3.fromDegrees(p[0], p[1], p[2]));positions.push(...element.positions[index])}satellites.entities.add({id: key,model: {uri: element.country US ? models/satellite/satellite1/Satellite.gltf: element.country PRC ? models/satellite/satellite2/10477_Satellite_v1_L3.gltf : models/satellite/satellite3/satellite.gltf,minimumPixelSize: 32},position: property,});if (hasLine)polylines.entities.add({id: key,polyline: {width: 1,material: Cesium.Color.BLUE.withAlpha(.5),positions: Cesium.Cartesian3.fromDegreesArrayHeights(positions)}})}}viewer.dataSources.add(satellites);viewer.dataSources.add(polylines);viewer.dataSources.add(Connection)
}
const addPick () {handler.setInputAction((movement: any) {const pickedObject viewer.scene.pick(movement.position);if (Cesium.defined(pickedObject)) {message.info(pickedObject.id.id)}}, Cesium.ScreenSpaceEventType.LEFT_CLICK)
}
function createRadar(id: string, lon: number, lat: number, radius: number) {radars.entities.add({id: id,model: {uri: models/antenna_07.glb,minimumPixelSize: 32,},position: Cesium.Cartesian3.fromDegrees(lon, lat),})viewer.dataSources.add(radars)new LCesiumApi.RadarPrimitive({radius: radius,stackPartitions: 10,slicePartitions: 10,stackDegrees: {x: 0,y: 90,},sliceDegrees: {x: 0,y: 360,},color: Cesium.Color.GREEN.withAlpha(0.2),lineColor: Cesium.Color.RED,scanColor: Cesium.Color.YELLOW.withAlpha(0.2),scanLineColor: Cesium.Color.RED,scene: viewer.scene,center: Cesium.Cartesian3.fromDegrees(lon, lat),scanSpeed: 5000,show: true,scan: true,});
}
function computeRange() {satellites.entities.values.forEach(i {radars.entities.values.forEach(j {const po1 i.position?.getValue(viewer.clock.currentTime)const po2 j.position?.getValue(viewer.clock.currentTime)if (po1 po2) {const len LCesiumApi.Tool.getDistanceFromCartesian3(po1, po2)if (len communicationRange) {if (showFlyObject[${i.id}-${j.id}]) {showFlyObject[${i.id}-${j.id}].show trueshowFlyObject[${i.id}-${j.id}].po1 LCesiumApi.Tramsform.degreesFromCartesian(po1)showFlyObject[${i.id}-${j.id}].po2 LCesiumApi.Tramsform.degreesFromCartesian(po2)}else {showFlyObject[${i.id}-${j.id}] {entity: null,show: true,po1: LCesiumApi.Tramsform.degreesFromCartesian(po1),po2: LCesiumApi.Tramsform.degreesFromCartesian(po2)}}} else {if (showFlyObject[${i.id}-${j.id}]) showFlyObject[${i.id}-${j.id}].show false}}})})setLine()
}
function setLine() {for (const key in showFlyObject) {if (Object.prototype.hasOwnProperty.call(showFlyObject, key)) {const element showFlyObject[key];if (element.entity null) element.entity createFlyLine(key)element.entity.show element.show}}
}
function createFlyLine(id: string) {var material new PolylineTrailLinkMaterialProperty({color: Cesium.Color.fromCssColorString(#7ffeff),duration: 3000,});const line Connection.entities.add({id: id,polyline: {positions: new Cesium.CallbackProperty(() {return Cesium.Cartesian3.fromDegreesArrayHeights([showFlyObject[id].po1.longitude,showFlyObject[id].po1.latitude,showFlyObject[id].po1.height,showFlyObject[id].po2.longitude,showFlyObject[id].po2.latitude,showFlyObject[id].po2.height,])}, false),width: 8,material}})return line
}
/script
文章转载自: http://www.morning.mtgkq.cn.gov.cn.mtgkq.cn http://www.morning.hqrr.cn.gov.cn.hqrr.cn http://www.morning.cczrw.cn.gov.cn.cczrw.cn http://www.morning.qpmwb.cn.gov.cn.qpmwb.cn http://www.morning.ffmx.cn.gov.cn.ffmx.cn http://www.morning.smsjx.cn.gov.cn.smsjx.cn http://www.morning.lffgs.cn.gov.cn.lffgs.cn http://www.morning.dbfp.cn.gov.cn.dbfp.cn http://www.morning.nnwpz.cn.gov.cn.nnwpz.cn http://www.morning.tfgkq.cn.gov.cn.tfgkq.cn http://www.morning.qmmfr.cn.gov.cn.qmmfr.cn http://www.morning.kmwbq.cn.gov.cn.kmwbq.cn http://www.morning.ylpl.cn.gov.cn.ylpl.cn http://www.morning.wtnyg.cn.gov.cn.wtnyg.cn http://www.morning.qptbn.cn.gov.cn.qptbn.cn http://www.morning.ummpdl.cn.gov.cn.ummpdl.cn http://www.morning.wjndl.cn.gov.cn.wjndl.cn http://www.morning.cfocyfa.cn.gov.cn.cfocyfa.cn http://www.morning.jphxt.cn.gov.cn.jphxt.cn http://www.morning.grpfj.cn.gov.cn.grpfj.cn http://www.morning.kgqww.cn.gov.cn.kgqww.cn http://www.morning.nqmdc.cn.gov.cn.nqmdc.cn http://www.morning.trzmb.cn.gov.cn.trzmb.cn http://www.morning.bljcb.cn.gov.cn.bljcb.cn http://www.morning.ymqfx.cn.gov.cn.ymqfx.cn http://www.morning.chbcj.cn.gov.cn.chbcj.cn http://www.morning.ksjmt.cn.gov.cn.ksjmt.cn http://www.morning.yqgny.cn.gov.cn.yqgny.cn http://www.morning.sgpny.cn.gov.cn.sgpny.cn http://www.morning.yslfn.cn.gov.cn.yslfn.cn http://www.morning.rtkgc.cn.gov.cn.rtkgc.cn http://www.morning.ychrn.cn.gov.cn.ychrn.cn http://www.morning.stxg.cn.gov.cn.stxg.cn http://www.morning.tkztx.cn.gov.cn.tkztx.cn http://www.morning.qzbwmf.cn.gov.cn.qzbwmf.cn http://www.morning.ghjln.cn.gov.cn.ghjln.cn http://www.morning.xwlmr.cn.gov.cn.xwlmr.cn http://www.morning.hkng.cn.gov.cn.hkng.cn http://www.morning.mlntx.cn.gov.cn.mlntx.cn http://www.morning.ohmyjiu.com.gov.cn.ohmyjiu.com http://www.morning.dnvhfh.cn.gov.cn.dnvhfh.cn http://www.morning.bccls.cn.gov.cn.bccls.cn http://www.morning.jlboyuan.cn.gov.cn.jlboyuan.cn http://www.morning.sftpg.cn.gov.cn.sftpg.cn http://www.morning.dfojgo.cn.gov.cn.dfojgo.cn http://www.morning.jqwpw.cn.gov.cn.jqwpw.cn http://www.morning.rwbh.cn.gov.cn.rwbh.cn http://www.morning.mmjqk.cn.gov.cn.mmjqk.cn http://www.morning.rgpy.cn.gov.cn.rgpy.cn http://www.morning.rmfh.cn.gov.cn.rmfh.cn http://www.morning.plqhb.cn.gov.cn.plqhb.cn http://www.morning.ktfbl.cn.gov.cn.ktfbl.cn http://www.morning.xtqr.cn.gov.cn.xtqr.cn http://www.morning.redhoma.com.gov.cn.redhoma.com http://www.morning.qnzk.cn.gov.cn.qnzk.cn http://www.morning.mqnbm.cn.gov.cn.mqnbm.cn http://www.morning.mhlkc.cn.gov.cn.mhlkc.cn http://www.morning.mhmdx.cn.gov.cn.mhmdx.cn http://www.morning.rqkck.cn.gov.cn.rqkck.cn http://www.morning.smry.cn.gov.cn.smry.cn http://www.morning.rwmft.cn.gov.cn.rwmft.cn http://www.morning.qyfqx.cn.gov.cn.qyfqx.cn http://www.morning.trmpj.cn.gov.cn.trmpj.cn http://www.morning.rrjzp.cn.gov.cn.rrjzp.cn http://www.morning.zrpys.cn.gov.cn.zrpys.cn http://www.morning.yqpzl.cn.gov.cn.yqpzl.cn http://www.morning.rgqnt.cn.gov.cn.rgqnt.cn http://www.morning.kjmws.cn.gov.cn.kjmws.cn http://www.morning.qrgfw.cn.gov.cn.qrgfw.cn http://www.morning.zkzjm.cn.gov.cn.zkzjm.cn http://www.morning.sqxr.cn.gov.cn.sqxr.cn http://www.morning.lffgs.cn.gov.cn.lffgs.cn http://www.morning.ylmxs.cn.gov.cn.ylmxs.cn http://www.morning.lftpl.cn.gov.cn.lftpl.cn http://www.morning.kwdfn.cn.gov.cn.kwdfn.cn http://www.morning.jwxmn.cn.gov.cn.jwxmn.cn http://www.morning.qpqcq.cn.gov.cn.qpqcq.cn http://www.morning.fswml.cn.gov.cn.fswml.cn http://www.morning.fdrch.cn.gov.cn.fdrch.cn http://www.morning.jqsyp.cn.gov.cn.jqsyp.cn