基于earthSDK三维地图组件开发

上效果
在这里插入图片描述
功能点

  • 测量分析
  • 相机位置切换
  • geojson数据加载
  • 地图打点,显示信息
  • 点击回传数据
  • 二三位切换

这里二三维切换通上篇openlayers分享,技术交流+V:bloxed

<template><div class="h100 w100"><div style="width:100%; height:100%; background-color: pink;" ref="xe2Container"></div><slot name="toolbar"></slot><slot name="mode"></slot><!-- 体积分析弹窗 begin--><div id="panel" v-show="drawType=='volume'"><div class="box"><label for="">基准面高度</label> <el-input size="small" v-model="AnalyseForm.planeHeight" type="number" /><label for="">采样间距</label> <el-input  size="small" v-model="AnalyseForm.planeDistance" type="number" /><label for="">挖方体积</label><p id="cutVolume">{{AnalyseForm.cutVolume  }}</p><label for="">填方体积</label><p id="fillVolume">{{ AnalyseForm.fillVolume }}</p><label for="">分析进度</label><p id="progress">{{ AnalyseForm.progress }}</p></div><div class="btn"><el-button @click="resetPlane">重新绘制基准面</el-button><el-button @click="startAnalyse">开始分析</el-button></div></div><!-- end --></div></template><script setup lang="ts">import { onMounted, ref } from "vue";import { ESObjectsManager,ESTerrainLayer,ES3DTileset ,ESGeoJson, ESLocationMeasurement, ESDistanceMeasurement, ESHeightMeasurement, ESAreaMeasurement, ESVolumeMeasurement} from 'esobjs-xe2-plugin/dist-node/esobjs-xe2-plugin-main';import { CzmGlobeMaterial } from 'xbsj-xe2/dist-node/xe2-cesium-objects';import { PickedInfo } from "xbsj-xe2/dist-node/xe2-base-objects";
import { ca } from "element-plus/es/locale";const xe2Container = ref<HTMLElement | null>(null)//实例化一个场景对象管理器const objm:any = ref<any>(new ESObjectsManager());//@ts-ignorewindow.g_objm = objm.value;const czmViewer = ref<any>(null)const eSTerrainLayer = ref<any>(null);const sceneObject = ref<any>(null);const sceneStaions = ref<any[]>([]);const sceneMeasure = ref<any>(null);const drawType = ref<any>("") const emit = defineEmits(["mapSingleClick"]); // 自定义事件 会回传也是point数据const measureArr = ref<any[]>([]);const AnalyseForm = reactive<any>({planeHeight: 0,planeDistance: 1,cutVolume: "0.00(立方米)",fillVolume: "0.00(立方米)",progress: "0%"})onMounted(() => {if (!xe2Container.value) return;init3Dview();})const init3Dview = () => {czmViewer.value = objm.value.createCesiumViewer(xe2Container.value);// 监听视口状态czmViewer.value.statusChanged.don((status:string) => {if (status == 'Created') {// 视口创建完成,飞到初始视角位置objm.value.activeViewer.flyIn([110.1465,22.41115, 919.4948053805265],[283.14016420232184, -1.81201260919955, 0.026583596819532502],3);}})// czmViewer.value.changeToWalk([110.105931,22.422299, 200.4948053805265])objm.value.createSceneObjectFromJson({"id": "9812a65f-0de0-4f7b-b234-809c0c2fb8ef","type": "ESImageryLayer","url": "https://server.arcgisonline.com/arcgis/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}"});eSTerrainLayer.value = objm.value.createSceneObject(ESTerrainLayer);// // cesium官方地形eSTerrainLayer.value.url = "ion://1";//token需要到cesium官网申请 https://ion.cesium.com/objm.value.activeViewer.ionAccessToken ="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiIwZjlmNzA1MC1iYTk0LTQxYzktYThlYS02ZTc0MDI0ZDgxZTAiLCJpZCI6MjU1MDQ4LCJpYXQiOjE3MzE1MTM0NDB9.XiIX1mau6Mwp-S5AOau-MslPFT2MzRSLuJ4pday8jkc";sceneObject.value = objm.value.createSceneObject(CzmGlobeMaterial);objm.value.activeViewer.rain = 0;objm.value.activeViewer.cloud = 1;  }const changeElevation = ()=>{sceneObject.value.shadingMode = "none"}const addStation = (stations: any[]) => {if(sceneStaions.value.length){sceneStaions.value.forEach((item:any)=>{try {if (item) objm.value.destroySceneObject(item)} catch (error) {console.info(error)}})}stations.forEach((point, index) => {let sceneStaion = objm.value.createSceneObject(ESGeoJson,index+point.stcd);let data = {"type": "FeatureCollection","name":"stations","crs": {"type": "name","properties": {"name": "urn:ogc:def:crs:OGC:1.3:CRS84"}},"features": [{type: "Feature",geometry: {type: "Point",coordinates: [point.lng, point.lat],iconUrl: point.icon,},iconUrl: point.icon,properties: {id: index + point.stcd,name: point.stnm,type: point.sttp,info: point,iconUrl: point.icon,},id:index + point.stcd,}]}sceneStaion.url = data// 额外存储属性sceneStaion.extras = data// 图片是否显示sceneStaion.imageShow = true// 图片url地址sceneStaion.imageUrl = point.icon// 图片大小sceneStaion.imageSize = [60, 60]// 图片锚点sceneStaion.imageAnchor = [0.5, 1]// 图片偏移sceneStaion.imageOffset = [0, 0]// 文字颜色sceneStaion.textColor = [1, 1, 1, 1]// 文字大小sceneStaion.textFontSize = 12// 文字背景颜色//   sceneStaion.textBackgroundColor = [1, 1, 1, 1]// 文字锚点sceneStaion.textAnchor = [0.5, 1]// 用于显示的属性sceneStaion.textProperty = "name"// 文字的偏移值sceneStaion.textOffset = [-10, -60]// 是否被拾取sceneStaion.allowPicking = true// 贴地模式sceneStaion.heightReference = "CLAMP_TO_GROUND"// 被拾取sceneStaion.pickedEvent.don((e:any) => {const point = e.childPickedInfo.geojsonPickInfo.properties;const attachedInfo = PickedInfo.getFinalAttachedInfo(e)switch (attachedInfo.viewersPickingPointerEventFuncType[0]) {case 'click':mapSingleClick(point.info);break;case "pointerHover":// alert("悬浮拾取:" + name)break;default:break;}})sceneStaions.value.push(sceneStaion)});}const mapSingleClick = (point: any) => {emit("mapSingleClick", point);
};const clear = ()=>{drawType.value = ""measureArr.value.forEach((item:any) => {if (item) objm.value.destroySceneObject(item)})measureArr.value.length = 0sceneMeasure.value.editing = false;sceneMeasure.value?.clear();}const zoomInOut = (number: any) => {const  cameraPosition=  objm.value.activeViewer.getCurrentCameraInfo();const position = cameraPosition.position;const rotation = cameraPosition.rotation;const newposition = [position[0], position[1], position[2]+(number*1000) ];const newrotation = [rotation[0], rotation[1], rotation[2] ];console.log(newposition)objm.value.activeViewer.flyIn([...newposition],[...newrotation],1);}const toCenter = (coordinates?: any[]) => {const newCoordinates =coordinates ?  [...coordinates, 789.4948053805265] : [110.1465,22.41115, 919.4948053805265]objm.value.activeViewer.flyIn(newCoordinates,[29.015034176609266, -29.191968119807054, 359.9990548222274],3);}const draw = (measureType: any) => {drawType.value = measureType;switch (measureType) {case "point":createPoint();break;case "line":createDistance();break;default:case "height":createHeight();  break;case "area":createArea();  break;case "volume":createVolume();  break;    }}const createPoint = ()=>{sceneMeasure.value = objm.value.createSceneObject(ESLocationMeasurement);sceneMeasure.value.editing = true;measureArr.value.push(sceneMeasure.value);}const createDistance = ()=>{sceneMeasure.value = objm.value.createSceneObject(ESDistanceMeasurement);sceneMeasure.value.editing = true;measureArr.value.push(sceneMeasure.value);}const createHeight = ()=>{sceneMeasure.value = objm.value.createSceneObject(ESHeightMeasurement);sceneMeasure.value.editing = true;measureArr.value.push(sceneMeasure.value);}const createArea = () => {sceneMeasure.value = objm.value.createSceneObject(ESAreaMeasurement);sceneMeasure.value.editing = true;measureArr.value.push(sceneMeasure.value);}const createVolume = ()=>{sceneMeasure.value = objm.value.createSceneObject(ESVolumeMeasurement);sceneMeasure.value.editing = true;sceneMeasure.value.depthTest=true;sceneMeasure.value.points = [];sceneMeasure.value.editing = true;jionDon();measureArr.value.push(sceneMeasure.value);}const resetPlane = ()=>{sceneMeasure.value.clear();sceneMeasure.value.editing = false;sceneMeasure.value.points = [];sceneMeasure.value.editing = true;}const startAnalyse = () => {sceneMeasure.value.clear();sceneMeasure.value.planeDistance = AnalyseForm.planeDistance;sceneMeasure.value.planeHeight = AnalyseForm.planeHeight;sceneMeasure.value.start();}const  jionDon = ()=>{// 监听基准面设置到UI上sceneMeasure.value.planeHeightChanged.don((val:any) => {if (val) AnalyseForm.planeHeight= Number(val).toFixed(2)})// 监听挖方体积sceneMeasure.value.cutVolumeChanged.don((val:any) => {AnalyseForm.cutVolume = val.toFixed(2) + '(立方米)'})// 监听填方体积sceneMeasure.value.fillVolumeChanged.don((val:any) => {AnalyseForm.fillVolume= val.toFixed(2) + '(立方米)'})// 监听进度sceneMeasure.value.progressChanged.don((val:any) => {AnalyseForm.progress = val.toFixed(2) + "%"})}defineExpose({czmViewer, //地图/**@desc 添加站点 @param [{stcd:0000,stnm:"xxxx",sttp:'',icon:'xxxx',lng:number,lat:number}data:[{name:'xx',value:'',unit:''}]  //data地图鼠标悬浮展示内容}]*/addStation,  /*** 缩放 地图* @param {number} zoom 缩放级别*/zoomInOut, /*** 地图中心点* @param {number} center 地图中心点参数格式 [lng,lat]* @param {number} zoom 缩放级别 15*/ toCenter,  /*** 清除地图分析*/clear,/*** 地图分析* @param {string} type 分析类型  'area' 面积  'line' 距离*/draw,  });</script>
<style scoped>#panel{position: absolute;box-sizing: border-box;right: 460px;top: 20px;width: 330px;background: #3e4249;border-radius: 8px;padding: 20px;color: #d6deea;border: 1px solid #939e8f;animation-name: enter;animation-duration: 1.5s;animation-fill-mode: forwards;animation-delay: 0.7s;
}
.box {display: grid;grid-template-columns: 90px 1fr;align-items: center;}.box label {padding-right: 10px;}.btn {padding-top: 10px;text-align: center;}.btn button {}label {line-height: 30px;}
</style>

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

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

相关文章

计算机毕业设计Python+Spark知识图谱酒店推荐系统 酒店价格预测系统 酒店可视化 酒店爬虫 酒店大数据 neo4j知识图谱 深度学习 机器学习

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

RK3506开发板:智能硬件领域的新选择,带来卓越性能与低功耗

在现代智能硬件开发中&#xff0c;选择一款性能稳定、功耗低的开发板是确保产品成功的关键。Rockchip最新推出的RK3506芯片&#xff0c;凭借其卓越的能效比、多功能扩展性和优秀的实时性能&#xff0c;已经成为智能家电、工业控制、手持终端等领域的热门选择。而基于RK3506的Ar…

【AIGC-ChatGPT进阶副业提示词】星际占卜师:探索星象能量的艺术【限时免费阅读,一天之后自动进入进阶课程】

引言 在这个数字化的时代&#xff0c;我们创造了一个独特的角色 —— 星际占卜师。这不仅是一个简单的运势预测工具&#xff0c;更是一个融合了玄学、预言和能量解读的智能向导。通过精心设计的系统提示词和独特的画境生成机制&#xff0c;星际占卜师能够为用户带来沉浸式的占…

机器学习之PCA降维

主成分分析&#xff08;PCA&#xff0c;Principal Component Analysis&#xff09; 主成分分析&#xff08;PCA&#xff09;是一种常见的无监督学习技术&#xff0c;广泛应用于数据降维、数据可视化以及特征提取等任务。PCA的目标是通过线性变换将数据从高维空间映射到低维空间…

SOTA简繁中文拼写检查工具:FASPell Chinese Spell Checker 论文

拼写纠正系列 NLP 中文拼写检测实现思路 NLP 中文拼写检测纠正算法整理 NLP 英文拼写算法&#xff0c;如果提升 100W 倍的性能&#xff1f; NLP 中文拼写检测纠正 Paper java 实现中英文拼写检查和错误纠正&#xff1f;可我只会写 CRUD 啊&#xff01; 一个提升英文单词拼…

Visual Studio Code历史版本下载

本章教程&#xff0c;介绍如何找到Visual Studio Code的历史版本官方下载地址。 一、历史版本下载地址 下载地址&#xff1a;https://code.visualstudio.com/updates/ 二、常用版本下载地址 August 2017 (version 1.16)&#xff1a;https://code.visualstudio.com/updates/v1_…

Kubernetes(k8s)离线部署DolphinScheduler3.2.2

1.环境准备 1.1 集群规划 本次安装环境为&#xff1a;3台k8s现有的postgreSql数据库zookeeper服务 1.2 下载及介绍 DolphinScheduler-3.2.2官网&#xff1a;https://dolphinscheduler.apache.org/zh-cn/docs/3.2.2 官网安装文档&#xff1a;https://dolphinscheduler.apach…

【自动化测试】windows下安装Selenium浏览器界面测试工具

Date: 2024.12.23 10:15:53 author: lijianzhan 简述&#xff1a;这篇教程详细介绍了如何在Windows环境下安装selenium&#xff0c;并设置Chrome浏览器驱动。什么是Selenium&#xff1f;Selenium是一个基于浏览器的自动化测试工具&#xff0c;它提供了一种跨平台、跨浏览器的端…

如何在 Ubuntu 22.04 上安装 phpMyAdmin

简介 PHPMyAdmin 是在 Ubuntu 22.04 上管理 MySQL 数据库的绝佳选择。它是一个流行的工具&#xff0c;拥有简单、高效且用户友好的基于 Web 的界面&#xff0c;让你能够轻松地管理 MySQL 数据库。因此&#xff0c;许多开发人员、数据库管理员和网站所有者都信任 PHPMyAdmin 来…

大数据-256 离线数仓 - Atlas 数据仓库元数据管理 正式安装 启动服务访问 Hive血缘关系导入

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; Java篇开始了&#xff01; 目前开始更新 MyBatis&#xff0c;一起深入浅出&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff0…

[Python3] Sanic中间件

在 Sanic 中&#xff0c;中间件&#xff08;middleware&#xff09;是指在请求和响应之间执行的代码。它们是一个非常强大的工具&#xff0c;用于处理请求的预处理、响应的后处理、全局错误处理、日志记录、认证、权限校验、跨域资源共享&#xff08;CORS&#xff09;等任务。中…

使用 OpenCV 绘制线条和矩形

OpenCV 是一个功能强大的计算机视觉库&#xff0c;它不仅提供了丰富的图像处理功能&#xff0c;还支持图像的绘制。绘制简单的几何图形&#xff08;如线条和矩形&#xff09;是 OpenCV 中常见的操作。在本篇文章中&#xff0c;我们将介绍如何使用 OpenCV 在图像上绘制线条和矩形…

操作系统课程设计

摘 要 本项目旨在深入设计与实现一套基于Java的模拟操作系统&#xff0c;模拟和实现常见操作系统的核心功能&#xff0c;包括进程管理、内存分配与调度、高效的文件系统和多样化设备的管理。通过该模拟操作系统的开发&#xff0c;探索计算机操作系统的基础理论与实际工程细节…

css改变输入右下角图标

前言 正常情况下&#xff0c;HTML textarea 多行文本输入框会存如下图所示图标&#xff0c; 用户可拉动它改变高度&#xff0c;这是我们不想看到的&#xff0c;所以要去掉它。 去掉后&#xff1a; 解决方案 设置 resize 属性即可&#xff0c;如下代码所示&#xff1a; <…

HTML-CSS(day01)

W3C标准&#xff1a; W3C&#xff08; World Wide Web Consortium&#xff0c;万维网联盟&#xff09; W3C是万维网联盟&#xff0c;这个组成是用来定义标准的。他们规定了一个网页是由三部分组成&#xff0c;分别是&#xff1a; 三个组成部分&#xff1a;&#xff08;1&…

2024-12-24 NO1. XR Interaction ToolKit 环境配置

文章目录 1 软件配置2 安装 XRToolKit3 配置 OpenXR4 安装示例场景5 运行测试 1 软件配置 Unity 版本&#xff1a;Unity6000.0.26 ​ 2 安装 XRToolKit 创建新项目&#xff08;URP 3D&#xff09;&#xff0c;点击进入 Asset Store。 进入“Unity Registry”页签&#xff0…

C语言基础——指针(4)

一&#xff0e; 字符指针变量 字符指针变量的使用和整型指针变量的使用方法相似&#xff0c;以下是其基本使用方法的例子&#xff1a; &#xff08;1&#xff09;字符指针变量还有一种使用方法&#xff1a; const char* p "abcd" 需…

week 11 - BCNF

1. More on functional dependencies (功能依赖的更多内容) Lossless decomposition (无损分解) 研究如何在分解表的过程中不丢失信息&#xff0c;也就是说&#xff0c;通过分解后的表可以无损地重建原始表。 2. BCNF (Boyce-Codd Normal Form, BCNF范式) &#xff08;1&…

嵌入式学习-QT-Day06

嵌入式学习-QT-Day06 六、多窗口编程 1、QMessageBox 消息对话框 2、QWidget类 3、parent参数 4、堆栈窗口&#xff08;QStackedWidget&#xff09; 5、新建自定义窗口类 6、对象传值 6.1 父对象 → 子对象 6.2 子对象 → 父对象 7、事件机制 8、QMainWindow主窗口类 8.1 QMenu…

《战神:诸神黄昏》游戏运行时提示找不到gamede.dll文件怎么办?gamede.dll丢失的修复指南

在沉浸于《战神&#xff1a;诸神黄昏》的壮阔世界时&#xff0c;突然弹出的“找不到gamede.dll文件”错误提示可能会让玩家措手不及。作为一名经验丰富的软件开发从业者&#xff0c;我深知这类问题对游戏体验的影响。今天&#xff0c;我将为大家详细解析gamede.dll文件丢失的原…