当前位置: 首页 > news >正文

【WebGis开发 - Cesium】如何确保Cesium场景加载完毕

目录

  • 引言
  • 一、监听场景加载进度
    • 1. 基础代码
    • 2. 加工代码
  • 二、进一步封装代码
    • 1. 已知存在的弊端
    • 2. 封装hooks函数
  • 三、使用hooks方法
    • 1. 先看下效果
    • 2. 如何使用该hooks方法
  • 三、总结

引言

本篇为Cesium开发的一些小技巧。

判断Cesium场景是否加载完毕这件事是非常有意义的。

  • 加载场景本身是个异步过程,然而我们经常会遇到一些业务场景是需要基于某一个模型加载完毕后再进行初始化操作,然后对模型进行操作。
  • 包含三维场景的页面和日常浏览的网页在加载效率上是不同的,人们往往对包含三维场景页面加载时长的容忍度会比较高。我们需要给出一个直观的加载过程用于安慰用户耐心等待较长的加载过程。
  • Cesium的模型加载策略是由粗到细分片加载,我们需要用户可以直接看到一个已经加载完毕的场景,而不是一点点细化的过程。

一、监听场景加载进度

这个功能要用到 CeiusmEventHelper 子类,监听 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>

三、总结

本篇主要介绍了如何利用 EventHelpertileLoadProgressEvent 来判断一个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的演变发展

中国等保测评的演变 作为中国强化网络安全监管制度的重要组成部分&#xff0c;信息安全等级保护测评不是一个新概念&#xff0c;可以追溯到1994年和2007年发布的多项管理规则&#xff08;通常称为等保测评 1.0规则&#xff09;&#xff0c;根据这些规则&#xff0c;网络运营商…...

yum 源配置

在/etc/yum.repo.d目录下 格式&#xff1a; [repository_name] nameRepository description baseurlhttp://repository_url enabled1 gpgcheck0 gpgkeyfile:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 其中&#xff1a; [repository_name]&#xff1a;源的标识名称&#xff0c;…...

通过AI技术克服自动化测试难点(上)

本文我们一起分析一下AI技术如何解决现有的自动化测试工具的不足和我们衍生出来的新的测试需求。 首先我们一起看一下计算机视觉的发展历史&#xff0c;在上世纪70年代&#xff0c;处于技术萌芽期&#xff0c;由字符的识别技术慢慢进行演化&#xff0c;发展到现在&#xff0c;人…...

等保测评:如何建立有效的网络安全监测系统

等保测评中的网络安全监测系统建立 在建立等保测评中的网络安全监测系统时&#xff0c;应遵循以下步骤和策略&#xff1a; 确定安全等级和分类&#xff1a;首先&#xff0c;需要根据信息系统的安全性要求、资产的重要性和风险程度等因素&#xff0c;确定网络系统的安全等级&…...

yjs12——pandas缺失值的处理

1.缺失值的表示 正常来说&#xff0c;pandas缺失值是“nan”表示&#xff0c;但是有且文件可能自己改成了相应的别的符号 2.如何将缺失值符号改成nan xxx.replace(to_replace"...",valuenp.nan) 3.判断是否有缺失值 1.pd.notnull(xxx)————如果有缺失&#xff0c;…...

噪声分布 双峰,模拟函数 或者模拟方法 python人工智能 深度神经网络

在Python中模拟双峰分布&#xff0c;可以通过多种方法实现。以下是一些常用的方法&#xff1a; 1. **使用正态分布混合**&#xff1a; 可以通过组合两个正态分布来创建一个双峰分布。每个正态分布都有其自己的均值&#xff08;mu&#xff09;和标准差&#xff08;sigma&…...

5个免费ppt模板网站推荐!轻松搞定职场ppt制作!

每次过完小长假&#xff0c;可以明显地感觉到&#xff0c;2024这一年很快又要结束了&#xff0c;不知此刻的你有何感想呢&#xff1f;是满载而归&#xff0c;还是准备着手制作年终总结ppt或年度汇报ppt呢&#xff1f; 每当说到制作ppt&#xff0c;很多人的第一反应&#xff0c…...

HTML5+Css3(背景属性background)

css背景属性 background 1. background-color背景颜色 背景颜色可以用“十六进制”、“rgb()”、“rgba()”或“英文单词”表示 2. background-image:url(路径);背景图片 也可以写成 background:url(); 3. background-repeat背景重复 属性值&#xff1a; - repeat:x,y平铺…...

高亚科技助力优巨新材,打造高效数字化研发项目管理平台

近日&#xff0c;中国企业管理软件资深服务商高亚科技与广东优巨先进新材料股份有限公司&#xff08;以下简称“优巨新材”&#xff09;正式签署合作协议&#xff0c;共同推进产品研发管理数字化升级。此次合作的主要目标是通过8Manage PM项目管理系统&#xff0c;提升优巨新材…...

用布尔表达式巧解数字电路图

1.前置知识 明确AND,OR,XOR,NOR,NOT运算的规则 参见:E25.【C语言】练习:修改二进制序列的指定位 这里再补充一个布尔运算符:NOR,即先进行OR运算,再进行NOT运算 如下图为其数字电路的符号 注意到在OR符号的基础上,在尾部加了一个(其实由简化而来) 附:NOR的真值表 2.R-S触发…...

面试--开源框架面试题集合

Spring 谈谈自己对于 Spring IoC 的了解什么是 IoC?IoC 解决了什么问题?什么是 Spring Bean&#xff1f;将一个类声明为 Bean 的注解有哪些?Component 和 Bean 的区别是什么&#xff1f;注入 Bean 的注解有哪些&#xff1f;Autowired 和 Resource 的区别是什么&#xff1f;…...

如何选择医疗器械管理系统?盘谷医疗符合最新版GSP要求

去年12月7日&#xff0c;新版《医疗器械经营质量管理规范》正式发布&#xff0c;并于今年7月1日正式实施。新版GSP第五十一条提出“经营第三类医疗器械的企业&#xff0c;应当具有符合医疗器械经营质量管理要求的计算机信息系统&#xff0c;保证经营的产品可追溯”&#xff0c;…...

shell 脚本批量更新本地git仓库

文章目录 一、问题概述二、解决方法三、运行效果1. windows2. centos 一、问题概述 你是否遇到这样的场景&#xff1a; 本地git仓库克隆了线上的多个项目&#xff0c;需要更新时&#xff0c;无法象svn一样&#xff0c;选中多个项目一起更新。 只能苦逼的一个个选中&#xff0c…...

Linux相关概念和易错知识点(12)(命令行参数、环境变量、本地变量)

1.命令行参数 &#xff08;1&#xff09;main函数的参数int argc和char* argv[]是什么&#xff1f; main函数可以带参数&#xff0c;即int main(int argc, char* argv[])&#xff0c;(int argc, char* argv[])叫做命令行参数列表&#xff0c;int argc叫参数的个数&a…...

wenserver中 一些常见的 错误码

EINTR 是 Linux 系统中定义的一个错误码&#xff0c;代表“被信号中断”。当一个系统调用在执行过程中被一个信号处理函数中断时&#xff0c;这个系统调用会立即返回错误&#xff0c;并且 errno 被设置为 EINTR。 举个例子 read函数是阻塞的 现在没有数据要读 我们read一直阻…...

【电路笔记】-求和运算放大器

求和运算放大器 文章目录 求和运算放大器1、概述2、反相求和放大器3、同相求和放大器4、减法放大器5、应用5.1 音频混合器5.2 数模转换器 (DAC)6、总结1、概述 在我们之前有关运算放大器的大部分文章中,仅将一个输入应用于反相或非反相运算放大器的输入。在本文中,将讨论一种…...

java实现桌面程序开机自启动

问题&#xff1a; 最近用java写一个桌面闹钟程序&#xff0c;需要实现开机自启动功能 解决办法&#xff1a; jna官网&#xff1a;https://github.com/java-native-access/jna?tabreadme-ov-file 使用jna库可以轻松实现 下载jna-5.15.0.jar和jna-platform-5.15.0.jar这两个库…...

Vuex 使用实例

文章目录 Vuex介绍使用步骤安装使用定义配置文件代码解释&#xff1a; 导入到 App.vue使用使用vuex Vuex 介绍 简单来说就是&#xff0c;多个组件需要共享一个data&#xff0c;原本只能通过父子组件来进行&#xff0c;但是vuex可以实现共享data 使用步骤 安装 npm install v…...

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…...

C++:std::is_convertible

C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时&#xff0c;与数据库的交互无疑是核心环节。虽然传统的数据库操作方式&#xff08;如直接编写SQL语句与psycopg2交互&#xff09;赋予了我们精细的控制权&#xff0c;但在面对日益复杂的业务逻辑和快速迭代的需求时&#xff0c;这种方式的开发效率和可…...

CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云

目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...

Android15默认授权浮窗权限

我们经常有那种需求&#xff0c;客户需要定制的apk集成在ROM中&#xff0c;并且默认授予其【显示在其他应用的上层】权限&#xff0c;也就是我们常说的浮窗权限&#xff0c;那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

技术栈RabbitMq的介绍和使用

目录 1. 什么是消息队列&#xff1f;2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...

宇树科技,改名了!

提到国内具身智能和机器人领域的代表企业&#xff0c;那宇树科技&#xff08;Unitree&#xff09;必须名列其榜。 最近&#xff0c;宇树科技的一项新变动消息在业界引发了不少关注和讨论&#xff0c;即&#xff1a; 宇树向其合作伙伴发布了一封公司名称变更函称&#xff0c;因…...

MySQL 部分重点知识篇

一、数据库对象 1. 主键 定义 &#xff1a;主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 &#xff1a;确保数据的完整性&#xff0c;便于数据的查询和管理。 示例 &#xff1a;在学生信息表中&#xff0c;学号可以作为主键&#xff…...

nnUNet V2修改网络——暴力替换网络为UNet++

更换前,要用nnUNet V2跑通所用数据集,证明nnUNet V2、数据集、运行环境等没有问题 阅读nnU-Net V2 的 U-Net结构,初步了解要修改的网络,知己知彼,修改起来才能游刃有余。 U-Net存在两个局限,一是网络的最佳深度因应用场景而异,这取决于任务的难度和可用于训练的标注数…...