iClient3D for Cesium 实现限高分析

news2024/12/24 10:32:03

作者: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)
  }
}

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

const handlerPolygon = new Cesium.DrawHandler(viewer, Cesium.DrawMode.Polygon)
handlerPolygon.drawEvt.addEventListener((result) => {
  handlerPolygon.polygon.show = false
  handlerPolygon.polyline.show = false
  const positions = result.object.positions
  const geometries = []
  let minLongitude = Infinity
  let maxLongitude = -Infinity
  let minLatitude = Infinity
  let maxLatitude = -Infinity
  positions.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.value
  for (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.coloradmin.cn/o/2264673.html

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

相关文章

Sigrity Optimize PI CapGen仿真教程文件路径

为了方便读者能够快速上手和学会Sigrity Optimize PI和 Deacap Generate 的功能,将Sigrity Optimize PI CapGen仿真教程专栏所有文章对应的实例文件上传至以下路径 https://download.csdn.net/download/weixin_54787054/90171471?spm1001.2014.3001.5503

免费线上签字小程序,开启便捷电子签名

虽如今数字化飞速发展的时代,但线上签名小程序的开发制作却并非易事。需要攻克诸多技术难题,例如确保签名的真实性与唯一性,防止签名被伪造或篡改。 要精准地捕捉用户手写签名的笔迹特征,无论是笔画的粗细、轻重,还是…

02、服务器的分类和开发项目流程

硬件介绍 1、服务器分类2.开发流程 1、服务器分类 1.1 服务器分类 1u服务器(u表示服务器的厚度) 1U4.45cm; 4u服务器(u表示服务器的厚度) , 服务器有两个电源模块,接在不同的电源,…

canvas绘制仪表盘刻度盘

canvas画布可以实现在网页上绘制图形的方法,比如图表、图片处理、动画、游戏等。今天我们在vue模板下用canvas实现仪表盘的绘制。 对canvas不熟悉的同学可以先了解下canvas的API文档:canvas API中文网 - Canvas API中文文档首页地图 一、创建模板&#…

搭建Alist(Windows系统环境下的)并挂载阿里云盘open映射到公网

文章目录 前言1. 使用Docker本地部署Alist1.1 本地部署 Alist1.2 访问并设置Alist1.3 在管理界面添加存储 2. 安装cpolar内网穿透 前言 本文将讲解如何在 Windows 系统中借助 Docker 部署 Alist 这一强大的全平台网盘工具,并结合 cpolar 内网穿透,实现随…

【QT常用技术讲解】发送POST包(两种方式:阻塞方式及非阻塞方式)

前言 http/https(应用层)协议是广泛使用的网络通信协议。在很多与第三方API对接的场景中,通常是通过http/https协议完成,比如API对接时,通常要通过POST包获取access_token进行鉴权,然后再进行数据交互(本篇也包含有对接…

【电商搜索】文档的信息论生成聚类

【电商搜索】文档的信息论生成聚类 目录 文章目录 【电商搜索】文档的信息论生成聚类目录文章信息概览研究背景技术挑战如何破局技术应用主要相关工作与参考文献后续优化方向 后记 文章信息 https://arxiv.org/pdf/2412.13534 概览 本文提出了一种基于信息论的生成聚类&#…

【数据结构与算法】排序算法(下)——计数排序与排序总结

写在前面 书接上文:【数据结构与算法】排序算法(中)——交换排序之快速排序 文章主要讲解计数排序的细节与分析源码。之后进行四大排序的总结。 文章目录 写在前面一、计数排序(非比较排序)代码的实现: 二、排序总结 2.1、稳定性 3.2、排序算法复杂度及…

Unity全局雾效

1、全局雾效是什么 全局雾效(Global Fog)是一种视觉效果,用于在3D场景中模拟大气中的雾气对远处物体的遮挡 它通过在场景中加入雾的效果,使得距离摄像机较远的物体看起来逐渐被雾气覆盖,从而创造出一种朦胧、模糊的视…

Kafka Streams 在监控场景的应用与实践

作者:来自 vivo 互联网服务器团队- Pang Haiyun 介绍 Kafka Streams 的原理架构,常见配置以及在监控场景的应用。 一、背景 在当今大数据时代,实时数据处理变得越来越重要,而监控数据的实时性和可靠性是监控能力建设最重要的一环…

数据分析思维(五):分析方法——假设检验分析方法

数据分析并非只是简单的数据分析工具三板斧——Excel、SQL、Python,更重要的是数据分析思维。没有数据分析思维和业务知识,就算拿到一堆数据,也不知道如何下手。 推荐书本《数据分析思维——分析方法和业务知识》,本文内容就是提取…

解读DiffusionNER: Boundary Diffusion for Named Entity Recognition

content 摘要1. 图1图21. 上方:扩散过程与实体边界2. 下方:网络结构(Sentence Encoder Entity Decoder)3. 关键思想小结 摘要 主要内容分为四个部分: 模型定位与基本原理: 提出了DiffusionNER模型将命名…

【QSS样式表 - ⑥】:QPushButton控件样式

文章目录 QPushBUtton控件样式QSS示例 QPushBUtton控件样式 常用子控件 常用伪状态 QSS示例 代码: QPushButton {background-color: #99B5D1;color: white;font-weigth: bold;border-radius: 20px; }QPushButton:hover {background-color: red; }QPushButton:p…

数字经济下的 AR 眼镜

目录 1. 📂 AR 眼镜发展历史 1.1 AR 眼镜相关概念 1.2 市面主流 XR 眼镜 1.3 AR 眼镜大事记 1.4 国内外 XR 眼镜 1.5 国内 AR 眼镜四小龙 2. 🔱 关键技术 2.1 AR 眼镜近眼显示原理 2.2 AR 眼镜关键技术 2.3 AR 眼镜技术难点 3. &#x1f4a…

smb和nfs双栈协议共享目录

1 简介 NFS和SAMBA协议都是文件共享,Linux客户端常用于NFS协议访问远程共享目录,Windows客户端常用于SAMBA协议访问远程共享目录。 2 环境 合计使用三台服务器,服务器都位于同一个子网(10.0.0.0/19)、同一个安全组…

Day13 用Excel表体验梯度下降法

Day13 用Excel表体验梯度下降法 用所学公式创建Excel表 用Excel表体验梯度下降法 详见本Day文章顶部附带资源里的Excel表《梯度下降法》,可以对照表里的单元格公式进行理解,还可以多尝试几次不同的学习率 η \eta η来感受,只需要更改学习率…

Python获取系统负载并打印折线图

#! /opt/py36/bin/python import psutil import matplotlib.pyplot as plt import time# 创建一个空列表,用于存储负载数据 load_data []# 循环收集负载数据 while True:# 获取当前系统负载load_avg psutil.getloadavg()# 将平均负载添加到load_data列表中load_da…

RCE 命令执行漏洞 过滤模式 基本的过滤问题 联合ctf题目进行实践

前言 知道RCE 命令执行分为 代码执行 和 命令执行 原理 : 就是用户的输入被当做命令或者代码执行了 从而造成了危害 代码执行 除了eval php代码执行漏洞的函数还有 eval()、a ssert()、 preg_replace()、 create_function()、 array_map()、 call_user_func(…

Leetcode打卡:考场就坐

执行结果:通过 题目: 855 考场就坐 在考场里,有 n 个座位排成一行,编号为 0 到 n - 1。 当学生进入考场后,他必须坐在离最近的人最远的座位上。如果有多个这样的座位,他会坐在编号最小的座位上。(另外&am…

数据结构(哈希表(上)纯概念版)

前言 在软件开发和计算机科学中,数据结构的选择直接影响到程序的性能和效率。不同的数据结构适用于不同的场景,合理地选择合适的数据结构是高效编程的关键之一。哈希表(哈希表(Hash Table)作为一种高效的键值对存储结…