当前位置: 首页 > news >正文

【Vue3】Cesium实现卫星及无人机轨迹跟踪

🌍开发思路

一张图看懂 Cesium 高频 API、组件方法与 Vue 集成要点


1️⃣ Cesium 核心 API

一句话描述高频用法
Cesium.Viewer3D 地球的「根容器」new Viewer('cesiumContainer', { terrain: Terrain.fromWorldTerrain(), shouldAnimate: true })
Cesium.JulianDate高精度时间计算JulianDate.fromIso8601('2025-08-25T12:00:00Z')
Cesium.CzmlDataSource载入动态场景(CZML)await CzmlDataSource.load('tracking.czml')
Cesium.Cartesian33D 笛卡尔坐标entity.viewFrom = new Cartesian3(x, y, z)
Cesium.TrackingReferenceFrame实体跟踪时的坐标框架可选:AUTODETECT / INERTIAL / VELOCITY / ENU
Cesium.Terrain全球地形数据管理Terrain.fromWorldTerrain()

2️⃣ 组件核心方法

方法职责关键步骤
initMap()初始化地球 + 载入 CZML① 创建 Viewer ② 设置时间范围 ③ 载入 tracking.czml ④ 缓存实体引用 ⑤ 设置 viewFrom
trackSatellite()进入卫星跟踪模式时钟停止时间、30× 倍速、缩放到卫星时间线、设置 viewer.trackedEntity
trackDrone()进入无人机跟踪模式同上,倍速改为 1×
updateTrackingReferenceFrame()动态切换跟踪框架根据下拉选项把 trackingReferenceFrame 赋给卫星/无人机

3️⃣ Vue 生命周期 & 状态管理

项目代码片段说明
响应式状态const trackingFrame = ref('autodetect')跟踪框架下拉框绑定
挂载onMounted(initMap)组件渲染后初始化地图
卸载onUnmounted(() => viewer?.destroy())释放 GPU & 内存

4️⃣ 实体级常用链式 API

// 1. 添加数据源
const ds = await viewer.dataSources.add(await CzmlDataSource.load('tracking.czml')
);// 2. 按 ID 取实体
const satellite = ds.entities.getById('Satellite');
const drone     = ds.entities.getById('Drone');// 3. 设置相机偏移
satellite.viewFrom = new Cesium.Cartesian3(-10_000, 0, 5_000);// 4. 控制时间系统
viewer.clock.stopTime    = Cesium.JulianDate.fromIso8601('2025-08-25T16:00:00Z');
viewer.clock.currentTime = Cesium.JulianDate.fromIso8601('2025-08-25T12:00:00Z');
viewer.clock.multiplier  = 30; // 30× 快进// 5. 缩放时间线
viewer.timeline.zoomTo(startTime, stopTime);// 6. 开始跟踪
viewer.trackedEntity = satellite; // 相机会自动跟随

🌍工程实现

工程创建及配置参考:【Vue3】Cesium加载glb格式3D模型-CSDN博客

🛰️准备 Cesium 轨迹文件

官方地址:https://github.com/CesiumGS/cesium/blob/main/Apps/SampleData/tracking.czml

下载后将文件存放到工程的src\assets\tracking.czml

🛰️编写核心代码

创建src\components\EntrityTracking.vue,代码如下

<template><divstyle="display: flex; flex-direction: column; width: 100vw; height: 100vh; margin: 0; padding: 0; overflow: hidden;"><div class="cesium" id="cesiumContainer" style="width: 100%; height: 100%;"></div><div style="position: absolute; top: 20px; left: 20px; z-index: 100; background: rgba(0, 0, 0, 0.7); padding: 10px; color: white;"><button @click="trackSatellite" style="margin-right: 10px; padding: 5px 10px; background: #4CAF50; color: white; border: none; cursor: pointer;">卫星</button><button @click="trackDrone" style="margin-right: 10px; padding: 5px 10px; background: #2196F3; color: white; border: none; cursor: pointer;">无人机</button><select v-model="trackingFrame" @change="updateTrackingReferenceFrame" style="padding: 5px;"><option value="autodetect">跟踪参考框架: 自动检测</option><option value="inertial">跟踪参考框架: 惯性</option><option value="velocity">跟踪参考框架: 速度</option><option value="enu">跟踪参考框架: 东北天</option></select></div></div>
</template><script setup>
import { onMounted, onUnmounted, ref } from "vue";
import * as Cesium from "cesium";let viewer = null;
let satellite = null;
let drone = null;
const trackingFrame = ref('autodetect');
let dataSource = null;// Cesium Ion 访问令牌
Cesium.Ion.defaultAccessToken = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiIxM2M4ZTg1Ni0zYWFkLTRhMzMtYTE4My05MmZjNmY2YjAxNWYiLCJpZCI6MzI0MzUyLCJpYXQiOjE3NTMyODExOTJ9.FTPTi9u7zGDoZNOEeUq7kQxGEN2sn9NQuxGEY5bZAcI';const initMap = async () => {viewer = new Cesium.Viewer('cesiumContainer', {terrain: Cesium.Terrain.fromWorldTerrain(),shouldAnimate: true});const startTime = Cesium.JulianDate.fromIso8601("2012-03-15T10:00:00Z");const satelliteStopTime = Cesium.JulianDate.fromIso8601("2012-03-16T10:00:00Z");const droneStopTime = Cesium.JulianDate.fromIso8601("2012-03-15T10:00:30Z");// 加载正确路径的 CZML 文件dataSource = await viewer.dataSources.add(Cesium.CzmlDataSource.load('/src/assets/tracking.czml'));satellite = dataSource.entities.getById("Satellite/ISS");drone = dataSource.entities.getById("CesiumDrone");// 设置视图偏移satellite.viewFrom = new Cesium.Cartesian3(-300, 20, 100);drone.viewFrom = new Cesium.Cartesian3(-50, 0, 5);
};// 跟踪卫星
const trackSatellite = () => {if (!viewer || !satellite) return;const startTime = Cesium.JulianDate.fromIso8601("2012-03-15T10:00:00Z");const satelliteStopTime = Cesium.JulianDate.fromIso8601("2012-03-16T10:00:00Z");viewer.clock.stopTime = satelliteStopTime;viewer.clock.currentTime = startTime;viewer.clock.multiplier = 30;viewer.timeline.zoomTo(startTime, satelliteStopTime);viewer.trackedEntity = satellite;
};// 跟踪无人机
const trackDrone = () => {if (!viewer || !drone) return;const startTime = Cesium.JulianDate.fromIso8601("2012-03-15T10:00:00Z");const droneStopTime = Cesium.JulianDate.fromIso8601("2012-03-15T10:00:30Z");viewer.clock.stopTime = droneStopTime;viewer.clock.currentTime = startTime;viewer.clock.multiplier = 1;viewer.timeline.zoomTo(startTime, droneStopTime);viewer.trackedEntity = drone;
};// 更新跟踪参考框架
const updateTrackingReferenceFrame = () => {if (!satellite || !drone) return;switch (trackingFrame.value) {case 'autodetect':satellite.trackingReferenceFrame = Cesium.TrackingReferenceFrame.AUTODETECT;drone.trackingReferenceFrame = Cesium.TrackingReferenceFrame.AUTODETECT;break;case 'inertial':satellite.trackingReferenceFrame = Cesium.TrackingReferenceFrame.INERTIAL;drone.trackingReferenceFrame = Cesium.TrackingReferenceFrame.INERTIAL;break;case 'velocity':satellite.trackingReferenceFrame = Cesium.TrackingReferenceFrame.VELOCITY;drone.trackingReferenceFrame = Cesium.TrackingReferenceFrame.VELOCITY;break;case 'enu':satellite.trackingReferenceFrame = Cesium.TrackingReferenceFrame.ENU;drone.trackingReferenceFrame = Cesium.TrackingReferenceFrame.ENU;break;}
};onMounted(() => {initMap();
});onUnmounted(() => {if (viewer) {viewer.destroy();}
});
</script>

官方参考:Cesium Sandcastle

http://www.dtcms.com/a/351005.html

相关文章:

  • 大模型入门实战 | 基于 YOLO 数据集微调 Qwen2.5-VL-3B-Instruct 的目标检测任务
  • 数字IC前端设计——DC综合篇(生成filelist.f)
  • ADB 安装教程:如何在 Windows、 Linux 上安装 Android Debug Bridge
  • Java数据结构速成【1】
  • 项目设计文档——爬虫项目(爬取天气预报)
  • Qt——界面美化 QSS
  • 无人机三维路径规划首选算法:RRT_
  • 基于大模型的智能占卜系统实战-Qwen-VL、RAG、FastAPI
  • 【算法--链表题1】2. 两数相加:通俗详解
  • Linux系统网络管理学习.2
  • Spring面试题及详细答案 125道(26-45) -- Spring AOP篇
  • PLC通讯中遇到的实际场景
  • 8.25作业
  • 管家婆工贸ERP BB116.销售订单选存货
  • 视觉语言模型(VLM)
  • 动态带宽扩展(DBE):下一代Wi-Fi性能提升的关键技术
  • 《计算机视觉度量:从特征描述到深度学习》-- 大模型特征提取到特征检索
  • 身份管理与安全 (Protect identities)
  • 一文丝滑使用Markdown:从写作、绘图到转换为Word与PPT
  • HIDL的Car Audio架构简单梳理
  • Spark 节点 IDO 正式开启 —引领 PayFi 新时代
  • 解析蛋白质三维结构-Bio3D R包
  • Elasticsearch精准匹配与全文检索对比
  • 矩阵微积分的链式法则(chain rule)
  • 一步一步在Kubernetes集群部署NVIDIA KAI Scheduler
  • 数据挖掘 7.1~7.4 Clustering聚类
  • Spark云原生流处理实战与风控应用
  • 【贪心】11 盛最多水的容器(双指针解法)
  • 解决Windows更新后WPF程序报TypeLoadException异常的问题
  • 论文Review 激光3DGS GS-SDF | IROS2025 港大-MARS!| 激光+3DGS+NeRF会得到更好的几何一致性和渲染结果!?