Ceisum(SuperMap iClient3D for Cesium)实现平面裁剪

1:参考API文档:SuperMap iClient3D for Cesium 开发指南

2:官网示例:support.supermap.com.cn:8090/webgl/Cesium/examples/webgl/examples.html#layer

3:SuperMap iServer:欢迎使用 SuperMap iServer 11i(2022) (supermapol.com)

1:引入样式,必要文件:

<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no">
    <title>平面裁剪</title>
    <link href="../../Build/Cesium/Widgets/widgets.css" rel="stylesheet">
    <link href="./css/bootstrap.min.css" rel="stylesheet">
    <link href="./css/pretty.css" rel="stylesheet">
    <script src="./js/jquery.min.js"></script>
    <script src="./js/bootstrap.min.js"></script>
    <script src="./js/bootstrap-select.min.js"></script>
    <script src="./js/tooltip.js"></script>
    <script src="./js/config.js"></script>
    <script type="text/javascript" src="../../Build/Cesium/Cesium.js"></script>
</head>

2:html部分:

<body>
<div id="cesiumContainer"></div>
<div id='loadingbar' class="spinner">
    <div class="spinner-container container1">
        <div class="circle1"></div>
        <div class="circle2"></div>
        <div class="circle3"></div>
        <div class="circle4"></div>
    </div>
    <div class="spinner-container container2">
        <div class="circle1"></div>
        <div class="circle2"></div>
        <div class="circle3"></div>
        <div class="circle4"></div>
    </div>
    <div class="spinner-container container3">
        <div class="circle1"></div>
        <div class="circle2"></div>
        <div class="circle3"></div>
        <div class="circle4"></div>
    </div>
</div>
<div id="toolbar" class="param-container tool-bar">
    <button type="button" id="polygon" class="button black">绘制裁剪面</button>
    <button type="button" id="clear" class="button black">清除</button>
</div>

3.js部分:

1.Cesium初始化
  1. 使用 Cesium.Viewer 对象来初始化 cesiumContainer 元素。

  2. 配置包括禁用 infoBoxselectionIndicator,并添加了 Bing Maps 图像提供者。

  3. 使用 scene.open() 方法将 S3M 图层添加到场景中。

2.绘制和裁剪
  1. 处理事件包括绘制开始、移动和完成等,使用 handlerPolygon.setCustomClipPlane() 方法设置裁剪面。

  2. 使用 Cesium.DrawHandler 来处理多边形绘制。

3.引用的必要文件
  1. 引用 Cesium.jswidgets.css 文件。

  2. 额外的 JavaScript 文件包括 jQuery、Bootstrap、Bootstrap-Select、Tooltip 和 Config 文件。

4.功能实现的工具
  1. 使用 Cesium.DrawHandler 类来处理绘图操作。

  2. 使用 Cesium.ColorCesium.Cartesian3 处理颜色和坐标。


<script type="text/javascript">
    function onload(Cesium) {
        //初始化viewer部件
        var viewer = new Cesium.Viewer('cesiumContainer',{
            infoBox : false,
            selectionIndicator : false
        });
        viewer.imageryLayers.addImageryProvider(new Cesium.BingMapsImageryProvider({
            url : 'https://dev.virtualearth.net',
            mapStyle : Cesium.BingMapsStyle.AERIAL,
            key : URL_CONFIG.BING_MAP_KEY
        }));
        var scene = viewer.scene;
        scene.lightSource.ambientLightColor = new Cesium.Color(0.65, 0.65, 0.65, 1);
        var BIMLayer;
        try{
            //场景添加S3M图层服务
            var promise = scene.open(URL_CONFIG.SCENE_BIMBUILDING);
            Cesium.when(promise,function(layers){
                // 精准定位
                scene.camera.setView({
                    destination : new Cesium.Cartesian3(-2180753.065987198, 4379023.266141494, 4092583.575045952),
                    orientation : {
                        heading : 4.0392222751147955,
                        pitch :0.010279641987852584,
                        roll : 1.240962888005015e-11
                    }
                });
                var layer = scene.layers.find('BIMbuilding');
                layer.selectEnabled = false;
                //设置被裁剪对象的颜色
                layer.clipLineColor = new Cesium.Color(1,1,1,0);
                BIMLayer = layer;
                if(!scene.pickPositionSupported){
                    alert('不支持深度纹理,无法拾取位置!');
                }
            },function(e){
                if (widget._showRenderLoopErrors) {
                    var title = '加载SCP失败,请检查网络连接状态或者url地址是否正确?';
                    widget.showErrorPanel(title, undefined, e);
                }
            });
        }
        catch(e){
            if (widget._showRenderLoopErrors) {
                var title = '渲染时发生错误,已停止渲染。';
                widget.showErrorPanel(title, undefined, e);
            }
        }
        var clampMode = 0;
        var tooltip = createTooltip(document.body);
        

        var handlerPolygon = new Cesium.DrawHandler(viewer,Cesium.DrawMode.Polygon,clampMode);
        handlerPolygon.activeEvt.addEventListener(function(isActive){
            if(isActive == true){
                viewer.enableCursorStyle = false;
                viewer._element.style.cursor = '';
                $('body').removeClass('drawCur').addClass('drawCur');
            }
            else{
                viewer.enableCursorStyle = true;
                $('body').removeClass('drawCur');
            }
        });
        handlerPolygon.movingEvt.addEventListener(function(windowPosition){
            if(handlerPolygon.isDrawing){
                tooltip.showAt(windowPosition,'<p>点击确定多边形中间点</p><p>绘制三点即可</p><p>右键单击结束绘制</p>');
            }
            else{
                tooltip.showAt(windowPosition,'<p>点击绘制第一个点</p>');
            }
        });
        handlerPolygon.drawEvt.addEventListener(function(result){
            tooltip.setVisible(false);
            handlerPolygon.polygon.show = false;
            var positions = result.object.positions;
            //通过多边形的顶点设置裁剪面,裁剪方向为裁剪面的法线方向
            BIMLayer.setCustomClipPlane(positions[0],positions[1],positions[2]);
        });

        $('#polygon').click(function(){
            handlerPolygon.activate();
        });

        $('#clear').click(function(){
            handlerPolygon.clear();
            //清除裁剪结果
            BIMLayer.clearCustomClipBox();
        });
        $('#toolbar').show();
        $('#loadingbar').remove();
        if(!scene.pickPositionSupported){
            alert('不支持深度拾取,无法进行鼠标交互绘制!');
        }
    }
    if (typeof Cesium !== 'undefined') {
        window.startupCalled = true;
        onload(Cesium);
    }
</script>
</body>

4.实现效果:

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

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

相关文章

C语言---函数指针基础总结万字(4)

一、 函数 1.函数是一段可以重复执行的代码。 它可以接受不同的参数&#xff0c; 完成对应的操作。 下面的例子就是一个函数 int plus(int n) {return n; }上面的代码声明了一个函数plus()。 2.函数声明的语法有以下几点&#xff0c;需要注意。 返回值类型。 函数声明时&a…

每日奇难怪题(持续更新)

1.以下程序输出结果是() int main() {int a 1, b 2, c 2, t;while (a < b < c) {t a;a b;b t;c--;}printf("%d %d %d", a, b, c); } 解析:a1 b2 c2 a<b 成立 ,等于一个真值1 1<2 执行循环体 t被赋值为1 a被赋值2 b赋值1 c-- c变成1 a<b 不成立…

【油猴脚本】00006 案例 Tampermonkey油猴脚本自定义表格列名称,自定义表格表头,自定义表格的thead里的td

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 【油…

数据结构一:绪论

&#xff08;一&#xff09;数据结构的基本概念 1.相关名词 【1】数据 1.信息的载体&#xff0c;描述客观事物 2.能被输入到计算机中 3.能被计算机程序识别和处理的符号的集合。 【2】数据元素 1.数据的一个“个体” 2.数据的基本单位 3.有时候也被称为元素、结点、顶点…

【STM32】外部中断

当程序正常运行执行main函数&#xff0c;此时如果外部中断来了&#xff0c;执行外部中断函数&#xff0c;实现相应的功能&#xff0c;然后就可以回到main. 一般stm32芯片每个引脚都有自己的外部中断&#xff0c;但是为了限制&#xff0c;会有一个中断线&#xff0c;对应一个中断…

前端Excel热成像数据展示及插值算法

&#x1f3ac; 江城开朗的豌豆&#xff1a;个人主页 &#x1f525; 个人专栏:《 VUE 》 《 javaScript 》 &#x1f4dd; 个人网站 :《 江城开朗的豌豆&#x1fadb; 》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 目录 &#x1f4d8; 前言 &#x1f4d8;一、热成像数…

服务器数据增量迁移方案-—SAAS本地化及未来之窗行业应用跨平台架构

一、数据迁移增量同步具有以下几个优点&#xff1a; 1. 减少数据传输量&#xff1a;只传输自上次同步以来更改的数据&#xff0c;而不是整个数据集&#xff0c;这显著降低了网络带宽的使用和传输时间。 2. 提高同步效率&#xff1a;由于处理的数据量较小&#xff0c;同步过程…

MyBatis中Collection和Association的底层实现原理

MyBatis中Collection和Association的底层实现原理 Hi &#x1f44b;, Im shy 有人见尘埃&#xff0c;有人见星辰 技术咨询 引言 在 MyBatis 中&#xff0c;<collection> 和 <association> 标签用于处理一对多和一对一的关系。这两个标签在底层通过缓存、对象创…

以系统工程为指导的军品设计、开发与管理常用方法培训

课程背景&#xff1a; 产品开发和产品管理是组织经营战略的核心&#xff0c;而经营战略又为组织的创新战略、产品开发和产品管理提供了环境和方向。使命、愿景与核心价值观对于产品开发的聚焦点和管理方式都具有十分重要的作用。产品开发通常被称为组织的“血液”&#xff0c;…

node.js框架StrongLoop快速入门实战

目录 一、StrongLoop框架简介 二、安装StrongLoop框架 三、创建项目my-loopback-project 四、项目布局和结构 五、配置连接mysql数据库 六、实现自动生成api接口 一、StrongLoop框架简介 StrongLoop是一个强大的框架&#xff0c;它基于Node.js构建&#xff0c;几乎涵盖了…

《信息系统安全》课程实验指导

第1关&#xff1a;实验一&#xff1a;古典密码算法---代换技术 任务描述 本关任务&#xff1a;了解古典密码体制技术中的代换技术&#xff0c;并编程实现代换密码的加解密功能。 注意所有明文字符为26个小写字母&#xff0c;也就是说字母表为26个小写字母。 相关知识 为了完…

【开源免费】基于SpringBoot+Vue.JS高校心理教育辅导系统(JAVA毕业设计)

本文项目编号 T 031 &#xff0c;文末自助获取源码 \color{red}{T031&#xff0c;文末自助获取源码} T031&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析5.4 用例设计 六、核…

JEE 设计模式

Java 数据访问对象模式 Java设计模式 - 数据访问对象模式 数据访问对象模式或DAO模式将数据访问API与高级业务服务分离。 DAO模式通常具有以下接口和类。 数据访问对象接口定义模型对象的标准操作。 数据访问对象类实现以上接口。可能有多个实现&#xff0c;例如&#xff0c…

LVGL学习

注&#xff1a;本文使用的lvgl-release-v8.3版本&#xff0c;其它版本可能稍有不同。 01 LVGL模拟器配置 day01-02_课程介绍_哔哩哔哩_bilibili LVGL开发教程 (yuque.com) 如果按照上述视频和文档中配置不成功的话&#xff0c;直接重装VsCode&#xff0c;我的就是重装以后就…

Git提交有乱码

服务器提交记录如图 可知application.properties中文注释拉黄线 &#xff0c;提示Unsupported characters for the charset ISO-8859-1 打开settings - Editor - File Encodings 因为我们项目的其他文件都是UTF-8&#xff0c;所以&#xff0c;我们将默认值都改成UTF-8 然后…

打造民国风格炫酷个人网页:用HTML和CSS3传递民国风韵

附源码&#xff01;&#xff01;&#xff01; 感谢支持 小弟不断创作网站demo感兴趣的可以关注支持一下 对了 俺在结尾带上了自己用的 背景 大家可以尝试换一下效果更好哦~~~ 如何创建一个民国风格的炫酷网页 在这篇博客中&#xff0c;我们将展示如何制作一个结合民国风格和…

【无标题】Efinity 0基础进行流水灯项目撰写(FPGA)

文章目录 前言一、定义概念 缩写1. 二、性质1.2. 三、使用步骤编译常见错误1. 没加分号2. end 写多了 编译成功的标志总结参考文献 前言 数电课设 使用 FPGAIDE 使用 Efinity 一、定义概念 缩写 1. 二、性质 1. 2. 三、使用步骤 python代码块matlab代码块c代码块编译…

Vue3+CesiumJS相机定位camera

new Cesium.Camera (scene) 摄像机由位置&#xff0c;方向和视锥台定义。 方向与视图形成正交基准&#xff0c;上和右视图x上单位矢量。 视锥由6个平面定义。每个平面都由 Cartesian4 对象表示&#xff0c;其中x&#xff0c;y和z分量定义垂直于平面的单位矢量&#xff0c;w分量…

C++《类和对象》(下)

在之前类和对象&#xff08;中&#xff09;我们学习了类当中的6大默认成员函数&#xff0c;我们了解了6大成员函数的结构特征和特点以及在不同情况各个成员函数是如何调用的&#xff0c;那么接下来我们在本篇当中将继续学习之前在学习构造函数中未了解的初始化列表&#xff0c;…

【Python】生成图片验证码

1. 首先安装第三方库PIL&#xff08;图像处理库&#xff09; pip install pillow 2. 编写生成验证码代码 这里字体 SimHei.ttf 文件要放在该文件目录下。 import random from PIL import Image, ImageDraw, ImageFont, ImageFilterdef check_code(width128, height30, char…