Cesium中实现仿ArcGIS三维的动态图层加载方式

Cesium 加载 ArcGIS 动态图层的方式

如果你在 Cesium 中加载过 ArcGIS 的动态图层,你会发现,Cesium 对于动态图层仍然采用类似切片图层的逻辑进行加载。也就是每个固定的瓦片 export 一张图片。

这样会造成一些问题:

  1. 请求量大,如果访问人数多,后端服务容易崩溃
  2. 如果动态图层中含有标注,会造成标注文字变多(ArcGIS 动态图层如果一个大图形被分割在多个 export 中,那么每个 export 回来的图片都会含有大图形对应的标注)

没找到合适的带标注的动态图层数据,这里用 ps 简单模拟一个效果

请添加图片描述

ArcGIS 4.x 三维场景加载动态图层的方式

通过查看 ArcGIS 三维场景发送的请求可以发现,ArcGIS 每次相机停止运动时,会首先给动态图层服务发送两个范围大小不一样的 export 请求。再根据请求回来的两张图片进行叠加显示。

效果大概如下(同样用 ps 模拟)
请添加图片描述

当然,如果同一个面被分割在了两个服务,一样会出现标注多的问题

请添加图片描述

在 Cesium 中实现仿 ArcGIS 三维的动态图层加载方式

要实现仿 ArcGIS 三维的动态图层加载方式,首先当然是得先获取 ArcGIS 是如何计算两个 export 参数的。

这一步没什投机取巧的办法,只能去翻 ArcGIS 的源码,把这段逻辑抽离出来。(npm 包里的 arcgis 源码,代码经过了压缩,不过大致逻辑还是能看出来的)

如果抽离的逻辑正确,那么请求的范围应该类似下面这样

请添加图片描述

请添加图片描述

抽离出两个 export 参数的计算方法之后,就该考虑如何展示了。

利用 GroundPrimitive 展示

将请求回来的两张图片通过 GroundPrimitive 展示是最简单的办法,需要做的额外操作只有在第二张大的图片中,挖去和小图片相交的部分

优点:实现简单,性能高,能实现影像贴模型的效果

缺点:无法和其他通过 ImageryLayer 方式加载的图层交换图层顺序

编写 ImageryLayer 展示

ImageryLayer 请求方式就是 Cesium 原生的方式。它能够解决 GroundPrimitive 无法和其他图层交换顺序的问题,但是会有一些性能问题

性能问题源自于 ImageryLayer 会按切片方案将展示的内容切割成一个个小的瓦片。而我们 export 回来的两张图片并不是严格按照切片方案请求的。

请添加图片描述

因此, 每次请求回来的图片, 都需要根据当前正在显示的瓦片进行切割, 并将切割出来的内容更新至瓦片的缓存中。( ImageryLayer 内置缓存机制,一旦当前瓦片请求成功,则后续直接读取缓存不会再请求。实际渲染时,也是读取缓存中的内容渲染的。如果不更新缓存,那么当重新显示已缓存的瓦片时,其内容会和当前的图片对应不上 )

更新瓦片缓存这一步相当耗时和耗内存,并且如果瓦片多,甚至会出现阻塞主线程的情况。

有的同学可能会说,是不是可以考虑采用 WebWorker 来计算每张瓦片的内容?

事实上,我尝试过,但是由于需要同时更新的瓦片比较多,就会导致 export 请求回来的两张图片都需要复制一份到各自的 WebWorker 中,这样会导致更严重的内存问题。

采用 SharedArrayBuffer 让图片在 WebWorker 之间共享?

事实上,我也尝试过,但是 SharedArrayBuffer 似乎存在一些兼容性问题,最后还是放弃了 😑。

如果各位大佬有解决方案,欢迎提供!

修改源码的方式展示

在编写 ImageryLayer 方案时,我想到,实际上我可以只向着色器传入两张纹理,和对应的四至范围。在计算 Globe 上的影像纹理时,单独为动态图层进行切割即可。

就目前而言,这个可能是最理想的方案,只是需要去对 Globe 和 ImagerLayer 相关的源码进行修改。

这个方案还有待尝试,累了…晚点再试…😑

原文链接

Cesium中实现仿ArcGIS三维的动态图层加载方式

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

信号处理:概念、技术、领域

目录 基本概念 主要技术 应用领域 信号处理是一个涉及分析、修改和再生信号的多学科领域。信号可以是各种形式的,例如声音、图像、视频或其他类型的监测数据。信号处理的主要目标是提取有用的信息并增强信号的质量。以下是信号处理的一些基本概念和应用&#xff…

【Redis】Redis 生成唯一 id

每个订单业务都需要有一个唯一的id,如果使用数据库自增id就会暴露规律,同时id会有一个最大的阈值,万一订单超过这个阈值,那就会出现问题。因此我们可以封装一个全局ID生成器,可以适用于分布式系统生成唯一ID&#xff0…

购物商城案例 -- VueCli创建项目,调整目录,vant组件库

基于VueCli创建项目 调整目录,新增两个目录 修改路由和App.vue 路由中规则清空 新建文件夹api和utils api文件夹:发请求的一些文件 utils文件夹:工具函数方法 vant组件库:第三方vue组件库 vant-ui 找到vant官网,进入va…

金融分析-Transformer模型(基础理论)

Transformer模型 1.基本原理 transformer的core是注意力机制,其本质就是编码器-解码器。他可以通过多个编码器进行编码,再把编码完的结果输出给解码器进行解码,然后得到最终的output。 1.1编码器 数据在编码器中会经过一个self-attention的…

【密码学】AES算法

一、AES算法介绍: AES(Advanced Encryption Standard)算法是一种广泛使用的对称密钥加密,由美国国家标准与技术研究院(NIST)于2001年发布。 AES是一种分组密码,支持128位、192位和256位三种不同…

朗致面试---IOS/安卓/Java/架构师

朗致面试---IOS/安卓/Java/架构师 一、面试概况二、总结三、算法题目参考答案 一、面试概况 一共三轮面试: 第一轮是逻辑行测,25道题目,类似于公务员考试题目,要求90分钟内完成。第二轮是技术面试,主要是做一些数据结…

51c嵌入式~单片机~合集2

我自己的原文哦~ https://blog.51cto.com/whaosoft/12362395 一、不同的电平信号的MCU怎么通信? 下面这个“电平转换”电路,理解后令人心情愉快。电路设计其实也可以很有趣。 先说一说这个电路的用途:当两个MCU在不同的工作电压下工作&a…

网络原理done

文章目录 ARP协议模拟一次ARP过程ARP周边问题ARP欺骗RARP DNS域名解析服务域名简介DNS结论 ICMP协议 NAT技术(重点)NAPTNAT缺点 内网穿透代理服务器正向代理反向代理 NAT和代理服务器区别 ARP协议 以这片区域为例 此时IP报文到达入口路由器R 此时路由器…

MATLAB中Simulink的信号线

Simulink以模块为最小单位,通过信号线互相连接,用户可通过GUI调配每个模块的参数,且仿真的结果能够以数值和图像等形象化方式具现出来。信号线可以传递一维数据、多维数据、向量数据或矩阵数据,甚至Bus型数据。Simulink使用不同的线形表示传递不同数据类型的信号线,…

集成方案 | Docusign + 泛微,实现全流程电子化签署!

本文将详细介绍 Docusign 与泛微的集成步骤及其效果,并通过实际应用场景来展示 Docusign 的强大集成能力,以证明 Docusign 集成功能的高效性和实用性。 在现代企业运营中,效率和合规性是至关重要的。泛微作为企业级办公自动化和流程管理的解决…

基于vue的quasarui框架和.NET CORE实现网站

首先安装quasar cli,然后进行配置 前台代码部分截图 后台部分截图 数据库 网站部分

一行代码解决vue3前端打包部署到服务器,动态配置http请求头后端ip方法教程无bug

只需要一行代码 vue3若依框架前端打包部署到服务器,需要部署到多个服务器上,每次打包会很麻烦,今天教大家一个简单的动态配置请求头api的方法,部署后能动态获取(修改)对应服务器的请求ip, 介绍两种方法,如…

openGauss开源数据库实战二十三

文章目录 任务二十三 openGauss 参数管理任务目标实施步骤一、启动参数文件及参数类型1.参数值修改后必须重新启动数据库的参数2.参数值修改后只需要reload操作的参数 二、设置数据库级参数三、设置用户级参数四、设置会话级参数五、将参数设置为默认值 任务二十三 openGauss 参…

杨振宁大学物理视频中黄色的字,c#写程序去掉(原版改进,三)

上一节,我们分清了主次矛盾,并搞定了主要矛盾(去掉黄色的字),这一节解决次要矛盾(矩形色带)。 我们的想法如图: 1,我们找到稳定黄色的最左边,最右边两点&…

ORACLE逗号分隔的字符串字段,关联表查询

使用场景如下: oracle12 以前的写法: selectt.pro_ids,wm_concat(t1.name) pro_names from info t,product t1 where instr(,||t.pro_ids|| ,,,|| t1.id|| ,) > 0 group by pro_ids oracle12 以后的写法: selectt.pro_ids,listagg(DIS…

JS-手写new

我们先再来理一理原型 Object1 {name:deng,age:18 } Object2 {name:ru,age:18 } const Person function(){} Person.prototype Object1; const p1 new Person(); console.log(p1.name); //deng Person.prototype null; console.log(p1.name); //deng上面给Person的构造函…

LabVIEW实验站反馈控制系统

开发了一套基于LabVIEW的软X射线磁性圆二色实验站的反馈控制系统。这套系统主要用于实现对实验站高电压的精确控制,从而保持照射在样品上的流强稳定性,为分析样品吸收谱提供可靠基准,同时提供了易用的用户界面和强大的数据存储功能。 项目背景…

Matlab笔记---clear、clc、clear all应用

在MATLAB中,clear、clc 和 clear all 是三个常用的命令,它们各自有不同的作用: clc: clc 命令用于清除MATLAB命令窗口中的所有输出。它不会删除任何变量、函数或文件,只是清除屏幕上的显示内容,让你可以更…

Python Segmentation fault错误定位办法

1. 说明 Python3执行某一个程序时,报Segmentation fault (core dumped)错,但没有告知到底哪里出错,无法查问题,这时就需要一个库faulthandler来帮助分析。 2. 安装faulthandler faulthandler在Python3.3之后成为标准库&#xf…

康耐视智能相机(Insight)通过ModbusTCP发送字符串到倍福(BECKHOFF)PLC中

文章目录 1.背景2.分析3.实现3.1.PLC的ModbusTCP_Server3.1.1.安装TF6250-Modbus-TCP3.1.2.PLC设置 3.2.智能相机的ModbusTCP_Client3.2.1.了解ModbusTCP的协议3.2.2.根据协议写代码3.2.2.1.纯函数代码3.2.2.2.脚本代码 3.2.3.非脚本处理时的代码逻辑图3.2.4.关于代码的问题及解…