三維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
英文地址,請注明出處:http://en.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的…