导航卫星系统实时可视化平台开发

  • 卫星轨道计算
  • 数据的可视化展示

随着我国对北斗卫星导航系统的大力发展,北斗导航系统已经跻身国际四大导航系统之列。正好小编对导航系统的理论知识也有一定的掌握,这里从老牌的GPS卫星导航系统入手,做了一套导航卫星可视化系统(界面),给大家分享一下,先看下主界面。

主要技术分为两大块:
1)卫星轨道数据的获取计算
卫星轨道数据,是从BKG(https://igs.bkg.bund.de/)数据中心下载的rinex广播星历,通过卫星轨道计算算法公式得到外推坐标,最终生成CZML数据,在前端通过Cesium加载。这一块轨道计算基于Qt平台使用C++完成,封装成.so文件,供Java调用。
2)数据的可视化展示
数据可视化展示,后端采用的是springboot框架和postgresql数据库,前端使用Vue框架和Cesium三维地图引擎以及echart完成开发。整个服务部署在云服务器上。

卫星轨道计算

卫星数据从数据中心定时下载,然后在Qt平台下完成文件读取,数据解算,格式化输出等一系列处理。



数据的可视化展示

数据可视化后端使用的是springboot框架和postgresql数据库开发。前端主要使用Vue框架和Cesium三维地图引擎以及echart开发。后端主要包括使用quartz定时任务框架对卫星数据定时下载,调用Qt生成的动态链接库计算卫星外推坐标。采用rabbitmq消息中间件将计算的卫星外推坐标推送到前端。

定时任务

 /*** 在构造函数中创建调度器,加载任务**/public void init() throws SchedulerException {//1 创建调度器 必须从容器中拿,如果new的话,则无法注入,还是脱离了spring容器this.scheduler = schedulerFactoryBean.getScheduler();//2 创建JobDetail实例,并与PrintWordsJob类绑定(Job执行的内容)this.jobDetail = JobBuilder.newJob(ephDWJob.getClass()).withIdentity("ephJobDetailDataDownLoadIdentity", "ephJobDetailDataDownLoadIdentityGroup1").usingJobData("ephJobDetailDataDownLoadJobData", "ephJobDetailDataDownLoadValue").build();//3 构建触发trigger实例,每隔1s执行一次// 根据不同环境启用不同的任务策略String cronSchedule = "0 */10 * * * ?";switch (SpringUtil.getActiveProfiles()[0]){case "test":case "dev":cronSchedule = "31 42 * * * ?";break;case "prod":cronSchedule = "0 20 */2 * * ?";break;}this.cronTrigger = TriggerBuilder.newTrigger().withIdentity("ephTriggerDownLoadIdentity", "ephTriggerDownLoadIdentityGroup1").usingJobData("ephTriggerDownLoadJobData", "ephTriggerDownLoadDataValue")//.withSchedule(CronScheduleBuilder.cronSchedule("55 56 23 * * ?")) //每秒钟执行一次//.withSchedule(CronScheduleBuilder.cronSchedule("0 20 */2 * * ?")) //每两个小时的第20分钟0秒执行一次.withSchedule(CronScheduleBuilder.cronSchedule(cronSchedule)) //每5分钟的第0秒执行一次.build();this.triggerKey = TriggerKey.triggerKey("ephTriggerDownLoadIdentity", "ephTriggerDownLoadIdentityGroup1");this.jobKey = JobKey.jobKey("ephJobDetailDataDownLoadIdentity", "ephJobDetailDataDownLoadIdentityGroup1");}

消息推送

for(int i=0; i<czmlList.size(); i++){rabbitTemplate.convertAndSend("myOriDirectExchange","my.ori.direct.routing",czmlList.get(i));}rabbitTemplate.convertAndSend("myOriDirectExchange","my.ori.direct.routing","1");
}

JAVA调用Qt动态链接库

public interface CLibrary extends Library {CLibrary INSTANCE = (CLibrary) Native.loadLibrary("/opt/oriFolder/lib/libsatelliteEphSo.so",CLibrary.class);//获取最新的卫星列表 GPS, BD, Galileo, GLONASSString getSatelliteList(String ss);//对每一个系统的卫星做外推计算//32个String getGPSSatelliteInfoByPRN(int prn, int secondIndex);//61个String getBDSatelliteInfoByPrn(int prn, int secondIndex);//36个String getGalileoSatelliteInfoByPrn(int prn, int secondIndex);//24个String getGLONASSSatelliteInfoByPrn(int prn, int secondIndex);//分批将起始星历数据发送回来String getSateEphByPrnP1(int prn);String getSateEphByPrnP2(int prn);String getSateEphByPrnP3(int prn);String getSateEphByPrnP4(int prn);String getGPSSateEphByPRN(int prn);// 根据卫星类型和编号获取历元信息String getSatelliteEphByTypeAndPRN(String type, int prn, int flag);
}

前端使用stomp.js接收后端推送过来的数据,在Cesium中以CZML的形式加载。由于分享篇幅有限的原因,仅截出部分代码。

     cesiumInit(){window.viewer = new Cesium.Viewer("cesiumContent");this.flyHome();},flyHome(){window.viewer.camera.flyTo({destination: new Cesium.Cartesian3.fromDegrees(118, 30, 120000000),orientation:{heading:0,pitch: Cesium.Math.toRadians(-90),roll:0},duration: 6});},/**@description: websocket连接*/webSocketInit(){if (window.WebSocket) {console.log("您的浏览器支持websocket");var ws = new WebSocket(`ws://${this.websocketUrl}:${this.websocketPort}/ws`);this.client = this.$stomp.over(ws);this.client.heartbeat.incoming = 0;this.client.heartbeat.outgoing = 1 * 60 * 1000;this.client.debug = null;this.connect();}},/**@description: 连接 rabbitmq*/connect() {let headers = {login: this.websocketuser,passcode: this.websocketpassword,};this.client.connect(headers, this.on_connected, this.on_failed);},/**@description: 连接 rabbitmq 成功*/on_connected(){console.log(`websocket已连接: ${this.websocketUrl}:${this.websocketPort}`);this.client.subscribe("/queue/myOriDirectQueue", this.on_rabbitMQRevCallback, this.on_failed);},

至此,整个可视化界面完成。系统部署在 访问地址。欢迎大家访问。PS:本来想做一套完整的可视化系统,实现数据的回看、查询、卫星的跟踪,对地面的扫描,还有卫星模型想通过Three.js用代码生成,结果越做越跑偏了,仅做了这样的一个可视化界面。不过后续也将在此基础上着重在这几个方面继续开发,同时把北斗、格洛纳斯、伽利略导航系统都囊括进来。

有喜欢的朋友欢迎收藏点赞转发,有业务需求的朋友也欢迎私信我,web全栈开发。

导航卫星系统实时可视化平台开发相关推荐

  1. IntelliJ IDEA 使用 LiveEdit 插件实现实时可视化前端开发

    IntelliJ IDEA 使用 LiveEdit 插件实现实时可视化前端开发 之前因为公司很多都是C#后台项目,所以一直用的Visual Studio开发.而在VS里会自带实时刷新功能,即:在IDE ...

  2. 浅谈Web大数据可视化平台开发流程

    随着大数据时代的到来和数据分析技术的进步,物联网.云计算.手机.电脑以及各种传感器,无一不是数据来源或者承载的方式.微信.qq等社交平台的普及,让人们的情绪和喜好预测变成可能.在众多复杂的数据背后找到 ...

  3. 深入浅出 - Android系统移植与平台开发(十)- Android编译系统与定制Android平台系统(瘋耔修改篇二)...

    第四章.Android编译系统与定制Android平台系统 4.1Android编译系统 Android的源码由几十万个文件构成,这些文件之间有的相互依赖,有的又相互独立,它们按功能或类型又被放到不同 ...

  4. 深入浅出 - Android系统移植与平台开发(十)- Android编译系统与定制Android平台系统

    第四章.Android编译系统与定制Android平台系统 4.1Android编译系统 Android的源码由几十万个文件构成,这些文件之间有的相互依赖,有的又相互独立,它们按功能或类型又被放到不同 ...

  5. 深入浅出 - Android系统移植与平台开发(一)

    +-------------------------------------------------+ +      本系列为连载,不定期会更新       + +------------------ ...

  6. 深入浅出 - Android系统移植与平台开发(六)- 为Android启动加速【转】

    本文转载自:http://blog.csdn.net/mr_raptor/article/details/8006721 Android的启动速度一直以来是他的诟病,虽然现在Android设备的硬件速 ...

  7. 深入浅出 - Android系统移植与平台开发(二) - 准备Android开发环境

    编译Android源码 关于android系统的编译,Android的官方网站上也给出了详细的说明. http://source.android.com/source/building.html Ø  ...

  8. 深入浅出 - Android系统移植与平台开发(十三)- Android的对象管理

    第六章.Android的对象管理 在Java中,不再使用的对象会通过gc机制来自己主动回收.而Android系统执行时库层代码是由C++编写的,在C++中创建的对象通常使用指针来操作,一旦使用不当.轻 ...

  9. 深入浅出 - Android系统移植与平台开发(五)- 定制手机模拟器ROM

    作者:唐老师,华清远见嵌入式学院讲师. 一. 修改化定制Android4.0系统 Android系统启动时,先加载Linux内核,在Linux的framebuffer驱动里可以定制开机界面,Linux ...

  10. vue.js客服系统实时聊天项目开发(十八)仿淘宝商品页面点在线客服传递产品卡片...

    我们在使用淘宝的时候,在商品页面点击在线客服,跳转到客服聊天页以后,会浮动出当前产品信息,可以把产品信息发给客服 现在我们也实现了类似功能,可以带着产品信息进聊天页面 在访客聊天连接中,加入extra ...

最新文章

  1. Unity 4.x游戏开发技巧集锦第2章摄像机的应用
  2. LeetCode 36 有效的数独
  3. 通过调用API函数实现的无边框窗体的拖拽,比判断坐标更快捷
  4. 面向对象程序设计课程进度条
  5. 面向Java应用的快速Web服务支持工具 - Netrifex
  6. 开发工具:Git和SVN有哪些差异,看完你就懂了?
  7. 通过VirtualQuery获取当前模块的句柄
  8. extends 抽象方法_关于abstract抽象类的理解
  9. 【BZOJ3238】差异,后缀数组+单调栈维护height
  10. 一起学习MVC(4)-entity SQL语句
  11. 事业单位计算机常识PPT,计算机基础知识:PPT常用操作(六)
  12. 我的世界观【文津图书奖获奖作品】
  13. 复旦大学陈平博士:网络攻击猖獗,如何应对数据安全与内生安全挑战?
  14. [转载] OpenCV—利用回调函数实现返回鼠标点击位置的坐标和灰度值
  15. 哔哩哔哩作者页上的作品批量保存的方法
  16. 19行列式公式和代数余子式
  17. 树莓派-1、上手及资源
  18. CDATA 数据处理
  19. LNMP环境下QQ农场的搭建
  20. 50种认知偏差要注意,这样才能做最好的自己

热门文章

  1. XCOM Enemy Unknown
  2. 我国嵌入式技术及应用现状分析
  3. 2017小象学院Python数据分析与挖掘
  4. 学习java之java帝国的诞生
  5. 59.bouncing results
  6. 《彻底卸载chrome及注册表清理》
  7. js中关于0.1+0.1不等于0.2 ,而console.log(0.1)是0.1,面试01
  8. Android、iPhone和Java三个平台一致的加密方法
  9. 《团队领导力》培训笔记
  10. TCP-Drinc:Smart Congestion Control Based on Deep Reinforcement Learning笔记