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

news2024/10/2 14:21:19

前言

        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定位成功,属于是文档不完善了。

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

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

相关文章

如何用GPT进行绘图?

详情点击链接:如何用GPT进行绘图? 一OpenAI 1.最新大模型GPT-4 Turbo 2.最新发布的高级数据分析,AI画图,图像识别,文档API 3.GPT Store 4.从0到1创建自己的GPT应用 5. 模型Gemini以及大模型Claude2二定制自己的GP…

【python题解11】 输入两个非负十进制整数A和B以及D(进制数),输出A+B的D(1< D ≤ 10)进制数。

1. 题目&#xff1a;输入两个非负十进制整数A和B以及D&#xff08;进制数&#xff09;&#xff0c;输出AB的D&#xff08;1< D ≤ 10&#xff09;进制数。 输入格式: 在一行中依次给出三个整数A、B和D&#xff08;进制数&#xff09;。 输出格式: AB的D进制数。 2. 主要考…

如何使用 Helm 在 K8s 上集成 Prometheus 和 Grafana|Part 3

在本教程的前两部分&#xff0c;我们分别了解和学习了Prometheus 和 Grafana 的基本概念和使用的前提条件&#xff0c;以及使用 Helm 在 Kubernetes 上安装 Prometheus。 在今天的教程中&#xff0c;我们将为你介绍以下内容&#xff1a; 安装 Grafana&#xff1b;集成 Promethe…

开源网安推出“国产替代续航惠企计划”,实现“两不三保”目标

​随着全球安全威胁态势越发严峻&#xff0c;国内网络安全监管趋严&#xff0c;Adobe、Tableau、Salesforce、Nutanix、Citrix、checkmarx等外企陆续裁员离华&#xff0c;国产替代从战略层的备选项&#xff0c;也将逐步变为需要快速落地的必选项。 为了确保用户能高效应对外企离…

[C++]:12:模拟实现list

[C]:12:模拟实现list 一.看一看SGI的stl_list的源码&#xff1a;1.基础结构构造函数1.节点结构&#xff1a;2.节点构造函数&#xff1a;3.链表结构&#xff1a;4.链表的构造函数&#xff1a; 2.析构1.节点析构&#xff1a;2.链表的析构&#xff1a; 3.迭代器 二.模拟实现list1.…

十二款·富文本编辑器:数字创作的瑞士军刀

在数字化时代&#xff0c;内容创作已经成为我们日常生活中不可或缺的一部分。无论是撰写一封电子邮件、准备一份报告、还是在社交媒体上分享心情&#xff0c;文字都是我们表达和沟通的基石。而在这个过程中&#xff0c;富文本编辑器就如同一把瑞士军刀&#xff0c;为我们提供了…

商品详情APP端原数据淘宝数据采集API接口代码接入示例

商品详情APP端原数据API接口&#xff08;接口接入入口&#xff09;的作用是提供APP端商品的详细信息&#xff0c;包括价格、描述、图片、折后价、优惠券信息等。通过调用这个API接口&#xff0c;开发者可以获取到APP端商品详情相关的数据&#xff0c;从而进行数据分析&#xff…

怎么录屏?这里有一份超详细教程!

随着科技的发展&#xff0c;录屏已经成为人们日常生活中经常需要使用的功能&#xff0c;无论是录制游戏、教学演示、在线会议等都需要用到录屏。可是您知道怎么录屏才是最好的吗&#xff1f;接下来&#xff0c;本文将为您介绍三种流行的录屏方法&#xff0c;并提供详细的分步骤…

【遥感数字图像处理(朱文泉)】各章博文链接汇总及思维导图

遥感数字图像处理课程汇总 第0章 绪论第一章 数字图像基础第二章 数字图像存储与处理第三章 空间域处理方法第四章 变换域处理方法第五章 辐射校正第六章 几何校正第七章 图像去噪声第八章 图像增强第九章 感兴趣目标及对象提取第十章 特征提取与选择第十一章 遥感数字图像分类…

Unity 编辑器篇|(九)编辑器美化类( GUIStyle、GUISkin、EditorStyles) (全面总结 | 建议收藏)

目录 1. GUIStyle1.1 参数总览1.2 样式代码 2. GUISkin2.1 参数总览2.2 创建自定义Skin 3. EditorStyles2.1 参数总览1.2 反射获取所有EditorStyles 1. GUIStyle GUIStyle是一个用于定制GUI控件样式的类&#xff0c;它包含了控件的外观属性&#xff0c;如字体、颜色、背景等。…

springboot 3 + mysql8 + flyway 数据库版本管理

1、flyway flyway官方文档地址&#xff1a;https://documentation.red-gate.com/fd 对于不怎么看文档的我来说&#xff1a; 1&#xff09;flyway是个管理数据库版本的工具&#xff0c;可以对不同环境的sql进行迁移操作。 2&#xff09;优点&#xff1a;初始化、后期数据的管理…

dpdk网络转发环境的搭建

文章目录 前言ip命令的使用配置dpdk-basicfwd需要的网络结构测试dpdk-basicfwddpdk-basicfwd代码分析附录basicfwd在tcp转发时的失败抓包信息DPDK的相关设置 前言 上手dpdk有两难。其一为环境搭建。被绑定之后的网卡没有IP&#xff0c;我如何给它发送数据呢&#xff1f;当然&a…

动物免疫(羊驼免疫)-泰克生物

在过去几十年里&#xff0c;抗体研究和应用的领域已经经历了革命性的变化。在这个进程中&#xff0c;一种特殊来源的抗体 —— 来自骆驼科动物&#xff08;包括羊驼&#xff09;的单链抗体&#xff08;也称纳米抗体&#xff09;引起了全球科学家的广泛关注。 羊驼等骆驼科动物…

vectorCast添加边界值分析测试用例

1.1创建项目成功后会自动生成封装好的函数,在这些封装好的函数上点击右键,添加边界值分析测试用例,如下图所示。 1.2生成的用例模版是不可以直接运行的,需要我们分别点击它们,让它们自动生成相应测试用例。如下图所示,分别为变化前和变化后。 1.3点击选中生成的测试用例,…

家庭教育小知识青春期孩子如何教育?

孩子进入青春期后&#xff0c;很多家长都纷纷感叹&#xff0c;与孩子相处太难了。那个曾经乖巧、黏人的孩子&#xff0c;好像一夜之间浑身长满刺&#xff0c;变得叛逆、敏感、暴躁、将父母拒之门外、甚至是辱骂、羞辱父母。 让父母更挫败的是&#xff0c;曾经通过说教、讲道理…

sqlmap使用教程(1)

一、sqlmap简介 sqlmap是一个自动化SQL注入测试工具&#xff0c;它支持的数据库有MySQL、MSSQL、Oracle、PostgreSQL、Access、IBM DB2、SQLite、Firebird、Sybase和SAP MaxDB。sqlmap默认使用以下5种SQL注入技术&#xff1a; 基于布尔的盲注&#xff1a;根据返回页面判断条件…

flink基本概念

1. Flink关键组件: 这里首先要说明一下“客户端”。其实客户端并不是处理系统的一部分&#xff0c;它只负责作业的提交。具体来说&#xff0c;就是调用程序的 main 方法&#xff0c;将代码转换成“数据流图”&#xff08;Dataflow Graph&#xff09;&#xff0c;并最终生成作业…

Kotlin 尾递归函数

函数式编程中&#xff0c;重要的概念 尾递归&#xff1a; 当一个函数 在最后调用 自身&#xff0c;称为 尾递归&#xff0c;是一种特殊的递归函数。 Kotlin 使用 tailrec 声明尾递归函数&#xff0c;可以避免 StackOverflowError 的风险。 原理是&#xff1a;通过编译器优化 …

BACnet网关BL121BN 实现稳定可靠、低成本、简单的楼宇自控协议BACnet转OPC UA解决方案

随着楼宇自控系统的迅猛发展&#xff0c;人们深刻认识到在楼宇暖通行业中&#xff0c;实时、可靠、安全的数据传输至关重要。在此背景下&#xff0c;高性能的楼宇暖通数据传输解决方案——协议转换网关应运而生&#xff0c;广泛应用于楼宇自控和暖通空调系统应用中。 钡铼技术…

Linux:动静态库的概念制作和底层工作原理

文章目录 动静态库基础认知动静态库基本概念静态库的制作库的概念包的概念 静态库的使用第三方库小结 动态库的制作动态库的使用动态库如何找到内容&#xff1f;小结 动态库加载库和程序都要加载可执行程序的地址问题地址问题逻辑地址和平坦模式绝对编址和相对编址与位置无关码…