Cesium叠加超图二维服务、三维场景模型

前言

        Cesium作为开源的库要加超图的服务则需要适配层去桥接超图与Cesium的数据格式。这个工作iClient系列已经做好,相比用过超图二维的道友们可以理解:要用Openlayer加载超图二维,那就用iClient for Openlayer库去加载;同样的要用Cesium加载超图三维就要用iClient for Cesium库。

        道友们一看:竟然要换库?我过来学cesium,你让我装iClient for Cesium?退!退!退!

        道友不必惊慌! iClient for Cesium是在Cesium库基础上做增量开发,没有对原本的Cesium做改动,童叟无欺!直白点说,你装完 iClient for Cesium仍然可以按Cesium官方API文档进行Cesium的原生开发。

 项目地址:cesium-demo

Cesium文档:Cesium Documentation

iClient for Cesium文档:iClient for Cesium Documentation

一、引入iClient for Cesium

1.下载

        这里的引入不是重复引入,而是直接替换。

        超图的包需要手动下载,没有npm仓库(其实Cesium有npm仓库和没npm一个样,npm下下来之后还是要手动复制)

SuperMap iClient3D for Cesium 产品下载

SuperMap技术资源中心|为您提供全面的在线技术服务

 百度网盘

2.引入

        引入方式与Cesium库一模一样,将下载后的包Build文件夹下的Cesium文件夹复制到public/static下,而后在index.html中引入,详细步骤见 初始化Cesium

二、加载超图二维

         现在做三维的目的其核心概念为二三维一体化,所以在三维系统中叠加二维数据也是很重要的一个环节。

1.补充知识

        Cesium中有3个核心对象,Cesium、Scene、Viever,Cesium对象是最底层的,其代表了整个Cesium 库和渲染引擎的实例,而Scene 对象是 Cesium 库中一个重要的组成部分,它表示一个场景,包含了地球、相机、光照、图层等元素,Viever则是对Scene进行了更高级的封装,Viewer继承了Scene的所有功能。总之这三个对象上的属性方法很多是共享的,记住这句话,不然看API会很懵。

2.imageryLayers

        首先要明确原生Cesium中加载二维用什么。一般都用imageryLayers去加载,例如球体表面的影像就是如此叠加映射上去的,放大看,这些影像(无高程图片)都是平贴在球体表面的二维服务。与之相反的是地形、白膜等有高程的服务。

3.使用imageryLayers加二维

// Add an OpenStreetMaps layer
const imageryLayer = new Cesium.ImageryLayer(new Cesium.OpenStreetMapImageryProvider({
  url: "https://tile.openstreetmap.org/"
}));
scene.imageryLayers.add(imageryLayer);

        官网加载影像的示例代码,定义一个ImageryLayer对象,传OpenStreetMapImageryProvider对象(可以理解成数据源),最终添加到场景中的imageryLayers集合里去。

4.SuperMapImageryProvider

        上面提到了加载oms地图只需要使用OpenStreetMapImageryProvider构造数据源,那么加载超图也只需要SuperMapImageryProvider即可,这个可以理解为将超图数据源转化成cesium的imageryLayer数据源,桥接适配层。

        不同的是,OpenStreetMapImageryProvider是Cesium官方自己写的,并收纳到了Cesium源码中;而SuperMapImageryProvider是超图自己写的,毕竟超图没开源(bushi)。

        加载代码贴上:

        这里进行了简单封装,附加了关闭逻辑。

        添加逻辑附加了图层定位;添加时顺便打上guid标识,方便后续关闭图层。

    dealSuperMapService({ url, active, guid }) {
      const imageryLayers = this.viewer.imageryLayers;
      if (active) {
        const provider = new Cesium.SuperMapImageryProvider({
          url
        });
        // 皆为cesium原生,只有SuperMapImageryProvider为桥接层
        const layer = imageryLayers.addImageryProvider(provider);
        layer.guid = guid;
        this.viewer.flyTo(layer, { duration: 0 });
      } else {
        const layers = imageryLayers._layers;
        const target = layers.find(e => e.guid === guid);
        imageryLayers.remove(target);
      }
    },

三、加载超图三维场景

1. open()方法

        此方法为超图所创,挂载Scene对象上,可以自行查看,Cesium文档中无此方法,下面是超图iClient for Cesium文档对open的简要介绍。

openSuperMapScene({ url, active }) {
      const scene = this.viewer.scene;
      if (active) {
        scene.open(url);
      } else {
        scene.layers.removeAll();
      }
    },

        使用起来简单粗暴,直接往里面丢url即可,地址精确到realspace,也就是超图场景服务的地址,其为全加载,也就是说场景中的所有图层全部加载,无过滤功能。说其粗暴可不敢乱言,只因确实迷之操作,超图社区官方答复附上,该方法打开场景后不可以关闭。

 2.addS3MTilesLayerByScp

        仍然是超图自研方法,挂接在scene上,用于添加超图的三维切片缓存图层。相较于open()而言,可进行图层过滤,可以进行自由移除。S3M是超图自主研发的用于存储三维数据的格式。

   dealSingleSuperMapScene({ url, active,layerName }) {
      const scene = this.viewer.scene;
      if (active) {
        const promise = scene.addS3MTilesLayerByScp(url, {
          name: layerName
        });
        promise.then(layer => {
          this.viewer.flyTo(layer, { duration: 0 });
        });
      } else {
        scene.layers.remove(layerName);
      }
    }

        其中layers类是超图在cesium基础上加的,目的是用来管理场景中的所有图图层。

四、重点说下图层定位 

1.吐槽

        原本是不想说这个事的,主要是看到网上的资源太差了,这一方面的全是胡诌,随便举个例子,这是网上随便搜的,大多数都是这种。这有啥用,你高低整个几何定位吧?

2.图层定位

        打开图层后定位到查看区域,这才是符合操作逻辑,增强用户体验的流程,上文档:

         官方文档说的很清晰,flyTo方法的第一个参数支持的参数类型,其中之一就有ImagerLayer类型,结论就是二维图层可以直接当作target参数直接定位。

        说完了二维图层的定位再来说说三维场景的定位,这里原本根据文档走,addS3MTilesLayerByScp返回的图层并不在flyTo的可选参数之中,因为返回的类型是S3MTileLayer类型,但超图文档flyTo并没有补充target的该类型,而该图层又可以直接flyTo定位成功,属于是文档不完善了。

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

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

相关文章

mac自带录屏

1、打开 快捷键:Shift Command5 可以在指定存储位置 2、结束 快捷键: CommandControlEsc(也可以点击顶部工具栏的结束按钮)

图像数据增广

目录 一、常用的图像增广方法 1、随机翻转 2、随机裁剪 3、随机颜色变换 二、图像代码实现 1、定义图像显示辅助函数 2、随机翻转 3、随机裁剪 4、随机颜色变换 5、结合多种图像增广方法 三、使用图像增广进行训练 1、下载数据集 2、读取图像并增广 3、多GPU训练 …

麦芯(MachCore)应用开发教程2 --- 时序

黄国强 2024/01/22 正如计算机的本质是状态机一样,设备也是一个状态机。笔者之前文章“什么是时序”用 switch/case 实现了状态机。在麦芯中,我们用Lambda实现了状态机。相对于switch/case,Lambda更优雅,更符合面向对象。先上代码…

单元化(Set)架构设计详解:异地多活、突破扩展上限的优选方案

文章目录 一、单元化架构基础1、扩展性(Scalability)概述2、扩展性 - 横向扩展(Horizontal Scale)3、扩展性 - 纵向扩展(Vertical Scale)4、扩展性 - 扩展魔方5、一致性 - 数据库事务一致性(ACI…

【中文版ChatGPT4.0!国内可直接用】

中文版ChatGPT4.0!国内可直接用 文心一言微软Copilot迅捷AI写作 在国内使用ChatGPT 4.0可能需要支付每月20美元的费用,约合人民币145元。如果不愿意付费,也可以考虑使用其他免费的AI工具。 目前有许多公司在研发出色的AI大模型,这…

Python进阶-Anaconda使用总结

本文是 Anaconda 的使用总结,旨在帮助用户快速搭建 Python 环境、进行数据科学和机器学习工作。首先,介绍了在 Windows 系统上安装 Anaconda 的步骤,包括下载安装程序、配置环境变量以及验证安装。随后,详细列举了 Anaconda 的常用…

新版AndroidStudio dependencyResolutionManagement出错

在新版AndroidStudio中想像使用4.2版本或者4.3版本的AndroidStudio来构造项目?那下面这些坑我们就需要来避免了,否则会出各种各样的问题。 一.我们先来看看新旧两个版本的不同。 1.jdk版本的不同 新版默认是jdk17 旧版默认是jdk8 所以在新版AndroidSt…

processing集训day03

编程英语 load 加载 image 图像 hawthorn 山楂 true 真 false 假 if 如果 distance 距离 collision 碰 图片显示 显示图片步骤: 1、准备好图片 2、定义图片变量 3、载入图片至变量 4、进行图片显示 Processing 所支持的图片格式有很多,常见的有…

全栈没有那么难!15 分钟搞明白 Express.js

Express 是老牌的 Node.js 框架,以简单和轻量著称,几行代码就可以启动一个 HTTP 服务器。市面上主流的 Node.js 框架,如 Egg.js、Nest.js 等都与 Express 息息相关。 Express 框架使用标准 Node.js 语法,主要由以下 3 个核心部分…

Elasticsearch8使用统一的CA为HTTP层更新证书

官方文档参考: Update certificates with the same CA | Elasticsearch Guide [8.10] | Elastic 使用统一的CA为HTTP层更新证书,包括3部分:在ES集群内某个节点上生成证书;将生成的证书拷贝给集群内其他节点;更新kiban…

大模型相关学习资料整理

1. 核心2框架 1. semantic-kernel【微软】 https://learn.microsoft.com/en-us/semantic-kernel/overview/ 2. LangChain https://www.langchain.asia/ https://python.langchain.com/docs/get_started/introduction 2. 技术点 1. Function Call https://platform.opena…

Dell戴尔XPS 8930笔记本电脑原装Win10系统 恢复出厂预装OEM系统

链接:https://pan.baidu.com/s/1eaTQeX-LnPJwWt3fBJD8lg?pwdajy2 提取码:ajy2 原厂系统自带所有驱动、出厂主题壁纸、系统属性联机支持标志、系统属性专属LOGO标志、Office办公软件、MyDell等预装程序 文件格式:esd/wim/swm 安装方式&am…

11- OpenCV:自定义线性滤波(卷积,卷积边缘)

目录 一、卷积 1、卷积概念 2、卷积如何工作 3、常见算子(卷积核 Kenel) 4、自定义卷积模糊 5、代码演示 二、卷积边缘 1、卷积边缘问题 2、处理边缘 3、相关的API说明 4、代码演示 一、卷积 1、卷积概念 (1)在OpenC…

Recommender Systems with Generative Retrieval

TLDR: 本文提出一种新的生成式检索推荐系统范式TIGER。当前基于大规模检索模型的现代推荐系统,一般由两个阶段的流程实现:训练双编码器模型得到在同一空间中query和候选item的embedding,然后通过近似最近邻搜索来检索出给定query的embedding的…

DBA技术栈MongoDB: 数据增改删除

该博文主要介绍mongoDB对文档数据的增加、更新、删除操作。 1.插入数据 以下案例演示了插入单个文档、多个文档、指定_id、指定多个索引以及插入大量文档的情况。在实际使用中,根据需求选择适合的插入方式。 案例1:插入单个文档 db.visitor.insert({…

zxz-uni-data-select插件,表单回显时,无法显示数据,原因是后端返回的数据是字符串,要把这个字符串转成number类型,就能显示了

zxz-uni-data-select插件,uniapp项目,vue3 表单回显时,这个下拉框不能显示数据 解决方法 用Number()方法把字符串转成number string转成number 回显就能显示了

CAM软件行业调研:广泛应用取得越来越大的市场份额

经过多年的推广,CAM技术已经广泛地应用在机械、电子、航天、化工、建筑等行业。近年来,我国CAM技术的开发和应用取得了长足的发展,除对许多国外软件进行了汉化和二次开发以外,还诞生了不少具有自主版权的CAM系统,由于这…

.NetCore Flurl.Http 升级到4.0后 https 无法建立SSL连接

Flurl.Http-3.2.4 升级到 4.0.0 版本后,https请求异常:Call failed. The SSL connection could not be established. 如下图: Flurl.Http-3.2.4版本绕过https的代码,对于 Flurl.Http-4.0.0 版本来说方法不再适用,3.2.…

js实现页面全屏展示

最近做一个网页项目,用户要求可以全屏展示,进入系统后隐藏地址栏,于是乎,经过调研就选择了全屏API,即便如此还是遇到了一些问题,总结一下,写下此篇文章。 全屏模式 获取Element节点&#xff0c…

红日靶场2打点记录

因为之前成功用冰蝎免杀360,把权限反弹到了MSF上,然后MSF把权限反弹到CS上 所以这次咱们走捷径直接通过反序列化漏洞连接(就是关掉360)因为权限弹来弹去感觉好麻烦 提示 大家如果想要免杀360千万别学我,我是之前免杀3…