Cesium 点击实体显示可随地图移动的弹框

news2025/1/11 0:03:56

在这里插入图片描述

实体数据加载到地图上之后,使用点击事件拾取实体获取实体信息

 clickPop() {
      let _this = this;
      // 实体的点击事件
      _this.drawHandler = new Cesium.ScreenSpaceEventHandler(
        viewer.scene.canvas
      );
      _this.drawHandler.setInputAction(function (click) {
        let pickedObject = viewer.scene.pick(click.position);
        // 判断一下在添加点的时候给点绑定的标识在不在
        // 来判断点击的是哪种类型的点,根据不同的类型显示不同的弹框
        if (
          pickedObject &&
          pickedObject.hasOwnProperty('id') &&
          pickedObject.id &&
          typeof pickedObject.id == 'object' &&
          pickedObject.id.hasOwnProperty('layerId') &&
          pickedObject.id.layerId.indexOf('*') == -1 &&
          pickedObject.id.layerId.indexOf('monitor') == -1 
        ) {
          let tempId = pickedObject.id.layerId.split('-')[1];// 截取之前拼接的标识符
          let param = {
            deviceId: tempId,
            dataSources: pickedObject.id.dataSources || '',
          };// 向后端发请求
          getOneDeviceData(param).then((res) => {
            if (res.code == 200 && res.message == 'success') {
              let { result } = res;
              if (result) {
                  let tempHtml = `
                  <div>
                    <div class="cesium-popup-closer" οnclick="closePop()">
                      <i
                        class="ivu-icon ivu-icon-md-close ttt"
                        style="color: #ffffff; font-size: 25px"
                      ></i>
                    </div>
                    <div class="point-title">${pickedObject.id.deviceName}</div>
                    <div class="polygon-main">
                     // ...
                     // 这个里面写的就是你弹框中要显示的内容
                     // 可以先在页面上写好结构和样式然后移植过来
                    </div>
                  </div>`;
                  // 这里的经纬度高度一般都要和你添加的点位置一致,不然地图放大的时候可能会有偏移
                  let optionsw = {
                    position: [lng, lat],// 经纬度位置
                    alt: alt,// 高度
                    content: tempHtml,
                    offsetWidth: -330, // 横向偏移的像素值
                    offsetHeight: 490, // 纵向偏移的像素值,这两个值根据你弹框的背景来调整
                    id: 'opto2',
                  };
                  _this.pointMap(optionsw);
               }
            }
          });
        }
      }, Cesium.ScreenSpaceEventType.LEFT_CLICK);
    },

计算弹框位置的函数

    pointMap(options) {
      let optionsDom = document.querySelectorAll(`.cesium-popup`);
      if (optionsDom.length > 0) {
        for (let i = 0; i < optionsDom.length; i++) {
          optionsDom[i].remove();
        }
      }
      let phtml =
        `<div   id='${options.id}'  class='temp-box' >` +
        options.content +
        `</div>`;
      var div = document.createElement('div');
      div.innerHTML = phtml;
      if (viewer) {
        viewer.container.append(div);
      }
      this.addlayer(div, options.id);
      if (viewer) {
        viewer.scene._postRender.addEventListener(() => {
          if (viewer) {
            let windowCoord = Cesium.SceneTransforms.wgs84ToWindowCoordinates(
              viewer.scene,
              Cesium.Cartesian3.fromDegrees(...options.position, options.alt)
            );
            //这里要注意,如果弹框被移出屏幕外的时候,是计算不到位置的,如果不加这句话会报错
            if (!windowCoord) return;
            let x = windowCoord.x - options.offsetWidth;
            let y = windowCoord.y - options.offsetHeight;
            div.style.cssText = `
          position:absolute;
          left:0;
          top:0;
          width:300px;
          height:350px;
          transform:translate3d(${Math.round(x)}px,${Math.round(y)}px, 0);
      `;
            div.classList.add('cesium-popup');
          }
        });
      }
    },

添加弹框的函数

    addlayer(div, id) {
      if (window.layerCollection.has(id)) {
        window.layerCollection.get(id).push(div);
      } else {
        window.layerCollection.set(id, [div]);
      }
    },

关闭弹框的函数

    closePop() {
      let optionsDom = document.querySelectorAll(`.cesium-popup`);
      if (optionsDom.length > 0) {
        for (let i = 0; i < optionsDom.length; i++) {
          optionsDom[i].remove();
        }
      }
    },

注意一点,这个弹框的关闭函数会在页面初始化的时候绑定到window上,不然写在原生html标签里面的函数无法触发

window.closePop = this.closePop;

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

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

相关文章

03-JVM虚拟机-课堂笔记

3-JVM虚拟机 灵魂三问&#xff1a; JVM是什么&#xff1f; JVM广义上指的是一种规范。狭义上的是JDK中的JVM虚拟机。 为什么要学习JVM&#xff1f; 面试过程中&#xff0c;经常会被问到JVM。 研发过程中&#xff0c;肯定会面临一些重难点问题与JVM有关系。例如&#xff1a…

【虚拟仪器Labview】习题T1-详解

目录 题目要求思路计时部分详解实现第二个部分&#xff1a;将X*3Y 的的结果 Z与100进行比较。全部完成 题目要求 从前面板输入两个浮点数:X,Y,计算 X*3Y 的的结果 Z&#xff0c;在前面板显示计算结果。并且判断 Z是否小于 100&#xff0c;如果 Z 小于 100&#xff0c;前面板中的…

《Spring》--使用application.yml特性提供多环境开发解决方案/开发/测试/线上--方案2

阿丹-有话说&#xff1a; 第二种多环境的配置选择解决方案&#xff0c;这个更加的灵活没在配置方面都选择了一种yml的书写方式。 原理&#xff1a; 在Spring Boot中&#xff0c;spring.profiles.active 属性用于指定当前应用程序应激活哪个环境配置。当Spring Boot应用启动时…

postman 之 接口请求

一、前言 1. 安装 2. 主界面 3. 请求区域 Body下主要包含以下4中格式 form-data&#xff1a;混合表单&#xff0c;支持上传文件x-www-form-urlencoded&#xff1a;文本表单raw&#xff1a;原始格式&#xff0c;支持JSON/XML格式&#xff08;后面可选择&#xff09;binary&am…

Mysql是怎么运行的(上)

文章目录 Mysql是怎么运行的Mysql处理一条语句的流程连接管理解析与优化存储引擎 基本配置配置文件系统变量状态变量字符集四种重要的字符集MySQL中的utf8和utf8mb4各级别的字符集和比较规则MySQL中字符集的转换排序规则产生的不同的排序结果 InnoDB存储引擎介绍COMPACT行格式介…

玉米浸泡液植酸吸附树脂

植酸为环己六醇六磷酸&#xff0c;分子量为660&#xff0c;植酸钠为环己六醇六磷酸钠&#xff08;Na12C6H6O24P6&#xff09;分子量为924。 植酸用途&#xff1a;在食品工业中植酸钠可用作食品添设剂&#xff0c;菲丁&#xff08;植酸钙&#xff09;可用于生产肌醇&#xff0c…

MySQL 从零开始:02 MySQL 安装

文章目录 1、下载 MySQL 安装程序2、安装 MySQL 要操作 MySQL &#xff0c;首先要安装 MySQL &#xff0c;本文将一步步展示如何安装 MySQL&#xff0c;简直详细到令人发指。 环境&#xff1a; 操作系统&#xff1a;Windows10 64位MySQL版本&#xff1a;社区版 8.0.11.0 1、下…

GB28181/GB35114平台LiveGBS何如添加白名单,使指定海康、大华、华为等GB28181摄像头或录像机设备可以免密接入

1、什么是GB/T28181级联 协议定义中的解释如下&#xff1a; 级联 cascadednetworking 两个信令安全路由网关之间按照上下级关系连接,上级中心信令控制服务器通过信令安全路由网 关可调用下级中心信令控制服务器所管辖的监控资源,下级中心信令控制服务器通过信令安全路由网 关向…

打包时,自动更新版本号,清空缓存

1.创建 addVersion.js 文件 let fs require(fs);function getPackageJson(){return JSON.parse(fs.readFileSync(./package.json)); } try{let packageJson getPackageJson();//把分割的数组项转成数字&#xff0c;不然拼接就是字符串拼接let arr packageJson.version.spl…

pyqt treeWidget树生成

生成treeWidget树与获取treeWidget树节点的数据 # encodingUTF-8 import sys from PyQt5.QtCore import Qt from PyQt5.QtWidgets import QApplication, QTreeWidgetItem, QLineEdit, QSpinBox, QComboBox from PyQt5.QtWidgets import QWidget from release_test import Ui_F…

Visual Studio 新特性:对 include 指令进行智能诊断

今天&#xff0c;我们很高兴地宣布新功能&#xff1a;#include 语言智能诊断。 此功能自 Visual Studio 2022 v17.9 预览版2 中可用。通过此新功能&#xff0c;您可以获取到有关每个 include 的引用和生成时间的详细信息&#xff0c;从而更好地了解 #include 指令的行为。 &g…

pgsql中epoch用法

问题描述 提示&#xff1a;这里描述项目中遇到的问题&#xff1a; 昨天又被叫回来加班,説是数据问题,又回来加班搞,到了以后发现数据没问题,那就是查询接口的事了,写查询接口的人用时间戳去查询,明明直接可以直接用日期查询,非得改成时间戳查询,结果还是有问题,接下来复盘一下…

ffmpeg写YUV420文件碰到阶梯型横线或者条纹状画面的原因和解决办法

版权声明&#xff1a;本文为CSDN博主「文三~」的原创文章&#xff0c;遵循CC 4.0 BY-SA版权协议&#xff0c;转载请附上原文出处链接及本声明。 原文链接&#xff1a;https://blog.csdn.net/asdasfdgdhh/article/details/112831581 留作备份 阶梯型横线&#xff1a; 条纹状画面…

x-cmd pkg | grex - 用于生成正则表达的命令行工具

目录 简介首次用户生成的正则表达式与 perl 和 rust 兼容支持 Unicode 符号友好的用户体验进一步阅读 简介 grex 是一个旨在简化创作正则表达式的复杂且繁琐任务的库和命令行程序。这个项目最初是 Devon Govett 编写的 JavaScript 工具 regexgen 的 Rust 移植。但 regexgen 在…

智数融合|低代码入局,推动工业数字化转型走"深"向"实"

当下&#xff0c;“数字化、智能化”已经不再是新鲜词汇。事实上&#xff0c;早在几年前&#xff0c;就有企业开始大力推动数字化转型&#xff0c;并持续进行了一段时间。一些业内人士甚至认为&#xff0c;“如今的企业数字化已经走过了成熟期&#xff0c;进入了深水区。” 但事…

爱情视频相册怎么做?2.14情人节表白/活动视频模板PR剪辑素材

美好爱情故事&#xff0c;情人节表白视频相册怎么做&#xff1f;粉色浪漫的PR情人节表白/活动视频模板剪辑素材mogrt下载。 特征&#xff1a;可编辑文字和调整颜色&#xff0c;通过智能对象替换图像&#xff0c;RGB颜色模式&#xff0c;易于自定义&#xff0c;无需插件&#xf…

时间同步ntp与chrony的配置

时间同步命令&#xff0c;ntp性能不太强&#xff0c;chrony的性能好&#xff0c;默认安装&#xff1b;一般建议使用chrony 1.ntp date&#xff1a;查询当前具体时间 date -s 1 year&#xff1a;日期大小增加1年 nepdate ntp.aliyun.com&#xff1a;将日志同步到阿里云&…

【JaveWeb教程】(18) MySQL数据库开发之 MySQL数据库设计-DDL 如何查询、创建、使用、删除数据库数据表 详细代码示例讲解

目录 2. 数据库设计-DDL2.1 项目开发流程2.2 数据库操作2.2.1 查询数据库2.2.2 创建数据库2.2.3 使用数据库2.2.4 删除数据库 2.3 图形化工具2.3.1 介绍2.3.2 安装2.3.3 使用2.2.3.1 连接数据库2.2.3.2 操作数据库 2.3 表操作2.3.1 创建2.3.1.1 语法2.3.1.2 约束2.3.1.3 数据类…

CMake入门教程【高级篇】CPack打包项目Linux的deb和windows的msi

😈「CSDN主页」:传送门 😈「Bilibil首页」:传送门 😈「动动你的小手」:点赞👍收藏⭐️评论📝 文章目录 1. 什么是CPack?2. 如何使用CPack?2.1 在CMakeLists.txt中包含CPack模块2.2 设置CPack变量2.3 创建分发包3.CPack命

TortoiseSVN·文件锁定与清理

安装 TortoiseSVN 的时候&#xff0c;选择 svn 命令可用, 选择 will be intalled on local hard drive 。 在锁定的文件夹内 cmd 进入终端&#xff0c;输入 find . -type f -name ".svn/lock" -exec rm -f {} \; 删除所有锁定文件。进行清理操作&#xff1a;svn clea…