Cesium 鼠标移出地球,但移动中生成的内容还在球上

news/2024/11/26 19:06:07/

文章目录

    • 问题
    • 分析

问题

在开发中,遇到这么一种情况,鼠标移动生成坐标点的经纬,因此 lable 是根据鼠标移动一起的,但是当鼠标脱离球体之后,最后一次在球上的标签依然还固定在球上未被消除,想过用删除实体的方式删除,但并没有用。因此,经过尝试之后总结如下:

分析

要实现鼠标在球体上显示,离开球体不显示的效果,你可以借助 Cesium 的 Entity 对象和 ScreenSpaceEventHandler 来实现。首先,创建一个球体的 Entity 对象,然后在鼠标移动事件中更新球体的可见性。

以下是一个示例代码:

// 创建 Cesium 场景
var viewer = new Cesium.Viewer('cesiumContainer');// 创建球体的 Entity 对象
var sphere = viewer.entities.add({position: Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883),ellipsoid: {radii: new Cesium.Cartesian3(500000.0, 500000.0, 500000.0),fill: true,outline: true,outlineColor: Cesium.Color.BLACK,material: Cesium.Color.RED.withAlpha(0.5)},show: false // 初始状态下不显示球体
});// 创建 ScreenSpaceEventHandler 对象
var handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);// 监听鼠标移动事件
handler.setInputAction(function(movement) {var position = movement.endPosition;// 将屏幕坐标转换为世界坐标var ray = viewer.camera.getPickRay(position);var intersection = viewer.scene.globe.pick(ray, viewer.scene);if (Cesium.defined(intersection)) {// 鼠标在球上移动时,显示球体sphere.show = true;} else {// 鼠标离开球时,隐藏球体sphere.show = false;}
}, Cesium.ScreenSpaceEventType.MOUSE_MOVE);

在上述代码中,我们创建了一个 Cesium 场景 viewer。然后,我们创建了一个球体的 Entity 对象 sphere,并设置其初始位置和外观属性。初始状态下,将 sphere.show 设置为 false 来隐藏球体。

然后,我们创建了一个 ScreenSpaceEventHandler 对象 handler,并使用 setInputAction 方法监听鼠标移动事件。当鼠标移动时,会触发回调函数,其中 movement.endPosition 是鼠标在屏幕上的位置。

我们使用 viewer.camera.getPickRay(position) 将屏幕坐标转换为射线。然后,通过 viewer.scene.globe.pick(ray, viewer.scene) 方法,判断射线是否与球体交叉。如果有交叉点,则说明鼠标在球体上移动,将 sphere.show 设置为 true 来显示球体;如果没有交叉点,则说明鼠标离开球体,将 sphere.show 设置为 false 来隐藏球体。
经过上述的案例思考后,想出可以使用 this.viewer.entities.remove(labelEntity);来删除

接下来是我完整代码:

  • 鼠标移动事件
//鼠标移动事件
mouseMoveEvent() {var labelEntity = null; // 标签实体this.viewer.screenSpaceEventHandler.setInputAction((moveEvent) => {//var movePosition = this.viewer.scene.pickPosition(moveEvent.endPosition); // 鼠标移动的点// 判断是否在球上var movePosition = this.viewer.scene.globe.pick(this.viewer.camera.getPickRay(moveEvent.endPosition), this.viewer.scene);if(movePosition){this.leafEath = true;console.log(movePosition)if (this.positions.length == 2) {this.positions.pop();this.positions.push(movePosition);// 绘制labelif (labelEntity) {this.viewer.entities.remove(labelEntity);this.entityCollection.splice(this.entityCollection.indexOf(labelEntity), 1);}// 计算中点this.centerPoint = Cesium.Cartesian3.midpoint(this.positions[0], this.positions[1], new Cesium.Cartesian3());// 计算距离this.lengthText = "距离:" + this.getLengthText(this.positions[0], this.positions[1]);// 鼠标移动事件labelEntity = this.addLabel(this.centerPoint, this.lengthText);this.entityCollection.push(labelEntity);} else {this.positions.push(movePosition);}}else{this.leafEath = false;// 用于控制点击后生成的坐标标签信息,因为之前鼠标点击后要生成坐标标签,因此这个时候需要也控制一下this.viewer.entities.remove(labelEntity);return false;}}, Cesium.ScreenSpaceEventType.MOUSE_MOVE);},
  • 添加标签
//  添加标签
addLabel(centerPosition, text) {return this.viewer.entities.add(new Cesium.Entity({position: centerPosition,label: {text: text,font: '14px sans-serif',style: Cesium.LabelStyle.FILL_AND_OUTLINE, //FILL  FILL_AND_OUTLINE OUTLINEfillColor: Cesium.Color.YELLOW,showBackground: true, //指定标签后面背景的可见性backgroundColor: new Cesium.Color(0.165, 0.165, 0.165, 0.8), // 背景颜色backgroundPadding: new Cesium.Cartesian2(6, 6), //指定以像素为单位的水平和垂直背景填充paddingpixelOffset: new Cesium.Cartesian2(0, -25),disableDepthTestDistance: Number.POSITIVE_INFINITY}}));
},

http://www.ppmy.cn/news/1117187.html

相关文章

【工具】咸鱼之王辅助小助手来了!

自动答题的视频演示:【工具】咸鱼之王辅助小助手来了!_哔哩哔哩_bilibili 刚开始搞,还没来得及做界面,目前只做了自动答题。 欢迎感兴趣的大佬一起来开发~

计网第五章(运输层)(三)(TCP和UDP的对比)

一、UDP协议和TCP协议的对比 1、UDP无连接,TCP面向连接 使用UDP协议的通信双方可以随时发送数据,使用TCP协议的通信双方必须先进行3次握手建立连接,才能发送数据,最后还要进行4次挥手才能释放连接。 2、UDP支持单播、多播以及广…

stable diffusion model训练遇到的问题【No module named ‘triton‘】

一天早晨过来,发现昨天还能跑的diffusion代码,突然出现了【No module named ‘triton’】的问题,导致本就不富裕的显存和优化速度雪上加霜,因此好好探究了解决方案。 首先是原因,由于早晨过来发现【电脑重启】导致了【…

在JAVA中intValue()、parseInt()、valueOf()的区别

JAVA API文档对于intValue()、parseInt()、valueOf()的介绍: 详解见代码 package JAVA_API;public class Test {public static void main(String[] args) {Integer inew Integer("10");//将包装类型的对象转换成基本数据类型(非静态方法&…

SpringBoot统一返回处理遇到cannot be cast to java.lang.String问题

ResponseBodyAdvice 接口概述 1、ResponseBodyAdvice 接口允许在执行 ResponseBody 或 ResponseEntity 控制器方法之后,但在使用 HttpMessageConverter 写入响应体之前自定义响应,进行功能增强。通常用于 加密,签名,统一数据格式…

前端面试话术集锦第 16 篇:高频考点(前端监控 UDP知识点)

这是记录前端面试的话术集锦第十六篇博文——高频考点(前端监控 & UDP知识点),我会不断更新该博文。❗❗❗ 1. 监控 前端监控一般分为三种,分别为: 页面埋点 性能监控 异常监控。 我们来学习这些监控相关的内容,但是基本不会涉及到代码,只是让大家了解下前端监控该…

2023-09-20 Android CheckBox 让文字显示在选择框的左边

一、CheckBox 让文字在选择框的左边 &#xff0c;在布局文件里面添加下面一行就可以。 android:layoutDirection"rtl" 即可实现 android:paddingStart"10dp" 设置框文间的间距 二、使用的是left to right <attr name"layoutDirection">&…

docker系列(8) - docker网络

文章目录 8. docker网络8.1 四种网络模式8.2 常用命令8.3 桥接网络模式8.3.1 桥接网络模式说明8.3.2 桥接网络模式案例 8.4 host网络模式8.4.1 host网络模式说明8.4.2 host模式案例 8.5 none网络模式8.5 container网络模式8.5.1 container网络模式说明8.5.2 container网络模式案…