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

news2024/10/24 7:29:27

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.coloradmin.cn/o/2211239.html

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

相关文章

自定义类型 - 结构体

2024 - 10 - 13 - 笔记 - 26 作者(Author): 郑龙浩 / 仟濹(CSDN账号名) 自定义类型 - 结构体 平时用的数组是一组相同类型的数据&#xff0c;如果想表示一组不同类型的数据&#xff0c;那么就可以结构体了。 ① 结构体的声明&#xff08;重要&#xff09; 自己起的名字&…

[论文阅读]: Detecting Copyrighted Content in Language Models Training Data

发布链接&#xff1a;http://arxiv.org/abs/2402.09910 核心目标&#xff1a;检测语言模型的训练过程中是否使用了受版权保护的内容 基于假设&#xff1a;语言模型有可能识别训练文本中的逐字节选 工作&#xff1a;提出了 DE-COP&#xff0c;一种确定训练中是否包含受版权保…

如何在Android平板上使用谷歌浏览器进行网页缩放

在使用Android平板时&#xff0c;我们经常会浏览各种网页&#xff0c;但有时网页内容可能无法适应屏幕大小&#xff0c;这时就需要用到网页缩放功能。本文将为您详细介绍如何在Android平 板上的谷歌浏览器中进行网页缩放&#xff0c;帮助您更好地浏览网页。&#xff08;本文由h…

Cursor 平替项目 bolt.new

Cursor 是一个全新的编程工具&#xff0c;旨在帮助开发者更高效地写代码。它不仅能提升编程速度&#xff0c;还能让代码更干净、更智能。无论你是编程新手还是经验丰富的开发者&#xff0c;Cursor AI都能为你提供智能辅助&#xff0c;显著提高编程效率。 但是目前 Cursor 免费…

QT开发--文件的读写操作

第十三章 文件的读写操作 Qt提供两种读写纯文本文件的方法&#xff1a; 1、直接使用 QFile 类的IO功能&#xff1b; 2、结合 QFile 和 QTextStream&#xff0c;利用流(Stream)进行操作。 13.1 文件读操作 13.1.1 使用QFile类 Qt封装了QFile类&#xff0c;方便我们对文件进行操…

物联网直播技术揭秘:如何保证超高可用性?

我是小米,一个喜欢分享技术的29岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号“软件求生”,获取更多技术干货! Hello,大家好!我是小米,一个29岁超爱分享技术的码农。今天跟大家聊一聊物联网时代下直播高可用方案的那些事儿。 随着物联网的快速发展,直播技术已…

针对考研的C语言学习(循环队列-链表版本以及2019循环队列大题)

题目 【注】此版本严格按照数字版循环队列的写法&#xff0c;rear所代表的永远是空数据 图解 1.初始化部分和插入部分 2出队 3.分部代码解析 初始化 void init_cir_link_que(CirLinkQue& q) {q.rear q.front (LinkList)malloc(sizeof(LNode));q.front->next NULL…

【宝可梦】游戏

pokemmo https://pokemmo.com/zh/ 写在最后&#xff1a;若本文章对您有帮助&#xff0c;请点个赞啦 ٩(๑•̀ω•́๑)۶

LeetCode讲解篇之1749. 任意子数组和的绝对值的最大值

文章目录 题目描述题解思路题解代码题解链接 题目描述 题解思路 这个我只需要求子数组和的最小值相反数和子数组和的最大值&#xff0c;本题答案为二者的最大值 设数组maxDp中第i号元素表示以nums[i]为结尾的子数组和的最大值 设数组minDp中第i号元素表示以nums[i]为结尾的子…

机器学习课程学习周报十六

机器学习课程学习周报十六 文章目录 机器学习课程学习周报十六摘要Abstract一、机器学习部分1. 再探马尔可夫链1.1 离散状态马尔可夫链1.1.1 转移概率矩阵和状态分布1.1.2 平稳分布 1.2 连续状态马尔可夫链1.3 马尔可夫链的性质 2. 马尔可夫蒙特卡罗法2.1 基本想法2.2 基本步骤…

77.【C语言】文件操作(3)

目录 6.文件的顺序读写 1.几个顺序读写函数 1.fgetc函数 代码示例 代码改进 2.fputc函数 3.fputs函数 如果需要换行,应该写入换行符(\n) 4.fgets函数 1.读取单行字符串 2.读取多行字符串 6.文件的顺序读写 1.几个顺序读写函数 分组:(fgetc,fputc),(fgets,fputs),(f…

服务器数据恢复—Raid5阵列硬盘磁头损坏导致掉线的数据恢复案例

服务器数据恢复环境&#xff1a; 一台某品牌存储设备上有一组由10块硬盘&#xff08;9块数据盘1块热备盘&#xff09;组建的raid5阵列&#xff0c;上层部署vmware exsi虚拟化平台。 服务器故障&#xff1a; raid5阵列中两块硬盘对应的指示灯亮黄灯掉线。硬盘序列号无法读取&am…

【动手学深度学习】6.3 填充与步幅(个人向笔记)

卷积的输出形状取决于输入形状和卷积核的形状在应用连续的卷积后&#xff0c;我们最终得到的输出大小远小于输入大小&#xff0c;这是由于卷积核的宽度和高度通常大于1导致的比如&#xff0c;一个 240 240 240240 240240像素的图像&#xff0c;经过10层 5 5 55 55的卷积后&am…

D3.js(五):实现组织架构图

实现组织架构图 效果初始化组织机构容器并实现缩放平移功能效果源码 渲染节点效果源码 渲染连线效果源码 完整源码 效果 初始化组织机构容器并实现缩放平移功能 效果 源码 import {useEffect} from react; import TreeData from ./json/tree-data.json;interface ITreeConfig…

电子电气架构---汽车OEM敏捷式集成方案简介

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 屏蔽力是信息过载时代一个人的特殊竞争力&#xff0c;任何消耗你的人和事&#xff0c;多看一眼都是你的不…

数据在内存中的存储【下】

三.浮点数在内存中的存储 我们常见的浮点数&#xff1a;3.14159&#xff0c;1E10等&#xff0c;浮点数家族包括&#xff1a;float&#xff0c;double, long double类型。浮点数表示的范围&#xff1a;float.h中定义。之前我们说过浮点数在内存中无法精确保存&#xff0c;那为什…

OKHTTP 如何处理请求超时和重连机制

&#x1f604;作者简介&#xff1a; 小曾同学.com,一个致力于测试开发的博主⛽️&#xff0c;主要职责&#xff1a;测试开发、CI/CD 如果文章知识点有错误的地方&#xff0c;还请大家指正&#xff0c;让我们一起学习&#xff0c;一起进步。 &#x1f60a; 座右铭&#xff1a;不…

动态规划练习一

一、动态规划基本思路 1、状态表示&#xff1a;dp[i]的含义是什么 在一维数组中一般是“以 i 位置为结尾 / 起点....” 2、状态转移方程&#xff1a;dp[i]等于什么 一般是要根据最近的一步分情况进行讨论得出。 3、初始化dp表边界情况&#xff1a;保证在循环填表时不越界 …

80.【C语言】数据结构之时间复杂度

目录 1.数据结构的定义 2.算法的定义 3.算法的效率 1.衡量一个算法的好坏的方法 例题:计算以下代码的循环次数 2.大O的渐进表示法 练习1:求下列代码的时间复杂度 练习2:求下列代码的时间复杂度 练习3:求下列代码的时间复杂度 练习4:求下列代码的时间复杂度 4.总结:计…

9.存储过程安全性博客大纲(9/10)

存储过程安全性博客大纲 引言 在数据库系统中&#xff0c;存储过程是一种预先编写好的SQL代码集合&#xff0c;它被保存在数据库服务器上&#xff0c;可以通过指定的名称来调用执行。存储过程可以包含一系列的控制流语句&#xff0c;如IF条件语句、WHILE循环等&#xff0c;使…