cesium添加弹窗,跟随实体移动

news2024/11/12 13:56:58

先看效果,弹窗会跟随实体移动

1、首先我们先写一个弹窗样式,如果是vue开发,css最好写到公共引入的css ,组件内css会编译后会加hash值

2、然后我们 开启 cesium的监听事件, 注意的是  initBubbleWindow方法在地球加载后再调用

 const initBubbleWindow = () => {
    let scene = viewer.scene,
        camera = viewer.camera,
        handler = new Cesium.ScreenSpaceEventHandler(scene.canvas);

    handler.setInputAction((movement) => {
        if (viewer.selectedEntity) {
            // 获取实体id  如果是不同实体  可以在这里过滤
            let selectID = viewer.selectedEntity.id
                console.log(selectID)
            // 创建弹窗前先关闭 之前的弹窗  如果你要展示多个弹窗 这里可以不用调用
            orb.deletePopup()
            orb.popupWindow(selectID);
           
        } else {
            // 如果你点的不是实体 是空白区域 弹窗销毁  如果你有统一销毁的方法 这里也可以省略
            orb.deletePopup()
        }

    }, Cesium.ScreenSpaceEventType.LEFT_CLICK); // 监听左键
};

3、通过左键获取到 实体id后 我们拿到实体的数据,然后进行显示


     // 气泡弹窗
    popupWindow(id) {
        // 先创建元素
        let domId = "popupwin-" + id // 多个弹窗id不一样
        let html = window.document.createElement("div");
        html.className = "popupwin"; // 这里就是我们一开始写样式的弹窗 
        html.id = domId
     
        document.body.appendChild(html);

        let scene, camera
        let helper = new window.Cesium.EventHelper();
        let that = this 
        // 这里写一个函数 用cesium的计时器 定时调用,这也是 弹窗可以跟着实体移动的主要方式
        function listenersfunc() {
            scene = viewer.scene;
            camera = viewer.camera;
            if (
                viewer.entities &&
                viewer.entities.getById(id)
            ) {
                // 根据实体id获取实体id的位置坐标
                let cartesian = viewer.entities.getById(id)
                    .position.getValue(viewer.clock.currentTime)

                // 三维转屏幕坐标 这里获取实体在屏幕中的位置
                var px_position = Cesium.SceneTransforms.wgs84ToWindowCoordinates(
                    scene,
                    cartesian
                )
                // 这里转换成经纬高
                let POS = window.Cesium.Cartographic.fromCartesian(cartesian)
               
                // 获取弹窗 然后实时修改弹窗位置
                let popDom = document.getElementById(domId)
                
                var popw = popDom.offsetWidth;
                var poph = popDom.offsetHeight;
                popDom.style.top = px_position.y - poph + "px";
                popDom.style.left = px_position.x - popw / 2 + "px";
               
                 // 这里添加弹窗内容,也是实时变化的
                let infoHTML =   '<p>经度:' + Number((POS.longitude * 180 / Math.PI)).toFixed(4) + '(°)</p>' +
                '<p>纬度:' + Number((POS.latitude * 180 / Math.PI)).toFixed(4) + '(°)</p>' +
                '<p>高度:' + Number((POS.height)).toFixed(4) + '(m)</p>'
                popDom.innerHTML = infoHTML
            }
        }
        
        // 把修改实体弹窗的函数添加的定时器里,进行循环调用
        listenersfunc.prototype.id = id
        let a = helper.add(viewer.clock.onTick, listenersfunc)


    }

4、最好我们点击空白销毁弹窗

  deletePopup(){
        // 找出所有的定时器 找的名称是 listenersfunc 的移除
        let AllListeners = window.viewer.clock.onTick._listeners;
        AllListeners.map(value => {
            if (value.name == "listenersfunc") {
                window.viewer.clock.onTick.removeEventListener(value)

            }
        })

        // 最好清除所以窗口  也可以根据id清除 ,因为我这里展示的是一个 所以用的 class
        document.querySelector(".popupwin")?.remove()

最后就完成了

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

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

相关文章

控制阶段在DMAIC中的主要目标是什么?

在探讨DMAIC&#xff08;定义Define、测量Measure、分析Analyze、改进Improve、控制Control&#xff09;这一持续改进流程时&#xff0c;控制阶段作为整个循环的尾声&#xff0c;其重要性不言而喻。控制阶段的主要目标不仅在于巩固前期努力所取得的成果&#xff0c;更在于确保这…

EXCEL 分段排序--Excel难题#86

Excel某表格有3列。 ABC1A1B1512A2B27213A3B33824A4B495A5B5736A6B65777A7B7918A13B131509A14B144910A17B1770211A18B1870512A34B343313A35B3540914A36B3657915A37B3710 现在要求对表格按照第3列进行分段排序&#xff0c;由小到大排列。第1段&#xff1a;第3列小于等于50&…

UE5 datetime 创建日期时间节点 进行加法减法。个人理解

以下均为个人实验和个人理解&#xff0c;仅供参考。 目录 目标节点&#xff1a; 年月日 时分秒毫秒 目标节点&#xff1a; 年月日 年月日以1 为基底。若填的数字<0&#xff0c;该节点会失效。 试验&#xff1a; year基底为1&#xff0c;正常 year基底为0&#xff0c;异…

主流AI绘画工具StableDiffusion最新模型sd3本地部署方法(附工作流)

前言/introduction Stable Diffusion 3&#xff08;简称SD3&#xff09;是Stability AI最新推出的文本到图像生成模型。相比前代模型&#xff0c;SD3在生成质量、细节表现以及运行效率上有了显著提升&#xff0c;尤其在细腻的图像渲染和复杂的场景构建方面表现出色。SD3模型提…

【Harmony OS 4.0】页面路由跳转代码示例

ets/pages/Index.ets import router from ohos.router;Entry Component struct Index {State title: string Index Page;State message: string onPageShow(): void { // 页面每次显示时触发。使用aboutToAppear页面没反应。let record router.getParams() as Record<st…

微服务多个模块启动,端口被占用,yml配置文件读不到

刚刚提交到gitee自己的仓库&#xff0c;拉下来还是报错&#xff0c;然后看到一个解决方法&#xff1a; <build><resources><resource><directory>src/main/java</directory><includes><include>**/*.yml</include><includ…

医院信息管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图详细视频演示技术栈系统测试为什么选择我官方认证玩家&#xff0c;服务很多代码文档&#xff0c;百分百好评&#xff0c;战绩可查&#xff01;&#xff01;入职于互联网大厂&#xff0c;可以交流&#xff0c;共同进步。有保障的售后 代码参考数据库参…

神经重建在自动驾驶模拟中的应用

验证自动驾驶软件需要数百万公里的测试。这不仅意味着系统开发周期长&#xff0c;而且系统的复杂度也会不断增加&#xff0c;同时&#xff0c;大规模的实车测试也会耗费巨量的资源并且可能会面临未知的安全问题。aiSim这样的虚拟仿真工具可以减轻真实世界测试的负担。 AD和ADA…

学习ComfyUI的一个不错网站:www.comflowy.com/basics

学习ComfyUI&#xff0c;不仅仅是照搬别人的工作流来使用&#xff0c;重要的是能自己搭建工作流&#xff0c;而要能够熟练搭建&#xff0c;离不开对工作流中节点&#xff08;特别是重要节点&#xff09;的透彻理解。比如我自己&#xff0c;原来对 Lora 就十分陌生&#xff0c;不…

一款好看的WordPress REST API 主题

介绍&#xff1a; 主题特色&#xff1a; 使用Nuxtjs WordPress Rest Api 实现前后端分离&#xff0c;可完成多端部署&#xff1b; 主题支持自动切换黑夜模式。 使用说明&#xff1a; service 目录为wordpress主题文件&#xff0c;需要拷贝到wordpress主题目录下&#xff0…

创建uni-app项目(vue3+ts+vite)

npx degit dcloudio/uni-preset-vue#vite-ts m-uni-demo1 跳转到对应目录&#xff0c;装包&#xff0c;运行 cd m-uni-demo1 yarn yarn dev:h5 tsconfig.json: {"extends": "vue/tsconfig/tsconfig.json","compilerOptions": {"ignoreDepr…

项目实战--SpringBoot整合EasyExcel实现数据导入导出

SpringBoot整合EasyExcel实现数据导入导出 一、前言二、实践2.1 实体类注解方式2.2 动态参数化导出导入 一、前言 在公司业务系统开发过程中&#xff0c;操作 Excel 实现数据的导入导出是个非常常见的需求。 最近公司的项目采用EasyPoi来实现的&#xff0c;但是在数据量大的情…

用git指令别名,解决unity环境问题

文章目录 背景问题解决尝试1尝试2尝试3 背景 unity 项目开发时&#xff0c;由于我本机的配置和项目组其他小伙伴的配置不一样&#xff0c;使用统一的配置打开项目会出现花屏的现象&#xff0c;经过摸索尝试&#xff0c;需要修改 unity 的Project Settings。修改之后&#xff0…

骑行耳机品牌前五名排行榜:5大优质骑行耳机闭眼入都不踩雷!

近年来&#xff0c;骨传导耳机市场迅速崛起&#xff0c;但伴随着这股热潮&#xff0c;市场上也出现了诸多鱼龙混杂的杂牌品牌&#xff0c;有不少非专业的产品趁机涌入市场。这些骑行耳机在骨传导技术、防水性能、稳定性及音效调校等上百项关键指标上缺乏深入研发与优化&#xf…

FastGPT+ollama 搭建私有AI大模型智能体工作流-Mac

一、大模型工作流的优势 1. 降低任务门槛&#xff1a;工作流可以将复杂任务分解成多个小任务&#xff0c;降低每个任务的复杂度&#xff0c;从而减少对提示词和大模型推理能力的依赖。这样可以提升大模型处理复杂任务的性能和容错能力。 2. 提升任务效率&#xff1a;工作流可以…

在选择或推荐数据恢复软件之前,您如何测试和审查它?

数据恢复软件可以帮助您从各种存储设备中检索丢失或删除的文件&#xff0c;例如硬盘驱动器&#xff0c;USB闪存驱动器&#xff0c;存储卡或智能手机。但是&#xff0c;并非所有数据恢复软件都是一样的&#xff0c;根据您的情况和需求&#xff0c;有些软件的性能可能比其他软件更…

多商户入驻商城系统源码+收银系统源码

随着移动互联网的不断发展&#xff0c;私域小程序对于零售门店来说早已不再陌生。很多门店也都搭建了自己专属的私域商城&#xff0c;但是私域商城一直是不温不火的状态&#xff0c;尤其针对一些腰尾部商户来说&#xff0c;无小程序运营能力&#xff0c;小程序流量匮乏&#xf…

C#实现多选下拉框

1、创建多选下拉框控件 using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;namespace DFT_FFTApp.userCtrl {/// <summary>/// 多选下拉控件//…

centos 虚拟机器刚刚安装没有ip地址的问题

刚刚安装好的虚拟机器&#xff0c;我们通过 ip addr 查看ip发现是这样的 该虚拟机器没有ip地址&#xff0c;那么怎么办 原来是在/etc/sysconfig/network-scripts/ifcfg-ens33中关于网络的配置有问题 ONBOOTno 表示不开启网卡&#xff0c;我们需要将这个值进行修改为yes 当前…

上位机图像处理和嵌入式模块部署(linux程序加解密)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 我们平时在开发程序的时候&#xff0c;如果仅仅是自己使用&#xff0c;那么代码和使用场景都是自己控制的&#xff0c;一般来说问题不大。但是程序…