vue3+SuperMap iClient3D for Cesium实现可视域分析功能

这篇具有很好参考价值的文章主要介绍了vue3+SuperMap iClient3D for Cesium实现可视域分析功能。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本人小白一枚,文章如有问题还请各位大神评论区指出。整体实现是参考SuperMap iClient3D for Cesium的可视域分析功能源码~

文章目录

前言

一、主要功能

二、使用步骤

1.HTML主要结构

2.javascript


前言

SuperMap iClient3D for Cesium中的ViewShed3D类提供了可视域分析,设置观察点、目标的位置,水平、垂直视角范围,建立可视区域分析并在指定的场景中显示分析结果的功能。具体下方代码都有详细注释。

一、主要功能

效果图: 

cesium 可视域分析插件,Cesium,supermap,vue,3d,elementui,javascript

较官网示例去掉了环境设置及裁剪功能(个人感觉比较鸡肋),增加了拖动滑块动态修改可视域参数功能。文章来源地址https://www.toymoban.com/news/detail-557551.html

二、具体实现

1.HTML主要结构

    <div id="content">
      <p class="angletext">水平视角 (单位:度)</p>
      <el-slider
        id="horizontalFov"
        show-input
        size="small"
        :min="10"
        :max="179"
        v-model="viewModel.horizontalFov"
      />
      <p class="angletext">垂直视角 (单位:度)</p>
      <el-slider
        id="verticalFov"
        show-input
        size="small"
        :min="10"
        :max="90"
        v-model="viewModel.verticalFov"
      />
      <p class="angletext">俯仰角 (单位:度)</p>
      <el-slider
        id="pitch"
        show-input
        size="small"
        :min="0"
        :max="90"
        v-model="viewModel.pitch"
      />
      <p class="angletext">可视距离 (单位:米)</p>
      <el-slider
        id="distance"
        show-input
        size="small"
        :min="1"
        :max="10000"
        v-model="viewModel.distance"
      />
      <el-button type="primary" @click="addView">创建可视域</el-button>
      <el-button type="primary" @click="clear">清除可视域</el-button>
    </div>

2.javascript

<script setup>
import { reactive, watchEffect, onBeforeUnmount } from "vue";
import { useStore } from "vuex";

const store = useStore();
let viewer = window.viewer;
let scene = viewer.scene;
let viewPosition; //鼠标绘制的点
if (!scene.pickPositionSupported) {
  alert("不支持深度纹理,可视域分析功能无法使用(无法添加观测)!");
}
// 先将此标记置为true,不激活鼠标移动事件中对可视域分析对象的操作
scene.viewFlag = true;
//创建绘制处理器对象类。
var pointHandler = new Cesium.DrawHandler(viewer, Cesium.DrawMode.Point);
// 创建可视域分析对象
var viewshed3D = new Cesium.ViewShed3D(scene); //可视域分析,设置观察点、目标的位置,水平、垂直视角范围,建立可视区域分析并在指定的场景中显示分析结果。
//处理用户输入事件。
var handler = new Cesium.ScreenSpaceEventHandler(scene.canvas);
// 声明可视域参数(只选取了部分)
let viewModel = reactive({
  pitch: 0, //相机俯仰角
  distance: 500, //可视距离
  verticalFov: 60, //垂直视角范围
  horizontalFov: 80, //水平视角范围
});

//绘制完成事件,监听绘制完成的事件,获取当前绘制结果。
pointHandler.drawEvt.addEventListener(function (result) {
  var point = result.object;
  var position = point.position;
  viewPosition = position; //鼠标绘制点赋值

  // 将获取的点的位置转化成经纬度
  var cartographic = Cesium.Cartographic.fromCartesian(position); //根据笛卡尔坐标(Cartesian3)位置创建一个Cartographic实例。结果数据以弧度为单位。
  //将弧度转换为度
  var longitude = Cesium.Math.toDegrees(cartographic.longitude);
  var latitude = Cesium.Math.toDegrees(cartographic.latitude);
  var height = cartographic.height + 1.8;
  point.position = Cesium.Cartesian3.fromDegrees(longitude, latitude, height);

  if (scene.viewFlag) {
    // 设置视口位置
    viewshed3D.viewPosition = [longitude, latitude, height]; //观测点位置
    viewshed3D.build();
    // 将标记置为false以激活鼠标移动回调里面的设置可视域操作
    scene.viewFlag = false;
  }
});

// 鼠标移动时回调
handler.setInputAction(function (e) {
  // 若此标记为false,则激活对可视域分析对象的操作
  if (!scene.viewFlag) {
    //获取鼠标屏幕坐标,并将其转化成笛卡尔坐标
    var position = e.endPosition;
    var last = scene.pickPosition(position); //位置拾取,根据窗口坐标,从场景的深度缓冲区中拾取相应的位置,返回笛卡尔坐标,需要支持深度纹理。

    //计算该点与视口位置点坐标的距离
    var distance = Cesium.Cartesian3.distance(viewPosition, last);

    // 将鼠标当前点坐标转化成经纬度
    var cartographic = Cesium.Cartographic.fromCartesian(last);
    var longitude = Cesium.Math.toDegrees(cartographic.longitude);
    var latitude = Cesium.Math.toDegrees(cartographic.latitude);
    var height = cartographic.height;
    voluation();
    viewshed3D.setDistDirByPoint([longitude, latitude, height]);
  }
}, Cesium.ScreenSpaceEventType.MOUSE_MOVE);

// 鼠标右键事件回调
handler.setInputAction(function (e) {
  //不再执行鼠标移动事件中对可视域的操作
  scene.viewFlag = true;
  voluation();
}, Cesium.ScreenSpaceEventType.RIGHT_CLICK);

//赋值
function voluation() {
  viewshed3D.pitch = viewModel.pitch;
  viewshed3D.distance = viewModel.distance;
  viewshed3D.horizontalFov = viewModel.horizontalFov;
  viewshed3D.verticalFov = viewModel.verticalFov;
}
//创建可视域
function addView() {
  if (pointHandler.active) {
    return;
  }
  //清除之前的可视域分析
  clear();
  //激活绘制点类
  pointHandler.activate();
}
//移除可视域
function clear() {
  viewshed3D.distance = 0.0000001;
  viewshed3D = new Cesium.ViewShed3D(scene); //初始化
  scene.viewFlag = true;
  pointHandler.clear();
}

//监听可视域参数变化
watchEffect(() => {
  voluation();
});

//销毁
onBeforeUnmount(() => {
  clear();
  pointHandler.deactivate();
});
</script>

到了这里,关于vue3+SuperMap iClient3D for Cesium实现可视域分析功能的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SuperMap iClient3D 11i (2023) SP1 for Cesium之移动实体对象

     作者:nannan 目录 前言 一、代码思路 1.1 绘制面实体对象 1.2 鼠标左键按下事件 1.3 鼠标移动事件 1.4 鼠标左键抬起事件 二、运行效果 三、注意事项        SuperMap 官网三维前端范例 编辑线面,可以对面实体对象的节点进行增加、删除以及修改位置。那可不可以整个线/面对

    2024年02月09日
    浏览(53)
  • SuperMap iClient3D for WebGL查询地图栅格值

    栅(shān)格数据就是将空间分割成有规律的网格,每一个网格称为一个单元,并在各单元上赋予相应的属性值来表示实体的一种数据形式。每一个单元(像素)的位置由它的行列号定义,所表示的实体位置隐含在栅格行列位置中,数据组织中的每个数据表示地物或现象的非几何

    2024年02月04日
    浏览(52)
  • 【超图】SuperMap iClient3D for WebGL/WebGPU ——颜色(1)

    作者:taco         在项目中通常会出现,高亮对象。给对象设置颜色的一些问题。那么针对颜色设置在超图的 iClient3D for WebGl/WebGPU 中又提供了哪些方式呢?本篇文章将介绍一些颜色的设置方法。以及一些颜色的参数设置。         在iClient3D for WebGl/WebGPU 中主要以Supe

    2024年02月04日
    浏览(57)
  • 【超图】SuperMap iClient3D for WebGL/WebGPU —— 坐标系&位置 —— Cartesian2

    作者:taco         说到关于地理必然逃不开位置的关系。借用百度百科的内容来说 地理学(geography) ,是研究地球表层 空间地理 要素或者地理综合体 空间分布规律 、时间演变过程和 区域 特征的一门学科。 所以 位置坐标系 必然逃不掉了。那么在SuperMap iClient3D for Web

    2024年01月16日
    浏览(53)
  • iClient3D for Cesium&WebGL入门之使用vscode以服务方式运行调试

    作者:超图研究院技术支持中心-于丁 iClient3D for CesiumWebGL入门之使用vscode以服务方式运行调试 相信大家第一次使用SuperMap iClient3D for Cesium或SuperMap iClient3D for WebGL的时候,都遇到过和我一样的事情: 在文件夹中直接打开html的示例代码文件于浏览器中; 或者使用vscode安装open

    2024年02月04日
    浏览(53)
  • Mars3D/Cesium + VUE3

    不定期更新 参考官网: http://mars3d.cn/dev/guide/start/import.html#_3-3-vite-%E6%8A%80%E6%9C%AF%E6%A0%88%E6%97%B6-%E7%9A%84%E9%A1%B9%E7%9B%AE%E9%85%8D%E7%BD%AE%E4%BF%AE%E6%94%B9 :已亲测vite框架,可以运行,具体见下main 1、插件 vite-plugin-mars3d vite中需要

    2024年02月14日
    浏览(48)
  • 超图iClient3DforCesium地形、影像、模型、在线影像交互示例

    数据源:基于iserver发布的三维场景(地形、影像、BIM模型) + 在线arcgis影像 应用:目录树展示源数据列表、目录树控制源数据可视化结果显隐、BIM模型点选查询关联属性

    2024年02月03日
    浏览(48)
  • SuperMap Hi-Fi 3D SDK for Unreal问题集锦

    ###前言 使用SuperMap Hi-Fi 3D SDK for Unreal,会遇到一些崩溃或者加加载不上等问题,本文档手收集记录一些使用过程总可能会遇到的一些问题并给予相应的解决方案,很多问题新版本已做优化,推荐大家可使用前,可在http://support.supermap.com.cn/DownloadCenter/ProductPlatform.aspx 地址下载最

    2024年02月06日
    浏览(58)
  • SuperMap Hi-Fi 3D SDK for Unity基础开发教程

    作者:kele 众所周知,游戏引擎(Unity)功能强大,可以做出很多炫酷的游戏和动画效果,这部分功能的实现往往不仅仅是靠可视化界面就能够实现的,还需要代码开发。SuperMap Hi-Fi SDKS for Unity游戏引擎插件能够实现地理数据与游戏引擎相结合,碰撞出更绚烂的火花,目前Sup

    2024年02月03日
    浏览(50)
  • SuperMap Hi-Fi 3D SDK for Unity设置渲染范围

    kele     在三维项目中经常会使用到大屏,有可能会用到4K屏、8K屏、长屏、带鱼屏等高分辨率的屏幕,这些屏幕的其中一个特点是其长宽比比较大,有些时候会是几块16:9的屏幕横向拼接而成,这就使得这整个屏幕在水平方向上跨度很大,渲染内容增加。通常情况下会是

    2024年02月09日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包