vue3+vite+superMap(超图)实现通视分析

<template><div><el-dialog draggable destroy-on-close v-if="changeVisibilityState" :modal="false" v-model="changeVisibilityState"close-icon="" title="通视分析" width="20%" :before-close="handleClose" @opened="getIntervisOpen()":close-on-click-modal="false"><div class="el-h-line"><p class="p">观察者信息</p><el-row :gutter="10"><el-col :span="6"><p class="font-big">经度</p></el-col><el-col :span="18"><div class="slider-demo-block"><el-input v-model="longitude" placeholder="显示经度" :disabled="true" /></div></el-col></el-row></div><div class="el-h-line"><el-row :gutter="10"><el-col :span="6"><p class="font-big">纬度</p></el-col><el-col :span="18"><div class="slider-demo-block"><el-input v-model="latitude" placeholder="显示纬度" :disabled="true" /></div></el-col></el-row></div><div class="el-h-line"><el-row :gutter="10"><el-col :span="6"><p class="font-big">高程</p></el-col><el-col :span="18"><div class="slider-demo-block"><el-input v-model="height" placeholder="显示高程" :disabled="true" /></div></el-col></el-row></div><!--可见颜色--><div class="el-h-line"><el-row :gutter="10"><el-col :span="6"><p class="font-big">可见颜色</p></el-col><el-col :span="18"><div class="slider-demo-block"><el-color-picker v-model="visibleColor" @change="visibleColorChange" /></div></el-col></el-row></div><!--不可见颜色--><div class="el-h-line"><el-row :gutter="10"><el-col :span="6"><p class="font-big">不可见颜色</p></el-col><el-col :span="18"><div class="slider-demo-block"><div class="el-demo"><el-color-picker v-model="hiddenColor" @change="hiddenColorChange" /></div></div></el-col></el-row></div><template #footer><span class="dialog-footer"><el-button @click="addObserverPoint">添加观察点</el-button><el-button @click="addTargetPoint">添加目标点</el-button><el-button type="primary" @click="clearVisibility" style="background-color: #1d888b;">清除</el-button></span></template></el-dialog></div>
</template>
<script setup lang="ts">
import { ref, onMounted, onBeforeUnmount } from 'vue'
// 组件传值
import emitter from "../../../utils/bus";
const changeVisibilityState = ref<Boolean>(true)
const longitude = ref()
const latitude = ref()
const height = ref()
const visibleColor = ref('#0e9dec')
const hiddenColor = ref('#ffb200')
const sightlineWidth = ref<number>()
const sightline = ref(null)
// 当前点击状态是否是 添加观察点
const addViewFlag = ref(false)
// 当前点击状态是否是 添加目标点
const addTargetFlag = ref(false)
// 添加的目标点的点号
const num = ref(0)
// 是否能移除目标点
const couldRemove = ref(false)
const handlerPoint = ref(null)
const pointEventHandler = ref(null)
const Cesium = window.Cesiumconst handleClose = (done: () => void) => {done()clearVisibility()
}
// 接受layoutMenu传过来的值
emitter.on("visibilityState", (data: any) => {changeVisibilityState.value = data
});const init = () => {if (!sightline.value) {sightline.value = new Cesium.Sightline(window.viewer.scene)}sightline.value.build()addViewFlag.value = false // 当前点击状态是否是 添加观察点addTargetFlag.value = false // 当前点击状态是否是 添加目标点num.value = 0 // 添加的目标点的点号couldRemove.value = false // 是否能移除目标点
}const addObserverPoint = (): void => {addViewFlag.value = truesightline.value.lineWidth = 5handlerPoint.value = new Cesium.DrawHandler(window.viewer,Cesium.DrawMode.Point)handlerPoint.value.drawEvt.addEventListener((result: object) => {// 添加观察点if (addViewFlag.value) {var point = result.object// point.show = false;var position = result.object.position// 将获取的点的位置转化成经纬度var cartographic = Cartesian2toDegrees(position)longitude.value = cartographic[0]latitude.value = cartographic[1]height.value = cartographic[2]// 设置观察点sightline.value.viewPosition = cartographicaddViewFlag.value = false}handlerPoint.value.deactivate()})if (handlerPoint.value.active) {return}window.viewer.entities.removeAll()if (couldRemove.value) {sightline.value.removeAllTargetPoint()}if (longitude.value && latitude.value && height.value) {sightline.value.viewPosition = [parseFloat(longitude.value), parseFloat(latitude.value), parseFloat(height.value)]addViewFlag.value = false} else {handlerPoint.value.activate()}if (addViewFlag.value || addTargetFlag.value) {window.viewer.enableCursorStyle = falsewindow.viewer._element.style.cursor = ''}
}const addTargetPoint = (): void => {addViewFlag.value = falseaddTargetFlag.value = truesightline.value.visibleColor = Cesium.Color.fromCssColorString(visibleColor.value)sightline.value.hiddenColor = Cesium.Color.fromCssColorString(hiddenColor.value)if (!pointEventHandler.value) {pointEventHandler.value = new Cesium.ScreenSpaceEventHandler(window.viewer.scene.canvas)}if (addViewFlag.value || addTargetFlag.value) {window.viewer.enableCursorStyle = falsewindow.viewer._element.style.cursor = ''}// 鼠标点击事件,添加点pointEventHandler.value.setInputAction((e: any) => {var position = window.viewer.scene.pickPosition(e.position)addTarget(position)}, Cesium.ScreenSpaceEventType.LEFT_CLICK)// 鼠标移动事件,更新点pointEventHandler.value.setInputAction((evt: any) => {if (num.value > 0) {// 鼠标移动,更新最后一次添加的目标点的位置var position = window.viewer.scene.pickPosition(evt.endPosition)sightline.value.removeTargetPoint('point0')var cartographic = Cartesian2toDegrees(position)var flag = sightline.value.addTargetPoint({position: cartographic,name: 'point0'})}}, Cesium.ScreenSpaceEventType.MOUSE_MOVE)// 鼠标右键事件,结束pointEventHandler.value.setInputAction(() => {window.viewer.enableCursorStyle = trueif (pointEventHandler.value) {pointEventHandler.value.removeInputAction(Cesium.ScreenSpaceEventType.MOUSE_MOVE)pointEventHandler.value.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_CLICK)}}, Cesium.ScreenSpaceEventType.RIGHT_CLICK)
}// 添加通视点
const addTarget = (CartesianPosition: object) => {if (addViewFlag.value === false && addTargetFlag.value) {num.value += 1// 将获取的点的位置转化成经纬度var cartographic = Cartesian2toDegrees(CartesianPosition)// 添加目标点var name = 'point' + num.valuevar flag = sightline.value.addTargetPoint({position: cartographic,name: name})couldRemove.value = true}
}// 笛卡尔转换为经纬度
const Cartesian2toDegrees = (position: object) => {var cartographic = Cesium.Cartographic.fromCartesian(position)var longitude = Cesium.Math.toDegrees(cartographic.longitude)var latitude = Cesium.Math.toDegrees(cartographic.latitude)var height = cartographic.heightreturn [longitude, latitude, height]
}const clearVisibility = (): void => {addViewFlag.value = falseaddTargetFlag.value = falseif (handlerPoint.value) {handlerPoint.value.clear()}num.value = 0window.viewer.entities.removeAll()if (couldRemove.value) {sightline.value.removeAllTargetPoint()couldRemove.value = false}window.viewer.enableCursorStyle = truelongitude.value = nulllatitude.value = nullheight.value = nullvisibleColor.value = '#0e9dec'hiddenColor.value = '#ffb200'
}
// 可视线实时的颜色的改变,
const hiddenColorChange = (val: Number) => {sightline.value.visibleColor = Cesium.Color.fromCssColorString(val)
}
const visibleColorChange = (val: Number) => {sightline.value.hiddenColor = Cesium.Color.fromCssColorString(val)
}
onMounted(() => {init()onDialog()
});// 弹框打开之后的回调再次穿透页面
const getIntervisOpen = () => {onDialog()
}onBeforeUnmount(() => {clearVisibility()handlerPoint.value = nullpointEventHandler.value = null
})// 解决弹框打开时可操作操作其他Dom的问题
const onDialog = () => {var box = document.querySelector(".el-overlay-dialog");// 获取.el-overlay-dialog父级var boxa = box.parentNode;//  使用pointerEvents 进行页面穿透boxa.style.pointerEvents = "none";
}
</script>
<style lang='scss' scoped>
//解决弹框打开时可操作操作其他Dom的问题
:deep(.el-dialog) {pointer-events: auto !important;
}.p-font {font-size: 16px;height: 36px;color: aqua;
}:deep(.el-dialog__header) {background-color: #012728;margin-right: 0px;height: var(--el-hov);padding: var(--hoverc);
}:deep(.el-dialog__title) {line-height: var(--line-h);font-size: var(--el-dialog-title-font-size);color: var(--text-color);margin-left: var(--m-l);
}:deep(.el-slider__runway) {height: var(--el-h);background-color: var(--el-color);border: 1px solid var(--el-border);
}:deep(.el-slider__bar) {height: var(--el-h);background-color: var(--el-bj);
}:deep(.el-slider .el-slider__runway .el-slider__button-wrapper .el-slider__button) {display: inline-block;width: 2px;height: 36px;margin-top: 13px;
}:deep(.el-slider__button) {background-color: #1df9fc;border-radius: 0%;border: solid 0px var(--el-slider-main-bg-color);
}:deep(.el-input-number__increase) {background: var(--el-color);color: var(--el-bj);border-left: 1px solid var(--el-border)
}:deep(.el-input__wrapper) {background-color: var(--el-color);border: 1px solid var(--el-border);box-shadow: 0 0 0 0 var(--el-input-hover-border-color) inset;
}:deep(.el-input-number__decrease) {background: var(--el-color);color: var(--el-bj);border-right: 1px solid var(--el-border)
}:deep(.el-input__wrapper:hover) {box-shadow: 0 0 0 0 var(--el-input-hover-border-color) inset;
}:deep(.el-input__inner) {color: var(--text-color)
}.font-big {font-size: var(--el-font);color: var(--text-color);line-height: var(--el-line);
}:deep(.el-dialog--center) {text-align: left;
}:deep(.el-color-picker__trigger) {width: 340px;
}:deep(.el-color-picker__color-inner) {background-color: #00CC66;height: 32px;
}:deep(.el-color-picker__trigger) {border: 0px solid var(--el-border-color);height: 28px;
}:deep(.el-color-picker__color) {width: 100%;height: 32px;text-align: center;border: 0px solid var(--el-text-color-secondary);margin-left: 5px;
}.el-h-line {margin-top: var(--el-h-line);
}:deep(.el-color-picker:hover:not(.is-disabled) .el-color-picker__trigger) {border: 0 solid var(--el-border-color-hover);
}:deep(.el-button.is-text:not(.is-disabled):focus, .el-button.is-text:not(.is-disabled):hover) {background-color: var(--el-fill-color-light);background-color: #34E0A8;
}:deep(.el-button.is-text:not(.is-disabled):focus, .el-button.is-text:not(.is-disabled)) {background-color: var(--el-fill-color-light);background-color: #34E0A8;
}:deep(.el-dialog--center .el-dialog__footer) {text-align: end;border-top: 1px solid #466c64;
}:deep(.el-button) {background-color: var(--el-h-bj);color: var(--text-color);font-size: 15px;
}:deep(.el-dialog__footer) {padding: var(--el-dialog-padding-primary);padding-top: 15px;padding-bottom: 15px;border-top: 1px solid #466C64;
}:deep(.el-dialog) {margin-right: 380px;
}.el-dialog::after {clear: both;
}.p {line-height: 52px;color: #34e0a8;margin-top: -18px;font-size: 15px;font-weight: 600;}:deep(.el-color-picker__color-inner) {display: inline-flex;justify-content: center;align-items: center;width: 78%;height: 100%;margin-left: -88px;
}:deep(.el-input.is-disabled .el-input__wrapper) {background-color: #123435;box-shadow: 0 0 0 0 #19686c inset;
}
</style>
<style lang='scss' >
.el-dialog {--el-dialog-width: 50%;--el-dialog-bg-color: #1B3A39;
}.el-dialog__headerbtn {top: -5px;right: -5px;
}.slider-demo-block {display: flex;align-items: center;
}.slider-demo-block .el-slider {margin-top: 0;margin-left: 8px;
}.el-popper.is-light {width: 293px !important;opacity: 0.9;
}.el-input__wrapper {background-color: #012728;border: 1 solid #00CC66;// box-shadow: 0 0 0 0 var(--el-input-border-color, var(--el-border-color)) inset;
}.el-input--small {--el-input-height: var(--el-component-size-small);border: 1;border: 1px solid #1df9fc;
}.el-popper.is-light {background: #012324 !important;border: 0 solid var(--el-border-color-light) !important;
}
</style>

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

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

相关文章

考研日常记录

由于实在太无聊了 &#xff0c; 所以记录以下考研备考日常 &#xff0c; 增加一点成就感 &#xff0c; 获得一点前进动力。 2024.4.18 周四 课程情况&#xff1a; 无课 时间规划&#xff1a; 上午&#xff1a;休息 下午&#xff1a; 事项耗时进度备注写作业1h复习英语单词…

深入浅出学习切片LOD——ArcGIS server模拟缓存切片(影像快显)

一、第一次实践 原理 免切片实现影像服务的模拟切片&#xff0c;主要原理是接收前端传过来的xyz(行列层级)以及切片方案&#xff0c;计算出该请求的切片的四至经纬度信息&#xff0c;通过mapserver的exportImage接口&#xff0c;传入每个模拟切片的四至经纬度信息得到图片返回…

Spark01

Spark01 一. Spark概述二. Spark环境部署 - Local三. Spark环境部署 - Standalone1. Standalone集群概述2. Standalone环境部署3. 测试环境 四. Spark环境部署 - Standalone-HA1. 安装部署Zookeeper1. 下载2. zookeeper安装3. 配置StandAlone-HA集群 五. Spark On YARN -- 重点…

ESP32S3在VScode中使用USB口调试

ESP32S3在VScode中使用USB口调试 安装USB驱动修改工程的配置文件launch.jsonsettings.json 启动GDB Server 安装USB驱动 在powershell中输入下面指令&#xff1a; Invoke-WebRequest https://dl.espressif.com/dl/idf-env/idf-env.exe -OutFile .\idf-env.exe; .\idf-env.exe…

js实现抽奖效果

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>随机抽奖</title> </head> <body>…

锂电池寿命预测 | Matlab基于GRU门控循环单元的锂电池寿命预测

目录 预测效果基本介绍程序设计参考资料 预测效果 基本介绍 锂电池寿命预测 | Matlab基于GRU门控循环单元的锂电池寿命预测 Matlab基于GRU的锂电池剩余寿命预测 基于GRU的锂电池剩余寿命预测&#xff08;单变量&#xff09; 运行环境Matlab2020及以上 锂电池的剩余寿命预测是…

W11安装WSL2 ubuntu 攻略

W11安装WSL2 ubuntu 攻略 最近换了新电脑重新安装一遍wsl2&#xff0c;记录一下方便以后使用。 打开控制面板&#xff0c;选择程序 —— 启用或关闭Windows功能&#xff0c;勾选 适用于Linux的Windows子系统还有虚拟机平台选项&#xff0c;修改后需要重启 wsl2版本 wsl --se…

Rust腐蚀服务器清档多教程

Rust腐蚀服务器清档多教程 大家好我是艾西&#xff0c;一个做服务器租用的网络架构师。上期教了大家怎么搭建服务器以及安装插件等那么随着大家自己架设服或是玩耍的时间肯定会有小伙伴想要去新增开区数量或是把原本的服务器进行一些调整等&#xff0c;那么今天主要聊的就是怎…

Linux常用命令详解:提升你的系统运维能力

在Linux系统运维工作中&#xff0c;熟练掌握常用命令是每位工程师的必备技能。本文将为大家介绍一些Linux系统中常用的命令&#xff0c;帮助大家更好地进行系统管理和维护。 一、文件操作命令 1.ls&#xff1a;列出目录内容。 2.cd&#xff1a;切换目录。 3.pwd&#xff1…

如何在Windows 10中启用和使用上帝模式,这里有详细步骤

序言 上帝模式&#xff08;God Mode&#xff09;是一个特殊的文件夹&#xff0c;只在一个窗口中显示所有可用的操作设置。它可以节省搜索命令的时间&#xff0c;而无需知道通过“开始”菜单或“控制面板”查找命令的步骤。上帝模式默认情况下是隐藏的&#xff0c;所以我们需要…

windows10 下 wsl + ubuntu + cups 安装使用

文章目录 windows10 下 wsl + ubuntu + cups 安装使用一、安装wsl二、wsl闪退三、安装cups四、启动cups五、无法添加打印机六、挂载usb打印机七、添加打印机八、打印文件参考文献windows10 下 wsl + ubuntu + cups 安装使用 一、安装wsl wsl --install安装完按要求重启,两次…

类和对象-封装-设计案例1-立方体类

#include<bits/stdc.h> using namespace std; class Cube{public://设置长void setL(int l){m_Ll;} //获取长int getL(){return m_L;}//设置宽 void setW(int w){m_Ww;}//获取宽 int getW(){return m_W;}//设置高 void setH(int h){m_Hh;}//获取高int getH(){return m_H;…

线程池 ThreadPoolExecutor 配置参数详解

《开发语言-Java》 线程池 ThreadPoolExecutor 参数详解 一、引言二、主要内容2.1 核心构造函数2.2 核心线程数2.3 最大线程数2.4 空闲线程存活时间2.5 keepAliveTime 的时间单位2.6 核心线程在空闲时的回收策略2.7 工作队列2.8 线程工厂2.9 拒绝策略 三、总结 一、引言 提到 …

《QT实用小工具·三十一》基于QT开发的访客管理平台demo2

1、概述 源码放在文章末尾 该项目为访客管理平台demo&#xff0c;包含主界面、系统设置、警情查询、调试帮助、用户退出功能。 项目部分代码如下&#xff1a; #pragma execution_character_set("utf-8")#include "frmmain.h" #include "ui_frmmain…

js调用html页面需要隐藏某个按钮

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

Python程序的控制结构-课后作业[python123题库]

程序的控制结构-课后作业 1、中国古代数学问题——鸡兔同笼 鸡兔同笼 类型&#xff1a;流程控制‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬…

Qt日志使用

QsLog使用 这篇讲qt的日志还是比较好的&#xff0c;可以在自己的函数里面配置这个日志框架实现自己所需的功能。 我接触的项目里面&#xff0c;假如有个函数功能执行错误了&#xff0c;我希望可以快速定位到这个错误&#xff0c;这个时候就需要到了日志&#xff0c;我咨询了有经…

【备忘录】openssl记录

openssl genrsa -out ca.key 2048 openssl req -x509 -new -nodes -key ca.key -days 10000 -out ca.crt -subj “/CCN/STBeijing/LBeijing/Okubernetes/OUKubernetes-manual/CNkubernetes-ca” openssl genrsa -out etcd-ca.key 2048 openssl req -x509 -new -nodes -key etc…

【Java实战】使用自定义注解实现参数校验详解

文章目录 前言📝一、Java注解简介二、启用注解校验1.启用注解2.注解@Valid和 @Validated2.1@Valid级联校验2.2@Validated高级使用三、自定义注解1.统一异常处理2.编写注解2.1 自定义校验2.2 多参数校验总结前言📝 由于实际开发中遇到大量相同的条件参数验证,不想写重复代…

Python测试转岗网络安全测试,挑战年薪30W+

有许多人问我安全测试前景怎么样&#xff1f; 目前&#xff0c;网络安全市场可大致分为17大安全领域、59个细分领域。不同领域大类核心技术相距甚远&#xff0c;因此绝大多数企业都选择专注于几个细分市场上。产品终端使用者主要以政企、军队、运营商、金融、医疗、教育、交通…