Cesium.js(SuperMap iClient3D for Cesium)进行三维场景展示和图层动画

1):参考API文档:SuperMap iClient3D for Cesium 开发指南

2):官网示例:support.supermap.com.cn:8090/webgl/Cesium/examples/webgl/examples.html#layer

3):SuperMap iServer:欢迎使用 SuperMap iServer 11i(2022) (supermapol.com)

1.HTML部分

<head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1"><meta name="viewport"content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no"><title>图层动画</title><link href="../../Build/Cesium/Widgets/widgets.css" rel="stylesheet"><link href="./css/pretty.css" rel="stylesheet"><script src="./js/jquery.min.js"></script><script src="./js/config.js"></script><script type="text/javascript" src="../../Build/Cesium/Cesium.js"></script>
</head>
<body><div id="cesiumContainer"></div><div id='loadingbar' class="spinner"><div class="spinner-container container1">...</div><div class="spinner-container container2">...</div><div class="spinner-container container3">...</div></div><div id="toolbar" class="param-container tool-bar"><button type="button" id="start" class="button black">动画开始</button></div>
  • link 标签: 引入了 Cesium 的样式表 (widgets.css) 和自定义的样式表 (pretty.css) 以美化界面。

  • script 标签: 通过 jQuery、项目配置文件 (config.js)、Cesium 库 (Cesium.js) 来加载 JavaScript 功能。 config.js 很可能包含 API 密钥和场景相关的配置。

  • cesiumContainer: 这是 Cesium 三维地球容器,Cesium.js 会将 3D 场景渲染到这个 div 中。

  • loadingbar: 页面加载时的旋转加载动画,用户等待场景加载时显示,加载完后会被移除。

  • toolbar: 工具栏,包含一个按钮 “动画开始”,用户点击后会启动图层动画。

2.JS部分

var viewer = "";
function onload(Cesium) {viewer = new Cesium.Viewer('cesiumContainer');
  • viewer: 全局变量,用来存储 Cesium 的 Viewer 实例,它是 Cesium 应用的核心,用于管理和渲染 3D 场景。

  • Cesium.Viewer: 通过创建 Viewer 实例,将 Cesium 场景附加到 cesiumContainer 上。

3.场景和视角设置

scene.camera.setView({destination: new Cesium.Cartesian3( -2179784.959673108, 4380066.04070574, 4092037.131416261),orientation: {heading: 3.1380738694592583,pitch: -0.2798725811830971,roll: 6.283185307179586}
});

4.图层加载

var promise = scene.open(URL_CONFIG.SCENE_ANIMATION);
var layerName = ["第一层", "第二层", "第三层", "设备", "第四层", "墙01@Model - 副本", "屋顶@Model - 副本"];
var layerIndex = [0, 1, 2, 3, 4, 5, 6];
  • 使用 scene.open 打开一个包含动画的场景文件,场景文件地址从 config.js 中读取。

  • layerName 是一个包含图层名称的数组,layerIndex 是图层的索引数组,用于后续的图层动画。

5.动画

$("#start").click(function () {viewer.camera.speedRatio = 0.25;var viewCenter = new Cesium.Cartesian3(-2179804.7971194154, 4380105.068829024, 4091940.5042720092);				setAnimation(sequenceLayers, index);viewer.camera.flyCircle(viewCenter);					
});
  • 点击 "动画开始" 按钮后,相机会围绕 viewCenter 坐标进行循环飞行,同时调用 setAnimation 函数启动图层动画。

  • speedRatio 用于调整相机的旋转速度。

6.图层动画函数

function setAnimation(layers, index) {layers[index].visible = true;return layers[index].setAnimation({keyframes: {'100%': {translation: Cesium.Cartesian3.fromDegrees(layers[index].lon, layers[index].lat, 0)},'0%': {translation: Cesium.Cartesian3.fromDegrees(layers[index].lon, layers[index].lat, 50)}},duration: 2.0}).then(function () {if ((index + 1) >= animationAllLayer.length) {return;}return setAnimation(animationAllLayer, index + 1);})
}
  • setAnimation 函数通过 setAnimation 方法为图层设置关键帧动画,图层在 2 秒内从 50 米高处下降到地面。

  • 动画完成后,递归调用 setAnimation,以顺序播放多个图层的动画。

7.代码展示

<body><div id="cesiumContainer"></div><div id='loadingbar' class="spinner"><div class="spinner-container container1"><div class="circle1"></div><div class="circle2"></div><div class="circle3"></div><div class="circle4"></div></div><div class="spinner-container container2"><div class="circle1"></div><div class="circle2"></div><div class="circle3"></div><div class="circle4"></div></div><div class="spinner-container container3"><div class="circle1"></div><div class="circle2"></div><div class="circle3"></div><div class="circle4"></div></div></div><div id="toolbar" class="param-container tool-bar"><button type="button" id="start" class="button black">动画开始</button></div><script>var viewer = "";function onload(Cesium) {viewer = new Cesium.Viewer('cesiumContainer');viewer.imageryLayers.addImageryProvider(new Cesium.BingMapsImageryProvider({url: 'https://dev.virtualearth.net',mapStyle: Cesium.BingMapsStyle.AERIAL,key: URL_CONFIG.BING_MAP_KEY}));var scene = viewer.scene;viewer.scene.globe.show = false;scene.debugShowFramesPerSecond = true;scene.hdrEnabled = false;scene.sun.show = true;viewer.scene.postProcessStages.mxaa = false;viewer.scene.postProcessStages.fxaa.enabled = true;scene.lightSource.ambientLightColor = new Cesium.Color(0.65, 0.65, 0.65, 1);var promise = scene.open(URL_CONFIG.SCENE_ANIMATION);var animationLayer = [];var sequenceLayers = [];var layerName = ["第一层", "第二层", "第三层", "设备", "第四层", "墙01@Model - 副本", "屋顶@Model - 副本"];var layerIndex = [0, 1, 2, 3, 4, 5, 6]; //索引数组var scratchWindowPosition = new Cesium.Cartesian2();Cesium.when(promise, function (layers) {//相机定位scene.camera.setView({destination: new Cesium.Cartesian3( -2179784.959673108, 4380066.04070574, 4092037.131416261),orientation: {heading: 3.1380738694592583,pitch: -0.2798725811830971,roll: 6.283185307179586}});for (var i = 0; i < layers.length; i++) {layers[i].visible = false;}for (var j = 0; j < layerName.length; j++) {var layer = scene.layers.find(layerName[j]);animationLayer.push(layer);}for (var i = 0; i < animationLayer.length; i++) {sequenceLayers[layerIndex[i]] = animationLayer[i];}var index = 0;$("#start").click(function () {// viewer.scene.camera.flyCircleLoop = true; //是否循环旋转viewer.camera.speedRatio = 0.25;//旋转点var viewCenter =  new Cesium.Cartesian3(-2179804.7971194154, 4380105.068829024, 4091940.5042720092);				setAnimation(sequenceLayers, index);viewer.camera.flyCircle(viewCenter);					});$('#loadingbar').remove();});var animationAllLayer;function setAnimation(layers, index) {animationAllLayer = layers;layers[index].visible = true;				return layers[index].setAnimation({				keyframes: {'100%': {translation: Cesium.Cartesian3.fromDegrees(layers[index].lon, layers[index].lat, 0)},'0%': {translation: Cesium.Cartesian3.fromDegrees(layers[index].lon, layers[index].lat, 50),}},duration: 2.0}).then(function () {if ((index + 1) >= animationAllLayer.length) {return;}return setAnimation(animationAllLayer, index + 1);})}}if (typeof Cesium !== 'undefined') {window.startupCalled = true;onload(Cesium);}</script>
</body>

8.效果展示

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

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

相关文章

电鳗带来灵感,防潮电源诞生,全打印技术的魅力

大家好&#xff01;今天来了解一项受电鳗启发的防潮完全可打印电源的研究——《A moisture-enabled fully printable power source inspired by electric eels》发表于《PNAS》。随着可穿戴电子设备的发展&#xff0c;对安全、一次性且具成本效益的电源需求大增。传统电池存在不…

LibreOffice SDK是LibreOffice软件的开发工具包

LibreOffice SDK是LibreOffice软件的开发工具包&#xff0c;它提供了一系列工具和库&#xff0c;使得开发者可以基于LibreOffice进行扩展或开发新的应用程序。以下是对LibreOffice SDK的详细介绍&#xff1a; 一、下载与安装 下载地址&#xff1a; 可以在LibreOffice的官方网站…

利用 Llama 3.1模型 + Dify开源LLM应用开发平台,在你的Windows环境中搭建一套AI工作流

文章目录 1. 什么是Ollama&#xff1f;2. 什么是Dify&#xff1f;3. 下载Ollama4. 安装Ollama5. Ollama Model library模型库6. 本地部署Llama 3.1模型7. 安装Docker Desktop8. 使用Docker-Compose部署Dify9. 注册Dify账号10. 集成本地部署的 Llama 3.1模型11. 集成智谱AI大模型…

RUM性能优化之图片加载

作者&#xff1a;三石 在现代Web开发中&#xff0c;图片作为内容表达的核心元素&#xff0c;其加载效率直接影响到页面的整体性能和用户体验。随着高清大图和动态图像的普及&#xff0c;优化图片加载变得尤为重要。RUM作为一种主动监测技术&#xff0c;能够帮助开发者从真实用户…

【CubeMLP】核心方法解读

abstract&#xff1a; 多模态情绪分析和抑郁估计是利用多模态数据预测人类心理状态的两个重要研究课题。以前的研究主要集中在开发有效的融合策略&#xff0c;以交换和整合来自不同模式的心智相关信息。一些基于mlp的技术最近在各种计算机视觉任务中取得了相当大的成功。受此启…

如何解决 Vim 中的 “E212: Can‘t open file for writing“ 错误:从编辑到权限管理(sudo)

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…

C语言 | Leetcode C语言题解之第468题验证IP地址

题目&#xff1a; 题解&#xff1a; char * validIPAddress(char * queryIP) {int len strlen(queryIP);if (strchr(queryIP, .)) {// IPv4int last -1;for (int i 0; i < 4; i) {int cur -1;if (i 3) {cur len;} else {char * p strchr(queryIP last 1, .);if (p…

在Leaflet中使用divIcon进行自定义标绘实战

前言 之前在一些地理信息和旅游博主的信息介绍中&#xff0c;对于一些景点的信息时空分布。总是被他们的地图制作所深深吸引。与常规的地图文字标绘不同的是&#xff0c;在传统的地图标绘中&#xff0c;我们习惯于将文字信息直接标注到对应的位置点旁边。当然&#xff0c;这样其…

电脑快速切换IP地址命令是什么?详解与实践

有时&#xff0c;出于安全考虑或测试需要&#xff0c;我们可能需要快速切换电脑的IP地址。虽然这一过程在初学者看来可能略显复杂&#xff0c;但通过简单的命令和步骤&#xff0c; 即使是普通用户也能轻松实现。本文将详细介绍在Windows系统中快速切换IP地址的几种方法&#xf…

基于Jenkins+K8S构建DevOps自动化运维管理平台

目录 1.k8s助力DevOps在企业落地实践 1.1 传统方式部署项目为什么发布慢&#xff0c;效率低&#xff1f; 1.2 上线一个功能&#xff0c;有多少时间被浪费了&#xff1f; 1.3 如何解决发布慢&#xff0c;效率低的问题呢&#xff1f; 1.5 什么是DevOps&#xff1f; 1.5.1 敏…

潜水打捞系统助力,破解汽车打捞难题

随着人类活动的不断扩展&#xff0c;汽车落水事故频发&#xff0c;成为救援工作中的一大难题。汽车因其重量和结构特性&#xff0c;一旦沉入水体&#xff0c;打捞工作将面临巨大挑战。传统的打捞方法往往效率低下&#xff0c;且在操作过程中可能会对汽车造成进一步的损害&#…

Windows 下纯手工打造 QT 开发环境

用过 QtCreator 和 VS QT 插件&#xff0c;都觉得不是很理想。所以有了这个想法。 手工打造的 QT 的开发环境&#xff0c;是不需要安装上面两个程序的。 1、下载 vcpkg&#xff0c;编译 QT6 下载地址&#xff1a;https://github.com/microsoft/vcpkg.git 进入到 …

comfyui提示没有anything everywhere节点

错误信息说明 在使用comfyUI导入工作流的时候&#xff0c;提示没有Anything Everywhere节点 解决办法 进入到ComfyUI的custom_nodes目录下&#xff0c;执行以下命令 git clone https://github.com/chrisgoringe/cg-use-everywhere.git重启ComfyUI即可

顶会论文复现:PROVING TEST SET CONTAMINATION IN BLACK BOX LANGUAGE MODELS

文章目录 1 资料2 我的总结3 复现源码首先你需要有gpt的api接口安装&#xff1a;数据集执行指令源码 4 结果 1 资料 我复现的源码:https://github.com/Whiffe/test_set_contamination 官网源码&#xff1a;https://github.com/tatsu-lab/test_set_contamination 论文&#x…

禁用微软的windos安全中心

目录 一、为什么禁用 二、WDControl_1.5.0程序禁用windows安全中心 步骤1--- 步骤2--- 三、禁用widows安全中心成功 一、为什么禁用 描述&#xff1a;下载第三方软件常常会收到病毒防护秒杀&#xff0c; 第1---直接无法下载 第2---提前下载在U盘解压会被干掉程序文件 …

Spark第一天

MapReduce过程复习 Spark由五部分组成 RDD五大特征 1、 Spark -- 代替MapReduce <<<<< scala是单机的&#xff0c;spark是分布式的。>>>>> 开源的分布式计算引擎 可以快速做计算 -- 因为可以利用内存来做一些计算 (1) 分为5个库(模块) : 1、…

【hot100-java】排序链表

链表题。 使用归并排序法。 一图解决。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* ListNode(int val, ListNode next) { this.val val; thi…

网络安全之XXE攻击

0x01 什么是 XXE 个人认为&#xff0c;XXE 可以归结为一句话&#xff1a;构造恶意 DTD 介绍 XXE 之前&#xff0c;我先来说一下普通的 XML 注入&#xff0c;这个的利用面比较狭窄&#xff0c;如果有的话应该也是逻辑漏洞。 既然能插入 XML 代码&#xff0c;那我们肯定不能善罢…

C++之String类模拟实现(下)

片头 哈喽~小伙伴们&#xff0c;在上一篇中&#xff0c;我们讲解了C的string类的相关函数&#xff0c;这一章中&#xff0c;我们将继续深入学习string类函数&#xff0c;准备好了吗&#xff1f;咱们开始咯~ 五、对内容进行修改 ⑤insert函数 在指定位置插入字符或者字符串 …

docker安装elasticsearch(es)+kibana

目录 docker安装elasticsearch 一.准备工作 1.打开docker目录 2.创建elasticsearch目录 3.打开elasticsearch目录 4.拉取elasticsearch镜像 5.检查镜像 二.挂载目录 1.创建数据挂载目录 2.创建配置挂载目录 3.创建插件挂载目录 4.权限授权 三.编辑配置 1.打开con…