三维GIS开发实战!Cesium + CZML 实现火箭飞行与分离的 3D 动态模拟

CZML是一种基于JSON的数据格式,专门用于在Cesium中描述3D场景和时间动态数据。

本文将详细介绍了CZML的特点(JSON格式、时间动态性、层次结构等)和基本组件,并给出了一个火箭发射的实例。通过搭建Cesium开发环境(使用vite)、配置vite插件、加载CZML数据源(space.czml)并设置相机跟踪,实现了火箭从起飞到降落的完整动画效果。最后还提供了保持相机跟踪火箭位置的关键代码实现。

前置知识点

知识点:CZML数据格式

CZML(Cesium Language)是一种用于描述3D场景和时间动态的数据格式,最初由Cesium开发团队创建,用于在Cesium JavaScript库中呈现虚拟地球和其他三维地理空间数据。它通常用于创建可视化地球表面上的物体、飞行轨迹、传感器信息等。

CZML数据拥有以下特点:

  1. JSON格式:CZML数据以JSON格式编写,这使得它易于创建和解析,JSON是一种轻量级的数据交换格式,易于人类阅读和编写,同时也易于机器解析和生成。

  2. 时间动态性:CZML支持时间动态性,允许您描述物体随时间变化的属性。这使得您可以创建动态的3D场景,例如模拟飞行轨迹、天体运动等。

  3. 基本组件:CZML包含了一系列基本的组件来描述场景中的对象。这些组件包括点、线、多边形、模型等。

  4. 层次结构:CZML允许您以层次结构的方式组织场景中的对象,例如可以创建父对象和子对象,这样可以更好地管理和组织复杂的场景。

  5. 事件:CZML允许您指定事件,例如单击事件、鼠标悬停事件等,这使得您可以创建与场景交互的用户体验。

  6. 插件支持:CZML可以与Cesium JavaScript库的插件集成,从而扩展其功能,例如添加地形、天气数据等。

CZML数据示例

关于czml数据规范,可以查看官方文档:

https://github.com/AnalyticalGraphicsInc/czml-writer/wiki/CZML-Structure

CZML数据是一个数组,可以看到,数组中的每一项其实都是一个实体对象的描述,这种对象,成为一个包:CZML

  • id:固定值

  • name:可自定义设置值

  • version:CZML版本,CZL目前只有1.0版本,固定值

完整的CZML至少包合两个packet,第一个用于标识CZML,第二个packet对应一个场景中的对象,例如一个盒子。

可以看到,box中的属性和Cesium实体中boxGraphic的属性是一致的

box.czml

{"document": {"id": "document","name": "box","version": "1.0"},"shape1": {"id": "shape1","name": "Blue box","position": {"cartographicDegrees": [-114.0,40.0,300000.0]},"box": {"dimensions": {"cartesian": [400000.0,300000.0,500000.0]},"material": {"solidColor": {"color": {"rgba": [0,0,255,255]}}}}}
}

所以这里我们就知道Cesium是如何实现火箭起飞到分体到降落的过程了,通过加载czml数据,可以快速的实现这个效果

使用到的火箭升空数据源----数据来源(火星科技)

space.czml

实现全过程

首先搭建Cesium开发环境

新建一个cesium_basic的目录,并初始化

npm init -y

安装cesium与vite的cesium插件,本教程使用的版本为1.97

npm i cesium@1.97 vite-plugin-cesium

安装vite

vite是开箱即用的下一代打包工具, 原生支持模块化开发

相比于webpackRollupParcel更快, 更好用

将vite安装成开发时依赖, 使用vite启动开发服务

"vite": "^5.4.9"
npm i vite -D

配置vite.config.js,主要是配置cesium插件,这样才能正常引入cesium

import { defineConfig } from'vite';
import cesium from'vite-plugin-cesium';
// https://vitejs.dev/config/
export defaultdefineConfig({plugins: [cesium()]
});

创建入口文件index.html, 在入口文件中引入

  • 初始化样式reset.css

  • 主入口文件main.js

  • 编辑package.json脚本脚本,使用vite会自动编辑index.html

  • 启动开发服务

ndex.html

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta http-equiv="X-UA-Compatible" content="IE=edge" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Document</title><!-- 引入初始化样式 --><link rel="stylesheet" href="./src/assets/styles/reset.css" /></head><body><div id="cesiumContainer"></div><!-- 使用模块化方式引入入口文件 --><script src="./src/main.js" type="module"></script></body>
</html>
功能说明
  • 该代码为Cesium.js等WebGL库的基础HTML模板
  • reset.css用于清除浏览器默认样式
  • cesiumContainer作为三维渲染的DOM容器
  • 模块化引入的main.js为应用入口文件

reset.css

* {margin: 0;padding: 0;box-sizing: border-box;
}body {background-color: skyblue;overflow: hidden;
}#cesiumContainer {width: 100vw;height: 100vh;position: relative;
}
代码说明
  • box-sizing: border-box 确保元素尺寸计算包含边框和内边距
  • overflow: hidden 防止页面出现滚动条
  • position: relative 为容器内的绝对定位元素建立定位上下文
功能增强
  • 添加了视口单位(vw/vh)确保容器始终填满屏幕
  • 重置了所有元素的盒模型计算方式
  • 优化了背景色显示效果

main.js

import * as Cesium from "cesium";// 注册token
Cesium.Ion.defaultAccessToken = "xxx";// 使用cesium默认配置初始化viewer
const viewer = new Cesium.Viewer("cesiumContainer");
代码功能说明
  1. 导入模块
    import * as Cesium from "cesium" 将整个 Cesium 库导入,并通过 Cesium 对象访问其功能。

  2. 设置访问令牌
    Cesium.Ion.defaultAccessToken = "xxx" 用于设置 Cesium Ion 的访问令牌,替换 "xxx" 为实际令牌字符串。

  3. 初始化 Viewer
    const viewer = new Cesium.Viewer("cesiumContainer") 创建一个 Cesium 地图实例,绑定到 HTML 中 ID 为 "cesiumContainer" 的元素。

package.json

{"scripts": {"dev": "vite","build": "vite build","preview": "vite preview"}
}
功能说明
  • dev 命令启动开发服务器,支持热模块替换(HMR)
  • build 命令执行生产环境构建
  • preview 命令本地预览生产构建结果

然后开启终端运行项目

terminal

npm run dev

这样你可以看到一个椭球

image.png

然后设置一下viewer,将不需要的控件隐藏起来,并去Cesium ion注册一个token(具体流程可以自行百度),然后将token写入到Cesium.Ion.defaultAccessToken上。

这里需要注意将shouldAnimate设置为true,这样才会有动画效果

import * as Cesium from "cesium";
import * as dat from "dat.gui";const gui = new dat.GUI();
Cesium.Ion.defaultAccessToken = import.meta.env.VITE_CESIUM_TOKEN;// 使用cesium默认配置初始化viewer
const viewer = new Cesium.Viewer("cesiumContainer", {timeline: true,              // 设置默认的时间轴不显示animation: false,            // 隐藏动画控件baseLayerPicker: false,      // 隐藏底图切换geocoder: false,             // 隐藏导航功能homeButton: false,           // 复位按钮sceneModePicker: false,      // 二三维切换按钮navigationHelpButton: false, // 隐藏帮助按钮scene3DOnly: true,          // 如果是三维的系统,最好加上这个配置shouldAnimate: true         // 最好设置动画为true,这样火箭才能有动画效果
});
代码说明
  • 代码格式已调整为标准的JavaScript语法,包含适当的缩进和换行
  • 注释保持原样,但增加了与代码的对齐
  • 配置项使用一致的缩进方式,便于阅读
  • 对象字面量的属性使用逗号分隔,最后一个属性不加逗号(符合ESLint推荐风格)
  • 保留了原有的功能实现,未做逻辑修改

接着调用Cesium中加载Czml数据的方法,将space.czml接入,就可以让火箭起飞了,在加载完成的回调函数中,还可以调用viewer.trackedEntity,让相机一直锁定火箭的位置

// CZML 是 Cesium 的数据源格式,用于快速加载动态实体场景
new Cesium.CzmlDataSource().load('/src/assets/dataSource/space.czml').then(dataSource => {// 添加数据源到场景viewer.dataSources.add(dataSource);// 自动缩放到数据源范围viewer.zoomTo(dataSource);// 设置相机跟踪数据源中的第二个实体(索引为1)viewer.trackedEntity = dataSource.entities.values[1];});
代码说明
  • CZML 加载:通过 CzmlDataSource.load() 方法异步加载指定的 CZML 文件(路径为 /src/assets/dataSource/space.czml)。
  • 数据源处理:加载完成后,将数据源添加到 viewer 的 dataSources 集合中,并通过 zoomTo 自动调整视角至数据范围。
  • 实体跟踪:将相机的跟踪目标设为数据源中的第二个实体(values[1]),通常用于跟踪动态对象如火箭。
注意事项
  • 确保 Cesium 库已正确引入,且 viewer 为有效的 Cesium.Viewer 实例。
  • CZML 文件路径需根据实际项目结构调整。
  • 实体索引(如 values[1])需根据具体 CZML 内容确认,通常索引 0 为文档定义,实体从索引 1 开始。

该系列持续更新,手把手教你玩转GIS开发!

一键关注不迷路👇👇

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/96641.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/96641.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Boot 深入剖析:BootstrapRegistry 与 BeanDefinitionRegistry 的对比

在 Spring Boot 的启动过程中&#xff0c;BootstrapRegistry 和 BeanDefinitionRegistry 是两个名为“Registry”却扮演着截然不同角色的核心接口。理解它们的差异是深入掌握 Spring Boot 启动机制和进行高级定制开发的关键。BootstrapRegistry public static ConfigurableAppl…

贪心算法应用:速率单调调度(RMS)问题详解

Java中的贪心算法应用&#xff1a;速率单调调度(RMS)问题详解 1. 速率单调调度(RMS)概述 速率单调调度(Rate Monotonic Scheduling, RMS)是一种广泛应用于实时系统中的静态优先级调度算法&#xff0c;属于贪心算法在任务调度领域的经典应用。 1.1 基本概念 RMS基于以下原则&…

Cesium4--地形(OSGB到3DTiles)

1 OSBG OSGB&#xff08;OpenSceneGraph Binary&#xff09;是基于 OpenSceneGraph&#xff08;OSG&#xff09; 三维渲染引擎的二进制三维场景数据格式&#xff0c;广泛用于存储和传输倾斜摄影测量、BIM、点云等大规模三维模型&#xff0c;尤其在国产地理信息与智慧城市项目中…

多语言共享贩卖机投资理财共享售卖机投资理财系统

多语言共享贩卖机投资理财/共享售卖机分红/充电宝/充电桩投资理财系统 采用thinkphp内核开发&#xff0c;支持注册赠金、多级分销&#xff0c;功能很基础 修复后台用户列表管理 可自定义理财商品 多种语言还可以添加任意语言 源码开源 多级分销 注册赠金等

[Windows] PDF 专业压缩工具 v3.0

[Windows] PDF 专业压缩工具 v3.0 链接&#xff1a;https://pan.xunlei.com/s/VOZwtC_5lCF-UF6gkoHuxWMoA1?pwdchg8# PDF 压缩工具 3.0 新版功能特点 - 不受页数限制&#xff01; 一、核心压缩功能 1.多模式智能压缩 支持 4 种压缩模式&#xff1a;平衡模式&#xff08…

SHEIN 希音 2026 校招 内推 查进度

SHEIN 希音 2026 校招 内推 查进度 &#x1f3e2;公司名称&#xff1a;SHEIN 希音 &#x1f4bb;招聘岗位&#xff1a;前端、后端、测试、产品、安全、运维、APP 研发、数据分析、设计师、买手、企划、招商、管培生 &#x1f31f;内推码&#xff1a;NTA2SdK &#x1f4b0;福利待…

ARM (6) - I.MX6ULL 汇编点灯迁移至 C 语言 + SDK 移植与 BSP 工程搭建

回顾一、核心关键字&#xff1a;volatile1.1 作用告诉编译器&#xff1a;被修饰的变量会被 “意外修改”&#xff08;如硬件寄存器的值可能被外设自动更新&#xff09;&#xff0c;禁止编译器对该变量进行优化&#xff08;如缓存到寄存器、删除未显式修改的代码&#xff09;。本…

Vue中使用keep-alive实现页面前进刷新、后退缓存的完整方案

Vue中使用keep-alive实现页面前进刷新、后退缓存的完整方案 在Vue单页应用中&#xff0c;路由切换时组件默认会经历完整的销毁-重建流程&#xff0c;这会导致两个典型问题&#xff1a;从搜索页跳转到列表页需要重新加载数据&#xff0c;而从详情页返回列表页又希望保留滚动位置…

Visual Studio Code 安装与更新故障排除:从“拒绝访问”到成功恢复

Visual Studio Code 安装与更新故障排除&#xff1a;从“拒绝访问”到成功恢复的实践分析 摘要&#xff1a; 本文旨在探讨 Visual Studio Code (VS Code) 在安装与更新过程中常见的故障&#xff0c;特别是涉及“拒绝访问”错误、文件缺失以及快捷方式和任务栏图标异常等问题。…

简单UDP网络程序

目录 UDP网络程序服务端 封装 UdpSocket 服务端创建套接字 服务端绑定 运行服务器 UDP网络程序客户端 客户端创建套接字 客户端绑定 运行客户端 通过上篇文章的学习&#xff0c;我们已经对网络套接字有了一定的了解。在本篇文章中&#xff0c;我们将基于之前掌握的知识…

如何解决 pip install 安装报错 ModuleNotFoundError: No module named ‘requests’ 问题

Python系列Bug修复PyCharm控制台pip install报错&#xff1a;如何解决 pip install 安装报错 ModuleNotFoundError: No module named ‘requests’ 问题 摘要 在日常Python开发过程中&#xff0c;pip install 是我们最常用的依赖安装命令之一。然而很多开发者在 PyCharm 控制台…

解释 ICT, Web2.0, Web3.0 这些术语的中文含义

要理解“ICT Web2.0”术语的中文含义&#xff0c;需先拆解为 ICT 和 Web2.0 两个核心概念分别解析&#xff0c;再结合二者的关联明确整体指向&#xff1a; 1. 核心术语拆解&#xff1a;中文含义与核心定义 &#xff08;1&#xff09;ICT&#xff1a;信息与通信技术 中文全称&am…

IDEA版本控制管理之使用Gitee

使用Gitee如果之前没用过Gitee&#xff0c;那么IDEA中应该长这样&#xff08;第一次使用&#xff09;如果之前使用过Gitee&#xff0c;那么IDEA中应该长这样这种情况&#xff0c;可以先退出Gitee&#xff0c;再拉取Gitee&#xff0c;退出Gitee方法见文章底部好&#xff0c;那么…

NLP(自然语言处理, Natural Language Processing)

让计算机能够理解、解释、操纵和生成人类语言&#xff0c;从而执行有价值的任务。 关注社区&#xff1a;Hugging Face、Papers With Code、GitHub 是现代NLP学习不可或缺的资源。许多最新模型和代码都在这里开源。 ①、安装库 pip install numpy pandas matplotlib nltk scikit…

后端json数据反序列化枚举类型不匹配的错误

后端json数据反序列化枚举类型不匹配的错误后端返回的json格式在前端反序列化报错System.Text.Json.JsonException:“The JSON value could not be converted to TodoReminderApp.Models.Priorityen. Path: $.Data.Items.$values[0].Priority | LineNumber: 0 | BytePositionIn…

市面上主流接口测试工具对比

公司计划系统的开展接口自动化测试&#xff0c;需要我这边调研一下主流的接口测试框架给后端测试&#xff08;主要测试接口&#xff09;的同事介绍一下每个框架的特定和使用方式。后端同事根据他们接口的特点提出一下需求&#xff0c;看哪个框架更适合我们。 2025最新Jmeter接口…

2025.2.4 更新 AI绘画秋葉aaaki整合包 Stable Diffusion整合包v4.10 +ComfyUI 整合包下载地址

2025.2.4 更新 AI绘画秋葉aaaki整合包 Stable Diffusion整合包v4.10 ComfyUI 整合包下载地址Stable Diffusion整合包【下载链接】ComfyUI整合包【下载链接】【报错解决】Stable Diffusion整合包 【下载链接】 下载地址 https://uwtxfkm78ne.feishu.cn/wiki/GHgVwA2LPiE9x2kj4W…

Nginx优化与 SSL/TLS配置

1、隐藏版本号可以使用Fiddler工具抓取数据包&#xff0c;查看Nginx版本&#xff0c;也可以在CentOS中使用命令curl -I http://192.168.10.23 显示响应报文首部信息。方法一&#xff1a;方法一&#xff1a;修改配置文件方式 vim /usr/local/nginx/conf/nginx.conf http {includ…

JavaWeb05

一、Listener监听器1、简介Listener是Servlet规范中的一员在Servlet中&#xff0c;所有的监听器接口都是以Listener结尾监听器实际上是Servlet规范留给JavaWeb程序员的一些特殊时机当在某些时机需要执行一段Java代码时&#xff0c;可以用对应的监听器2、常用的监听器接口&#…

科普:在Windows个人电脑上使用Docker的极简指南

在Windows个人电脑上使用Docker的极简指南&#xff1a; 1. 快速安装 下载安装包&#xff08;若进不了官网&#xff0c;则可能要科学上网&#xff09; 访问Docker Desktop官方下载页 访问Docker官网 选择Windows及&#xff08;AMD64 也称为 x86-64&#xff0c;是目前主流 PC的…