iClient3D for Cesium 实现限高分析

devtools/2024/12/23 8:30:27/

作者:gaogy

1、背景

随着地理信息技术的发展,三维地球技术逐渐成为了许多领域中的核心工具,尤其是在城市规划、环境监测、航空航天以及军事领域。三维地图和场景的应用正在帮助人们更加直观地理解空间数据,提供更高效的决策支持。

iClient3D for Cesium 是由 SuperMap 提供的一款开发工具,旨在将三维地理信息系统 (3D GIS) 技术应用于大规模的地理信息可视化与分析,帮助开发者通过 Web 平台展示三维地图,还提供了强大的数据分析功能,包括对建筑物、地形、设施等的空间分析。

限高分析是地理信息系统中的一种常见分析需求,特别是在城市规划与建筑设计中,限高分析能够帮助规划人员确保建筑物在设计过程中不会超过法规规定的高度限制,并避免与其他建筑物或设施发生冲突。通过限高分析,开发者可以根据地形、建筑物高度等条件,动态计算和展示特定区域内的限高区域。

本文将利用 iClient3D for Cesium 实现三维场景下得限高分析功能,帮助用户在三维地图中直观地分析和展示限高区域,从而在建筑设计和城市规划过程中提供有效的决策依据。

2、限高分析效果演示

iClient3D for Cesium 实现限高分析

3、实现过程

3.1、项目环境

本文采用Vite6 + Vue3.5 + iClient3D for Cesium(2024) 框架实现,项目具体使用依赖如下:

{"vue": "^3.5.13","element-plus": "^2.9.1","vite": "^6.0.1"
}

3.2、初始化三维场景

function initViewer() {window.viewer = new Cesium.Viewer('cesiumContainer', { infoBox: false })viewer.scene.addS3MTilesLayerByScp('http://www.supermapol.com/realspace/services/3D-dynamicDTH/rest/realspace/datas/Config%20-%201/config',{ name: 's3mLayer' })viewer.scene.camera.setView({destination: new Cesium.Cartesian3(-2623004.4174251584, 3926981.958360567, 4287374.829655093),orientation: {heading: 4.39611370540786,pitch: -0.43458664812464143,roll: 2.0174972803488345e-11}})
}

3.3、利用iServer Data 服务查询,并绘制 Entity 面

async function queryByGeometry(queryGeometry) {const queryObj = {getFeatureMode: 'SPATIAL',spatialQueryMode: 'CONTAIN',datasetNames: ['铁岭矢量面:New_Region3D_1'],hasGeometry: true,geometry: { points: queryGeometry, type: 'REGION' }}try {const response = await fetch('http://www.supermapol.com/realspace/services/data-dynamicDTH/rest/data/featureResults.geojson?returnContent=true',{method: 'POST',headers: { 'Content-Type': 'application/json' },body: JSON.stringify(queryObj)})const data = await response.json()data.features.forEach((feature) => {if (feature.geometry.type === 'Polygon') {const lonLatArr = []feature.geometry.coordinates[0].forEach((coord) => lonLatArr.push(...coord))const entity = viewer.entities.add({id: `identify-area-${feature.id || Date.now()}`,name: '单体化标识面',polygon: {hierarchy: Cesium.Cartesian3.fromDegreesArray(lonLatArr),material: new Cesium.Color(1.0, 0.0, 0.0, 0.6),classificationType: Cesium.ClassificationType.S3M_TILE, // 贴在 S3M 模型表面groundBottomAltitude: height.value,groundExtrudedHeight: 500},info: feature.properties})entities.push(entity)}})} catch (error) {throw new error(error.message)}
}

Cesium__DrawHandler__97">3.4、使用 Cesium 的 DrawHandler 绘制限高分析区域

const handlerPolygon = new Cesium.DrawHandler(viewer, Cesium.DrawMode.Polygon)
handlerPolygon.drawEvt.addEventListener((result) => {handlerPolygon.polygon.show = falsehandlerPolygon.polyline.show = falseconst positions = result.object.positionsconst geometries = []let minLongitude = Infinitylet maxLongitude = -Infinitylet minLatitude = Infinitylet maxLatitude = -Infinitypositions.forEach((position) => {const cartographic = Cesium.Cartographic.fromCartesian(position)const longitude = Cesium.Math.toDegrees(cartographic.longitude)const latitude = Cesium.Math.toDegrees(cartographic.latitude)minLongitude = Math.min(minLongitude, longitude)maxLongitude = Math.max(maxLongitude, longitude)minLatitude = Math.min(minLatitude, latitude)maxLatitude = Math.max(maxLatitude, latitude)})const rectangle = Cesium.Rectangle.fromDegrees(minLongitude, minLatitude, maxLongitude, maxLatitude)const southWest = { x: minLongitude, y: minLatitude }const southEast = { x: maxLongitude, y: minLatitude }const northEast = { x: maxLongitude, y: maxLatitude }const northWest = { x: minLongitude, y: maxLatitude }geometries.push(southWest, southEast, northEast, northWest)entity = viewer.entities.add({rectangle: {coordinates: rectangle,height: height.value,material: new Cesium.Color(1.0, 1.0, 1.0, 0.5),outline: true,outlineColor: Cesium.Color.RED}})queryByGeometry(geometries)
})

注意,这里是根据绘制的几何面的外接矩形作为限高分析的范围区域,如有其他需要可自行更改分析区域

3.5、动态调整限高高度

function changeHeight() {if (entity) entity.rectangle.height = height.valuefor (const entity of entities) {if (entity) entity.polygon.groundBottomAltitude = height.value}
}

height 为 vue 的 ref 对象,利用 vue 双向绑定指令可实现动态修改分析范围面的高度;而分析结果的楼栋 entity 对象,则可以通过修改其 groundBottomAltitude 属性,动态修改其高度,实现限高分析。

3.6、点击分析结果展示属性信息

const pickHandler = new Cesium.ScreenSpaceEventHandler(window.viewer.scene.canvas)
pickHandler.setInputAction((event) => {const feature = window.viewer.scene.pick(event.position)if (Cesium.defined(feature)) {if (Object.prototype.hasOwnProperty.call(feature, 'id') && feature.id instanceof Cesium.Entity) {if (feature.id._id.startsWith('identify-area')) {const entity = viewer.entities.getById(feature.id._id)tableData.value = Object.keys(entity.info).map((key) => {return { name: key, info: entity.info[key] }})showInfo.value = true}}}
}, Cesium.ScreenSpaceEventType.LEFT_CLICK)

4、总结

本文借鉴SuperMap iClientD for Cesium官网的动态单体化示例(support.supermap.com.cn:8090/webgl/Cesium/examples/webgl/editor.html#dynamicDTH), 通过修改entity 的 groundBottomAltitude 属性,动态修改其高度,实现限高分析,能够动态的展示超过限高高度的具体楼栋,并能展示其属性信息,从而在建筑设计和城市规划过程中为决策者提供有效的决策依据。

本文完整Vue代码可在https://download.csdn.net/download/supermapsupport/90151388下载参考


http://www.ppmy.cn/devtools/144635.html

相关文章

入侵他人电脑,实现远程控制(待补充)

待补充 在获取他人无线网网络密码后,进一步的操作是实现入侵他人电脑,这一步需要获取对方的IP地址并需要制作自己的代码工具自动化的开启或者打开对方的远程访问权限。 1、获取IP地址(通过伪造的网页、伪造的Windows窗口、hook,信…

零基础微信小程序开发——小程序的宿主环境(保姆级教程+超详细)

🎥 作者简介: CSDN\阿里云\腾讯云\华为云开发社区优质创作者,专注分享大数据、Python、数据库、人工智能等领域的优质内容 🌸个人主页: 长风清留杨的博客 🍃形式准则: 无论成就大小,…

redis开发与运维-redis02-redis数据类型与命令总结

文章目录 【README】【1】redis通用命令与数据结构【1.1】通用命令【1.2】数据结构与内部编码【1.3】redis单线程架构【1.3.1】redis单线程优缺点 【2】字符串(值的类型为字符串)【2.1】常用命令【2.1.1】设置值【2.1.2】获取值【2.1.3】批量设置值【2.1…

AI应用-本地模型实现AI生成PPT(简易版)

文章目录 前言技术栈效果展示 一、实现思路二、实现步骤1.本地安装marp-cli2.后端实现3.前端实现 三、代码地址及说明 前言 在许多项目中,生成 PPT 是常见的需求,尤其在教育和报告展示中。传统的生成 PPT 的方法需要手动创建,而使用生成模型…

支付域——清结算系统体系

摘要 本文深入探讨了支付清算的基础知识和跨机构清算原理,涵盖了组织、账户、支付工具和系统的基础,支付流程的模型,以及支付清算的全局实现。文章还详细介绍了支付机构的五大业务和支付系统的总架构,并通过案例分析了支付清算的…

【原生js案例】移动端如何实现页面的入场和出场动画

好的css动画,能给用户体验带来很大的提升,同时也能增加app的趣味性,给人眼前一亮的感觉。那如何实现这种全屏的弹窗入场和退场的动画 实现效果 代码实现 UI样式美化 #musicDetails{width: 100%;height: 100%;top:0;left:0;position: absol…

聊聊开源的虚拟化平台--PVE

原文链接:聊聊开源的虚拟化平台–PVE PVE(Proxmox Virtual Environment)是一种开源的虚拟化平台,支持容器化(LXC)和虚拟机(KVM),可用于创建和管理虚拟化环境。它基于Debi…

【Linux系统编程】:信号(2)——信号的产生

1.前言 我们会讲解五种信号产生的方式: 通过终端按键产生信号,比如键盘上的CtrlC。kill命令。本质上是调用kill()调用函数接口产生信号硬件异常产生信号软件条件产生信号 前两种在前一篇文章中做了介绍,本文介绍下面三种. 2. 调用函数产生信号 2.1 k…