【WebGis开发 - Cesium】如何确保Cesium场景加载完毕
目录
- 引言
- 一、监听场景加载进度
- 1. 基础代码
- 2. 加工代码
- 二、进一步封装代码
- 1. 已知存在的弊端
- 2. 封装hooks函数
- 三、使用hooks方法
- 1. 先看下效果
- 2. 如何使用该hooks方法
- 三、总结
引言
本篇为Cesium开发的一些小技巧。
判断Cesium场景是否加载完毕这件事是非常有意义的。
- 加载场景本身是个异步过程,然而我们经常会遇到一些业务场景是需要基于某一个模型加载完毕后再进行初始化操作,然后对模型进行操作。
- 包含三维场景的页面和日常浏览的网页在加载效率上是不同的,人们往往对包含三维场景页面加载时长的容忍度会比较高。我们需要给出一个直观的加载过程用于安慰用户耐心等待较长的加载过程。
- Cesium的模型加载策略是由粗到细分片加载,我们需要用户可以直接看到一个已经加载完毕的场景,而不是一点点细化的过程。
一、监听场景加载进度
这个功能要用到
Ceiusm的EventHelper子类,监听tileLoadProgressEvent方法
1. 基础代码
const helper = new Cesium.EventHelper();helper.add(viewer.scene.globe.tileLoadProgressEvent, (e) => {console.log(e);});
解释下代码,这里初始化了一个EventHelper实例,并监听tileLoadProgressEvent方法,他会监听每帧场景中切片加载队列的长度。回调函数入参 e 为int类型数字,代表当前场景中剩余未加载的切片数量。
2. 加工代码
const helper = new Cesium.EventHelper();let maxTile = 0;let isLoaded = false;helper.add(viewer.scene.globe.tileLoadProgressEvent, (e) => {maxTile = Math.max(maxTile, e);const progress = Math.floor(((maxTile - e) / maxTile) * 100);isLoaded = viewer.scene.globe.tilesLoaded;console.log("progress", progress);console.log("tilesLoaded", isLoaded);
解释下代码,这里在基础代码上做了一点点加工,在外部设置个最大切片数量的变量,使用Math.max赋予最大的切片数量值,通过最大值和当前值的计算可得一个百分比进度值。此外 viewer.scene.globe.tilesLoaded 是一个Boolean值,更直观的表达了切片是否加载完成。此时我们得到了加载进度和加载完成的标志。
二、进一步封装代码
1. 已知存在的弊端
我们已经知道了如何监听场景切片的加载进度,但是它会在每一次拖动地球转动时同样监听到这个微调的过程。我们希望只有在页面初始化时、加载模型时调用一次监听事件提供进度提示,其他时候不监听。
2. 封装hooks函数
想象一下函数的使用场景,我们需要监听场景中切片的进度和完成标志,我们还需要它只监听一次就清理监听事件,额外提供销毁方法不要继续占用资源,最后需要它能够实时输出进度值和加载完成标志。
利用vue3的响应式变量方法ref,将progress 、isLoaded 包装为响应式变量。
import { ref } from "vue";export const useTileloadProgress = () => {const helper = new Cesium.EventHelper();let isLoaded = ref(false);let progress = ref(0);/*** @description: 触发监听事件* @return {*}*/const _onLoad = () => {let maxTile = 0;helper.add(viewer.scene.globe.tileLoadProgressEvent, (e) => {maxTile = Math.max(maxTile, e);progress.value = Math.floor(((maxTile - e) / maxTile) * 100);isLoaded.value = viewer.scene.globe.tilesLoaded;// 当一次加载完成后移除监听事件if (isLoaded.value) {_onRemove();}});};/*** @description: 移除监听事件* @return {*}*/const _onRemove = () => {helper.removeAll();};/*** @description: 移除监听事件,清理EventHelper实例,初始化变量值。* @return {*}*/const _onDestroy = () => {remove();helper = null;isLoaded.value = false;progress.value = 0;};return {progress,isLoaded,_onLoad,_onRemove,_onDestroy,};
};
三、使用hooks方法
1. 先看下效果
基础场景加载有点快,加载模型或者地图时,效果应该更明显些。

2. 如何使用该hooks方法
初始化场景请参考:【WebGis开发 - Cesium】三维可视化项目教程—初始化场景
在获取了progress和isLoaded两个变量后,可以进一步使用项目UI框架做提示,或者美化一个进度加载的界面。自由发挥
<script setup>
import { onMounted } from "vue";
import { initCesiumMap } from "@/utils/cesium/index.js";
import { useTileloadProgress } from "@/hooks/useTileloadProgress.js";
const { progress, isLoaded, _onLoad, _onRemove, _onDestroy } =useTileloadProgress();
onMounted(() => {
// 初始化地球场景initCesiumMap();
// 监听加载进度_onLoad();
});
</script>
三、总结
本篇主要介绍了如何利用 EventHelper 和 tileLoadProgressEvent 来判断一个Cesium场景是否加载完成。解决了Cesium场景无法感知加载进度的问题,给业务场景开发提供了明确完成标志。
利用vue3.0的新特性,将以上方法封装为hooks函数,更方便业务测使用。
再接再厉~
相关文章:
【WebGis开发 - Cesium】如何确保Cesium场景加载完毕
目录 引言一、监听场景加载进度1. 基础代码2. 加工代码 二、进一步封装代码1. 已知存在的弊端2. 封装hooks函数 三、使用hooks方法1. 先看下效果2. 如何使用该hooks方法 三、总结 引言 本篇为Cesium开发的一些小技巧。 判断Cesium场景是否加载完毕这件事是非常有意义的。 加载…...
【数据结构】6道经典链表面试题
目录 1.返回倒数第K个节点【链接】 代码实现 2.链表的回文结构【链接】 代码实现 3.相交链表【链接】 代码实现 4.判断链表中是否有环【链接】 代码实现 常见问题解析 5.寻找环的入口点【链接】 代码实现1 代码实现2 6.随机链表的复制【链接】 代码实现 1.…...
等保测评1.0到2.0的演变发展
中国等保测评的演变 作为中国强化网络安全监管制度的重要组成部分,信息安全等级保护测评不是一个新概念,可以追溯到1994年和2007年发布的多项管理规则(通常称为等保测评 1.0规则),根据这些规则,网络运营商…...
yum 源配置
在/etc/yum.repo.d目录下 格式: [repository_name] nameRepository description baseurlhttp://repository_url enabled1 gpgcheck0 gpgkeyfile:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 其中: [repository_name]:源的标识名称,…...
通过AI技术克服自动化测试难点(上)
本文我们一起分析一下AI技术如何解决现有的自动化测试工具的不足和我们衍生出来的新的测试需求。 首先我们一起看一下计算机视觉的发展历史,在上世纪70年代,处于技术萌芽期,由字符的识别技术慢慢进行演化,发展到现在,人…...
等保测评:如何建立有效的网络安全监测系统
等保测评中的网络安全监测系统建立 在建立等保测评中的网络安全监测系统时,应遵循以下步骤和策略: 确定安全等级和分类:首先,需要根据信息系统的安全性要求、资产的重要性和风险程度等因素,确定网络系统的安全等级&…...
yjs12——pandas缺失值的处理
1.缺失值的表示 正常来说,pandas缺失值是“nan”表示,但是有且文件可能自己改成了相应的别的符号 2.如何将缺失值符号改成nan xxx.replace(to_replace"...",valuenp.nan) 3.判断是否有缺失值 1.pd.notnull(xxx)————如果有缺失,…...
噪声分布 双峰,模拟函数 或者模拟方法 python人工智能 深度神经网络
在Python中模拟双峰分布,可以通过多种方法实现。以下是一些常用的方法: 1. **使用正态分布混合**: 可以通过组合两个正态分布来创建一个双峰分布。每个正态分布都有其自己的均值(mu)和标准差(sigma&…...
5个免费ppt模板网站推荐!轻松搞定职场ppt制作!
每次过完小长假,可以明显地感觉到,2024这一年很快又要结束了,不知此刻的你有何感想呢?是满载而归,还是准备着手制作年终总结ppt或年度汇报ppt呢? 每当说到制作ppt,很多人的第一反应,…...
HTML5+Css3(背景属性background)
css背景属性 background 1. background-color背景颜色 背景颜色可以用“十六进制”、“rgb()”、“rgba()”或“英文单词”表示 2. background-image:url(路径);背景图片 也可以写成 background:url(); 3. background-repeat背景重复 属性值: - repeat:x,y平铺…...
高亚科技助力优巨新材,打造高效数字化研发项目管理平台
近日,中国企业管理软件资深服务商高亚科技与广东优巨先进新材料股份有限公司(以下简称“优巨新材”)正式签署合作协议,共同推进产品研发管理数字化升级。此次合作的主要目标是通过8Manage PM项目管理系统,提升优巨新材…...
用布尔表达式巧解数字电路图
1.前置知识 明确AND,OR,XOR,NOR,NOT运算的规则 参见:E25.【C语言】练习:修改二进制序列的指定位 这里再补充一个布尔运算符:NOR,即先进行OR运算,再进行NOT运算 如下图为其数字电路的符号 注意到在OR符号的基础上,在尾部加了一个(其实由简化而来) 附:NOR的真值表 2.R-S触发…...
面试--开源框架面试题集合
Spring 谈谈自己对于 Spring IoC 的了解什么是 IoC?IoC 解决了什么问题?什么是 Spring Bean?将一个类声明为 Bean 的注解有哪些?Component 和 Bean 的区别是什么?注入 Bean 的注解有哪些?Autowired 和 Resource 的区别是什么?…...
如何选择医疗器械管理系统?盘谷医疗符合最新版GSP要求
去年12月7日,新版《医疗器械经营质量管理规范》正式发布,并于今年7月1日正式实施。新版GSP第五十一条提出“经营第三类医疗器械的企业,应当具有符合医疗器械经营质量管理要求的计算机信息系统,保证经营的产品可追溯”,…...
shell 脚本批量更新本地git仓库
文章目录 一、问题概述二、解决方法三、运行效果1. windows2. centos 一、问题概述 你是否遇到这样的场景: 本地git仓库克隆了线上的多个项目,需要更新时,无法象svn一样,选中多个项目一起更新。 只能苦逼的一个个选中,…...
Linux相关概念和易错知识点(12)(命令行参数、环境变量、本地变量)
1.命令行参数 (1)main函数的参数int argc和char* argv[]是什么? main函数可以带参数,即int main(int argc, char* argv[]),(int argc, char* argv[])叫做命令行参数列表,int argc叫参数的个数&a…...
wenserver中 一些常见的 错误码
EINTR 是 Linux 系统中定义的一个错误码,代表“被信号中断”。当一个系统调用在执行过程中被一个信号处理函数中断时,这个系统调用会立即返回错误,并且 errno 被设置为 EINTR。 举个例子 read函数是阻塞的 现在没有数据要读 我们read一直阻…...
【电路笔记】-求和运算放大器
求和运算放大器 文章目录 求和运算放大器1、概述2、反相求和放大器3、同相求和放大器4、减法放大器5、应用5.1 音频混合器5.2 数模转换器 (DAC)6、总结1、概述 在我们之前有关运算放大器的大部分文章中,仅将一个输入应用于反相或非反相运算放大器的输入。在本文中,将讨论一种…...
java实现桌面程序开机自启动
问题: 最近用java写一个桌面闹钟程序,需要实现开机自启动功能 解决办法: jna官网:https://github.com/java-native-access/jna?tabreadme-ov-file 使用jna库可以轻松实现 下载jna-5.15.0.jar和jna-platform-5.15.0.jar这两个库…...
Vuex 使用实例
文章目录 Vuex介绍使用步骤安装使用定义配置文件代码解释: 导入到 App.vue使用使用vuex Vuex 介绍 简单来说就是,多个组件需要共享一个data,原本只能通过父子组件来进行,但是vuex可以实现共享data 使用步骤 安装 npm install v…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...
Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...
docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...
Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...
Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务
通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...
DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...
Java + Spring Boot + Mybatis 实现批量插入
在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法:使用 MyBatis 的 <foreach> 标签和批处理模式(ExecutorType.BATCH)。 方法一:使用 XML 的 <foreach> 标签ÿ…...
