三维地图Cesium中,如何监听地图点击事件,实现在实体上面鼠标右击时做处理。

在 Cesium 中,如果你想在实体(Entity)上实现鼠标右击(右键点击)的处理,你需要使用 Cesium 的事件系统来监听鼠标事件,并结合一些逻辑来判断点击是否发生在实体上。由于 Cesium 没有直接提供“点击实体”的事件,你需要自己实现这个逻辑。

以下是一个基本的步骤和示例代码,用于在 Cesium 中实现鼠标右击实体时的处理:

  1. 监听全局的鼠标右击事件:使用 Cesium 的 ScreenSpaceEventHandler 来监听鼠标右击事件。
  2. 判断点击位置是否位于实体上:这通常涉及到射线投射(ray-casting)或其他形式的拾取(picking)技术。Cesium 提供了 Scene.pick 方法,它可以用于获取在指定位置上的对象。
  3. 执行处理逻辑:如果点击位置上有实体,执行相应的处理逻辑。

示例代码:

var viewer = new Cesium.Viewer('cesiumContainer');// 创建一个 ScreenSpaceEventHandler 实例来监听鼠标事件
var handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);// 监听右键点击事件
handler.setInputAction(function(click) {// 使用 pick 方法获取点击位置上的对象var pickedObject = viewer.scene.pick(click.position);// 检查 pickedObject 是否是 Entity 或与 Entity 相关的对象(如 Primitive)// 注意:直接 pick 可能不会直接返回 Entity,而可能是与 Entity 相关的其他对象// 你可能需要遍历 EntityCollection 或使用其他方法来确认点击的 Entityif (pickedObject && /* 这里添加你的逻辑来判断 pickedObject 是否是你关心的 Entity */) {// 执行你的处理逻辑console.log('Right-clicked on an entity!');// 例如:显示一个提示框、改变实体的颜色等}
}, Cesium.ScreenSpaceEventType.RIGHT_CLICK);

注意

  • 直接使用 pick 方法可能不会直接返回 Entity 对象。它可能会返回与 Entity 相关的其他对象,如 Primitive、Geometry 等。你可能需要遍历你的 EntityCollection 或使用其他方法来确认点击的 Entity。
  • 如果你的 Entity 使用了 Billboard、Label 或其他不直接参与射线投射的可视化元素,那么你可能需要使用其他方法来检测点击,如检查鼠标位置是否在 Billboard 的边界框内。
  • 你可以使用 Cesium 的其他事件(如鼠标移动、左键点击等)来增强你的交互体验。

例:要在Cesium三维地图上点击某个点,在该点加一个自定义图标的实体,并且鼠标右击这个实体时,我要做一些操作。添加一个自定义图标的实体,并为该实体添加一个myData自定义数据,后面根据这个数据做是否点击该实体的判断。

    // 点击地图,添加一个自定义实体function clickCesiumMapAddEntities() {let ellipsoid = window.viewer.scene.globe.ellipsoid;dropHandler = new Cesium.ScreenSpaceEventHandler(window.viewer.scene.canvas);dropHandler.setInputAction((move) => {let cartesian = window.viewer.camera.pickEllipsoid(move.position, ellipsoid);if (cartesian) {// 苗卡尔椭球体的三维坐标 转 地图坐标(弧度)let cartographic = window.viewer.scene.globe.ellipsoid.cartesianToCartographic(cartesian);// 地图坐标(弧度) 转 十进制度数 toFixed保留小数点后几位let lon = Cesium.Math.toDegrees(cartographic.longitude).toFixed(8);//拿到经度let lat = Cesium.Math.toDegrees(cartographic.latitude).toFixed(8);//拿到纬度//自动获取模型高度let position = window.viewer.scene.pickPosition(move.position);//如果对象已定义,将度转为经纬度let lableHeight = Cesium.Cartographic.fromCartesian(position);let height = lableHeight.height.toFixed(2);//模型高度addBillboardEntities(lon,lat,height)}}, Cesium.ScreenSpaceEventType.LEFT_CLICK)},function addBillboardEntities(lon,lat,height){let myEntities = window.viewer.entities.add({name: 'myEntities',//给初始点位设置一定的离地高度,否者会被压盖position: Cesium.Cartesian3.fromDegrees(lon, lat, height),billboard: {image: baseUrlIcon, // 图片服务器完整的图片地址 如:static/images/mybaseUrlIcon.imgwidth: 60,height: 60,},myData: {name: 'myEntities',lon: lon,lat: lat,},})// 添加完实体,左键监听事件,判断点击的实体let handler = new Cesium.ScreenSpaceEventHandler(window.viewer.scene.canvas);handler.setInputAction(function (movement) {var picked = window.viewer.scene.pick(movement.position)if (Cesium.defined(picked) && picked.id.id) {if (!picked.id.myData) return;// myData就是我们在添加实体时,自己添加的自定义标识,在这里我们就可以做自己的事情了console.log('我当前点击的是那个实体:',picked.id.myData)}}, Cesium.ScreenSpaceEventType.RIGHT_CLICK)}

删除某个实体 window.viewer.entities.remove(entitys[i]);

删除所有实体:window.viewer.entities.removeAll();

拿到当前已添加所有的实体window.viewer.entities._entities._array;

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

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

相关文章

03-《含羞草》

含羞草 含羞草(学名:Mimosa pudica Linn. ):为豆科多年生草本或亚灌木,由于叶子会对热和光产生反应,受到外力触碰会立即闭合,所以得名含羞草。形状似绒球。开花后结荚果,果实呈扁圆形…

sql获取下个月开始日期与结束日期

mysql获取下个月开始日期与结束日期 SELECTid,DATE_FORMAT(DATE_ADD(LAST_DAY(limitStartTime), INTERVAL 1 DAY), %Y-%m-01) AS limitStartTime,LAST_DAY(DATE_ADD(limitStartTime, INTERVAL 1 MONTH)) AS limitEndTime,createTime,creator FROMorder_special_drugs;这里的SQ…

学习笔记——动态路由——OSPF(工作原理)

九、OSPF协议的工作原理 1、原理概要 (1)相邻路由器之间周期性发送HELLO报文,以便建立和维护邻居关系。 (2)建立邻居关系后,给邻居路由器发送数据库描述报文(DD),也就是将自己链路状态数据库中的所有链路状态项目的摘要信息发送给邻居路由器…

LabVIEW汽车ECU测试系统

开发了一个基于LabVIEW开发的汽车发动机控制单元(ECU)测试系统。该系统使用了NI的硬件和LabVIEW软件,能够自动执行ECU的功能测试和性能测试,确保其在不同工作条件下的可靠性和功能性。通过自动化测试系统,大大提高了测…

使用 Rustup 管理 Rust 版本

文章目录 安装 Rustup配置镜像源安装 Rustup 安装 RustVS Code插件创建项目代码示例 Rust 官网:https://www.rust-lang.org/zh-CN/Crates 包管理:https://crates.io/Rust 程序设计语言:https://kaisery.github.io/trpl-zh-cn/通过例子学 Rust…

Jdk17是否有可能代替 Jdk8

JDK发展历史和开源 2006年SUN公司开源JDK,成立OpenJDK组织。2009年Oracle收购SUN,加快JDK发布周期。Oracle JDK与OpenJDK功能基本一致,但Oracle JDK提供更长时间的更新支持。 JDK版本特性 JDK11是长期支持版本(LTS)…

DevOps认证是什么?DevOps工具介绍

DevOps 这个词是由Development(开发) 和 Operations(运维)组合起来的,你可以把它理解成为一种让开发团队和运维团队紧密合作的方法。 DevOps从2009年诞生到现在已经14年多了,一开始大家还在摸索&#xff0…

因为文件共享不安全,所以你不能连接到文件共享。此共享需要过时的SMB1协议,而此协议是不安全的 解决方法

目录 1. 问题所示2. 解决方法3. 解决方法1. 问题所示 输入共享文件地址的时候,出现如下信息: 因为文件共享不安全,所以你不能连接到文件共享。此共享需要过时的SMB1协议,而此协议是不安全的,可能会是你的系统遭受攻击。你的系统需要SMB2或更高版本截图如下所示: 2. 解决…

mongodb中常用的运算符和正则表达式

在mongodb中不能><&#xff0c;>&#xff0c;<&#xff0c;!等运算符&#xff0c;需要使用替代符号 1.前言&#xff1a; >----$gt <----$lt >----$gte < ----$lte !----$ne 例如&#xff1a;查询id比三大的所有记录 db.students.find({id:{$gt:3}});…

ASPICE培训:推动汽车行业软件质量的新高度

在当今日新月异的汽车行业中&#xff0c;软件技术已经成为推动行业发展的核心动力。随着智能化、网联化、电动化等趋势的加速&#xff0c;汽车软件的质量和性能要求也越来越高。为了满足这一需求&#xff0c;ASPICE&#xff08;Automotive SPICE&#xff09;标准应运而生&#…

【Elasticsearch】一、概述,安装

文章目录 概述全文搜索引擎概述ES&#xff08;7.x&#xff09; 安装ES&#xff08;Docker&#xff09;测试&#xff0c;是否启动成功 可视化工具配置中文 客户端Postman下载 概述 ES是开源的高扩展的分布式全文搜索引擎&#xff0c;实时的存储、检索数据&#xff1b;本身扩展性…

助力游戏实现应用内运营闭环,融云游戏社交方案升级!

通信能力在所有应用场景都是必备组件&#xff0c;这源于社交属性带给应用的增长神话。 在游戏场景&#xff0c;玩家从少数核心向大众用户泛化扩展的过程&#xff0c;就是游戏深度融合社交能力的过程。 从单机到联机&#xff0c;游戏乐趣的升级 1996 年&#xff0c;游戏界顶流…

理解 REST API 和 GraphQL 的区别

你可能听说过 GraphQL&#xff0c;但对它与 REST 的区别还不完全确定。今天我们将介绍 REST 和 GraphQL 的一些基本原理&#xff0c;以及它们的不同使用场景。 GraphQL 作为 REST API 的替代品越来越受欢迎&#xff0c;不过它不一定是完全的“替代品”。 根据你的使用情景&am…

解析Kotlin中的Nothing【笔记摘要】

1.Nothing的本质 Nothing 的源码很简单&#xff1a; public class Nothing private constructor()可以看到它是个class&#xff0c;但它的构造函数是 private 的&#xff0c;这就导致我们没法创建它的实例&#xff0c;并且在源码里 Kotlin 也没有帮我们创建它的实例。 基于这…

cache映射

从主存到cache 假设把每个内存块分为4份&#xff0c;每次从主存中读取都是以块为单位&#xff0c;一次读取一个块。 (因为根据空间的局部性原理&#xff0c;当需要用到一个地址时&#xff0c;后续很大概率要用到其相邻的地址&#xff0c;因此一次读取一个块这种预读操作可以减…

无人机水运应用场景

航行运输 通航管理&#xff08;海事通航管理处&#xff09; 配员核查流程 海事员通过VHF&#xff08;甚高频&#xff09;系统与船长沟通核查时间。 无人机根据AIS&#xff08;船舶自动识别系统&#xff09;报告的船舶位置&#xff0c;利用打点定位 功能飞抵船舶上方。 使用…

GL823K USB 2.0 SD/MSPRO读卡器控制芯片

概述 GL823K是一个USB 2.0单轮读卡器控制芯片&#xff0c;可以支持SD/MMC/MSPRO闪存卡。它支持USB 2.0高速传输&#xff0c;它在一个芯片上可以控制读取诸如安全数字卡&#xff08;SD卡&#xff09;&#xff0c;SDHC卡&#xff0c;迷你SD卡&#xff0c;微SD卡&#xff08;T-Fl…

java基于ssm+jsp 二手交易平台网站

1商家能模块 商家首页&#xff0c;在商家首页页面可以查看个人中心、商品分类管理、商品信息管理、订单信息管理、订单配送管理信息&#xff0c;如图1所示。 图1商家首页界面图 个人中心&#xff0c;用户通过个人中心可以查看用户名、用户姓名、头像、性别、手机号码、邮箱等信…

keepalived HA nginx方案

安装 centos: yum -y install epel-release yum -y install nginx keepalivedkeepalived配置解析 /etc/keepalived/keepalived.conf ! Configuration File for keepalived # 全局变量 global_defs {router_id nginx_ha # 主从保持一致script_user root # 执行健康检查的…

《企业实战分享 · 常用运维中间件》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; 近期刚转战 CSDN&#xff0c;会严格把控文章质量&#xff0c;绝不滥竽充数&#xff0c;如需交流&#xff…