SuperMap iClient3D for Cesium 构建隧道

news/2024/4/29 21:57:12/文章来源:https://blog.csdn.net/supermapsupport/article/details/130400320

背景

前段时间看到一篇构建隧道的文章(https://blog.csdn.net/supermapsupport/article/details/128453116),突然想到一个使用场景:隧道通常是建在山体下面,是否可以通过这种方式构建出一条贯穿山体的隧道,来模拟实际的施工方案?答案是可以,效果图如下:
在这里插入图片描述

一、实现思路

1、生成隧道模型
2、地形挖洞
3、把隧道模型放在洞口中
该方案的难点在于,如何根据隧道的截面坐标,将地形挖洞,使洞口与隧道模型完全吻合
由于地形服务无法做布尔运算,这里采用地形开挖方式实现,并不展示开挖底面与侧面,这样就相当于给地形裁剪一个口子,关键接口:
在这里插入图片描述
在这里插入图片描述

二、实现过程

1、构建管道模型

用鼠标绘制一条折线代表隧道的走向
然后使用iServer放样分析,输入隧道截面坐标,分析出一条带管壁厚度的隧道

var s3mInstanceColc = new Cesium.S3MInstanceCollection(scene._context);
scene.primitives.add(s3mInstanceColc);
var sqlParameter = {"loftRegion":{"type":"REGION" , "parts":[8,8], "points":[{ x: -2.5, y: 7.5},{ x: -6.5, y: 5.5 },{ x: -10.5, y: 0 },{ x: -10.5, y: -10.5 },  //隧道截面坐标,单位为米{ x: 10.5, y: -10.5 },{ x:10.5, y: 0},{ x: 6.5, y: 5.5 },{ x: 2.5, y: 7.5},{ x: -1.5, y: 6.5},{ x: 1.5, y: 6.5},{ x: 5.5, y: 4.5 },{ x: 9.5, y: 0},{ x: 9.5, y: -9.5 },{ x: -9.5, y: -9.5 },{ x: -9.5, y: 0 },{ x: -5.5, y: 4.5 }]},"loftLine":{"type":"LINE3D", "parts":[2], "points":posArray},"chamfer":"5","lonlat":"TRUE"
};
var url = "http://10.10.4.82:8090/iserver/services/spatialAnalysis-test/restjsr/spatialanalyst/geometry/3d/loft.json?returnContent=true";
var queryData = JSON.stringify(sqlParameter);$.ajax({type: "post",url: url,data: queryData,success: function (result) {var geometry = result.geometry;if (!geometry) {return;}var buffer = new Uint8Array(geometry.model).buffer;var position = geometry.position;var color = Cesium.Color.GRAY;s3mInstanceColc.add('visibleBody', {position: Cesium.Cartesian3.fromDegrees(position.x, position.y, position.z+10),color: color,attributes: 'test'}, buffer);viewer.flyTo(s3mInstanceColc);},error: function (msg) {console.log(msg);},
})

在这里插入图片描述

2、根据隧道给地形挖洞

2.1、去除挖洞封边效果,去除侧面与底面贴图
scene.globe.showExcavationSide = false;
scene.globe.excavationBottomTextureUrl = null;
scene.globe.excavationSideTextureUrl = null;

2.2、开挖方案

在这里插入图片描述
从图中可以看出,隧道口被堵死,我们需要拿到隧道与地形相交部分的节点坐标,然后将地形挖开。所以关键步骤就是如何得到相交坐标,如下图所示:
在这里插入图片描述
第一步获取隧道截面坐标(红色点),第二步利用隧道方向向量,绘制出基于截面坐标且平行与隧道的线段(通视分析),第三步得到线段与地形的交点(蓝色点),第四步用得到的交点坐标将地形挖开

2.3、获取截面坐标点(红色点)

①在构建隧道模型时,我们可以根据传入的平面坐标,计算每个端点与中心点的距离
②在绘制隧道走向时,我们根据绘制坐标计算出隧道的方向向量,从而获取线的角度,在这个角度基础上±90°,得到隧道垂直方向,方向+距离即可计算出目标点的世界坐标。利用不同距离得到多个点坐标,再给各个点设置高度,即可得到所有的隧道截面世界坐标。向量与角度的计算可以参考这篇文章:Cesium计算向量、角度、距离
关键代码:

this.getPointByDirectionAndLen = function (position, angle, len) {let matrix = Cesium.Transforms.eastNorthUpToFixedFrame(position);let mz = Cesium.Matrix3.fromRotationZ(Cesium.Math.toRadians(angle));let rotationZ = Cesium.Matrix4.fromRotationTranslation(mz);Cesium.Matrix4.multiply(matrix, rotationZ, matrix);let result;result = Cesium.Matrix4.multiplyByPoint(matrix,new Cesium.Cartesian3(0, len, 0),new Cesium.Cartesian3());return result;
};

2.4、获取开挖点(蓝色点)

经过上面的步骤,我们已经得到隧道截面坐标(下图中C坐标)、隧道线向量(AB)。根据公式:D坐标-C坐标 = 向量AB
可以得到D坐标
在这里插入图片描述
得到C、D坐标后,使用通视分析(sightline)得到观察点C到目标点D,之间与地形的障碍点;依次对每个截面坐标做以上操作,即可得到所有障碍点
关键代码:

this.getBarrierArray = function (LonLatArr,sightline) {let pointA = new Cesium.Cartesian3.fromDegrees(posArray[0].x,posArray[0].y,posArray[0].z);let pointB = new Cesium.Cartesian3.fromDegrees(posArray[1].x,posArray[1].y,posArray[1].z);let index = 0;//向量ABconst positionvector = Cesium.Cartesian3.subtract(pointB, pointA, new Cesium.Cartesian3());myfun(index);let BarrierArray = [];function myfun(index){if(index < LonLatArr.length){let cart = new Cesium.Cartesian3.fromDegrees(LonLatArr[index][0], LonLatArr[index][1], LonLatArr[index][2]);let posD = {x: cart.x + positionvector.x,y: cart.y + positionvector.y,z: cart.z + positionvector.z};let thisArray = [];thisArray.push(cart);thisArray.push(posD);var name = "point" + index;sightline.viewPosition = Cartesian2toDegrees(thisArray[0]);sightline.addTargetPoint({position: Cartesian2toDegrees(thisArray[1]),name: name});setTimeout(()=>{let barrp = sightline.getBarrierPoint(name);console.log(barrp);if(!barrp.isViewer){BarrierArray.push(barrp.position.longitude * (180/Math.PI));BarrierArray.push(barrp.position.latitude * (180/Math.PI));BarrierArray.push(barrp.position.height);}sightline.removeAllTargetPoint();},30);index++;setTimeout(()=>{myfun(index)},40)}}function Cartesian2toDegrees(position) {var cartographic = Cesium.Cartographic.fromCartesian(position);var longitude = Cesium.Math.toDegrees(cartographic.longitude);var latitude = Cesium.Math.toDegrees(cartographic.latitude);var height = cartographic.height;return [longitude, latitude, height];}return BarrierArray
};

2.5、地形开挖

得到所有障碍点后,通过这些点进行地形开挖

viewer.scene.globe.addExcavationRegion({name: 'ggg',position: brruipos,height: dep,transparent: false
});

范例:

链接:https://pan.baidu.com/s/1sDwfmI6hBFIS3eCt7tBGug
提取码:6655

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

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

相关文章

「数据架构」MDM实现失败的主要原因

我经常参与一个组织的MDM程序&#xff0c;当他们在一个失败的项目之后向InfoTrellis请求帮助进行清理&#xff0c;或者开始尝试X&#xff0c;以实现对某些人来说非常困难的目标时。主数据管理实现失败的原因有很多&#xff0c;但是没有一个是由于在这些场景中使用的责备游戏的原…

win11安装双系统ubuntu20.04指导

目录 一、制作U盘启动盘二、硬盘分区2.1方法2.2分区过程 三、安装系统3.1进入U盘启动3.2安装ubuntu3.3设置启动项 四、更新软件五、遇到的问题5.1不能连接WIFI 电脑型号&#xff1a;联想拯救者Y7000P 2023 无线网卡型号&#xff1a;WIFI 6E AX211 160MHz 系统版本&#xff1a;w…

【15】SCI易中期刊推荐——电子电气 | 仪器仪表(中科院4区)

💖💖>>>加勒比海带,QQ2479200884<<<💖💖 🍀🍀>>>【YOLO魔法搭配&论文投稿咨询】<<<🍀🍀 ✨✨>>>学习交流 | 温澜潮生 | 合作共赢 | 共同进步<<<✨✨ 📚📚>>>人工智能 | 计算机视觉…

ADKEY多按键制作阻值选择

参考链接 (10条消息) 【物尽其用】ADKEY多按键制作与经验分享_SimpleJY的博客-CSDN博客https://blog.csdn.net/qq_31247231/article/details/81013459其中的阻值选择经过仿真电路 仿真结果如下表 按键序号ad值键值差0409337113722907228151813263458742047975195028261668657…

轻量级「行泊一体」爆发前夜!这家智驾Tier1正加码抢占市场

伴随行泊一体成为产业演进的确定性趋势&#xff0c;如何踩准市场爆发的节奏成为重中之重。 高工智能汽车注意到&#xff0c;行泊一体当前呈分层发展趋势&#xff0c;从底层SOC算力划分&#xff1a;其一&#xff0c;5-20TOPS轻量级平台&#xff0c;提供基础L2级行车泊车需求&am…

网络原理(四):传输层协议 TCP/UDP

目录 应用层 传输层 udp 协议 端口号 报文长度&#xff08;udp 长度&#xff09; 校验和 TCP 协议 确认应答 超时重传 链接管理 滑动窗口 流量控制 拥塞控制 延时应答 捎带应答 总结 我们第一章让我们对网络有了一个初步认识&#xff0c;第二章和第三章我们通…

vue js 自定义指令 点击自身元素外触发事件 点击自身元素外隐藏自身

1、需求背景 自定义的搜索栏&#xff0c;点击红框以外的元素或区域时&#xff0c;关闭红框&#xff0c;类似弹窗的遮罩&#xff0c;点击遮罩就关闭弹窗。 2、实现代码 2.1 创建clickOutside.js文件 新建一个文件夹directive&#xff08;专门放置一些指令文件&#xff09;&…

chatGPT账号apikey码-chatGPT 免费APIKEY

ChatGPT API Key免费吗 ChatGPT使用的API密钥可以免费获取&#xff0c;但是其使用可能会受到一些限制。具体而言&#xff0c;根据你所使用的API提供者和服务级别&#xff0c;免费的API密钥可能会受到以下限制&#xff1a; 次数限制&#xff1a;某些API可能会限制您的API调用次…

Linux运维之初识shell

一.补充知识点 1.系统定时任务 系统定时任务需要用到crontab命令&#xff0c;但是使用此命令有一个前提&#xff0c;即需要打开crond服务。为了不那么复杂&#xff0c;可以直接使用我之前学的systemctl命令重新启动crond服务。 语法&#xff1a;crontab [-e -l -r] 选项&am…

《编码——隐匿在计算机软硬件背后的语言》精炼——第13-14章(二进制减法器——1位存储器)

“成功不是最终的&#xff0c;失败不是致命的&#xff0c;勇气才是最关键的。” - 温斯顿丘吉尔 文章目录 如何实现减法计算机进行减法运算的逻辑借位的代替机制二进制下的替代机制 减法的电路实现 反馈与触发器电铃触发器R-S触发器 电平触发的D型触发器 如何实现减法 计算机进…

工具链和其他-Web服务器和实例caddy

目录 web服务器介绍 web服务器需要哪些能力&#xff1f;以caddy为例 web server&#xff08;用户发请求它返回网页&#xff09; 代理&#xff08;proxy&#xff09; 缓存&#xff08;cache&#xff09; 日志&#xff08;logging&#xff09; API网关&#xff08;api gatewa…

RF技术设计的机械数码一体化防盗锁

机械数码一体化防盗锁在传统锁具的基础上增加了一个受控的弹子&#xff0c;只能通过设置过的合法钥匙开启&#xff0c;并且增加了防盗报警功能。本文介绍了基于PIC单片机、RF技术和无线数据传输技术的机械数码一体化防盗锁的设计。 引言 机械锁和数码锁是我们日常生活中最常见的…

本地Linux服务器安装宝塔面板,并公网远程登录

文章目录 前言1. 安装宝塔2. 安装cpolar内网穿透3. 远程访问宝塔4. 固定http地址5. 配置二级子域名6. 测试访问二级子域名 前言 宝塔面板作为建站运维工具&#xff0c;它支持一键LAMP/LNMP/集群/监控/网站/FTP/数据库/JAVA等100多项服务器管理功能&#xff0c;可提高运维效率。…

Python每日一练(20230427)

目录 1. 三数之和 &#x1f31f;&#x1f31f; 2. 编辑距离 &#x1f31f;&#x1f31f;&#x1f31f; 3. 翻转字符串里的单词 &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏…

SparkStreaming学习——读取socket的数据和kafka生产者的消息

目录 一、Spark Streaming概述 二、添加依赖 三、配置log4j 1.依赖下载好后打开IDEA最左侧的外部库 2.找到spark-core 3.找到apache.spark目录 4.找到log4j-defaults.properties文件 5.将该文件放在资源目录下&#xff0c;并修改文件名 6.修改log4j.properties第19行的…

通达信结构紧凑形态选股公式编写思路

在威廉欧奈尔的《笑傲股市》、马克米勒维尼的《股票魔法师》等书籍中都有结构紧凑形态的相关描述&#xff0c;股票在形成基底时&#xff0c;价格波动幅度逐渐减小&#xff0c;量能逐步萎缩&#xff0c;同时价格相对强度较高。 结构紧凑的形态通过眼睛观察&#xff0c;一般可以…

搭建家庭影音媒体中心 --公网远程连接Jellyfin流媒体服务器

文章目录 前言1. 安装Home Assistant2. 配置Home Assistant3. 安装cpolar内网穿透3.1 windows系统3.2 Linux系统3.3 macOS系统 4. 映射Home Assistant端口5. 公网访问Home Assistant6. 固定公网地址6.1 保留一个固定二级子域名6.2 配置固定二级子域名 转载自远程穿透的文章&…

如何编写高质量代码、提高编程效率?

一、 前言 高质量代码是指在满足功能需求的基础上&#xff0c;具备高性能、安全、可扩展、易维护、可测试等特点的代码。它不仅可以提高开发效率和代码质量&#xff0c;更能有效减少代码维护成本&#xff0c;促进团队协作和项目成功。因此&#xff0c;编写高质量代码对程序员来…

CHAPTER 5: 《DESIGN CONSISTENT HASHING》 第5章 《设计一致的哈希》

CHAPTER 5: DESIGN CONSISTENT HASHING 为了实现水平扩展&#xff0c;有效且均匀地分发请求/数据是很重要的在服务器上。一致散列是实现这一目标的常用技术。但首先&#xff0c;让我们深入了解一下这个问题。 重组问题 如果您有n个缓存服务器&#xff0c;那么平衡负载的常用…

【LeetCode】297. 二叉树的序列化与反序列化

1.问题 序列化是将一个数据结构或者对象转换为连续的比特位的操作&#xff0c;进而可以将转换后的数据存储在一个文件或者内存中&#xff0c;同时也可以通过网络传输到另一个计算机环境&#xff0c;采取相反方式重构得到原数据。 请设计一个算法来实现二叉树的序列化与反序列…