cesium中绘制可以自由拖动的气泡弹窗

本文介绍如何在Cesium中实现自定义样式的气泡弹框,包括自由拖动及指向功能。通过直接绘制与Label标签相结合的方式,解决了原生方法无法满足样式定制和视距控制的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

说明

这篇博文主要解决以下几个问题:
1 cesium中绘制气泡弹框
2 气泡弹框可以自由拖动
3 气泡弹框有小尾巴可以定点指向

思路

1 cesium原生自带的Label解决了文字弹框,但是效果不是很理想,因为无法修改样式;
2 cesium原生提供的html嵌入,只是把世界坐标转换为了对应的屏幕坐标,没有办法根据视角距离去显隐控制气泡弹框
3 利用PinBuilder可以做出好的效果,但是文字效果又十分差

为了满足这些功能,所以我采用直接绘制+label标签的形式去解决这些问题
在这里插入图片描述

坐标获取

方法作用
viewer.camera.pickEllipsoid(movement.position)
viewer.camera.getPickRay(movement.position)获取画布上任何地方的世界坐标
viewer.scene.pick(movement.position)获取模型信息
viewer.scene.pickPosition(movement.position)获取球体上的坐标(但是不包含模型)
viewer.scene.drillPick(movement.position, limit, width, height)

这里验证下,每种坐标获取的结果
在这里插入图片描述

1 点击空间处
在这里插入图片描述2 点击球体上
在这里插入图片描述3 点击模型上
在这里插入图片描述
当然咯,每个坐标结果是有误差的,但是对于气泡业务,这种误差可以忽略不计;这里不做探究

然后利用这些获取坐标的方法结合鼠标操作,就制作成了以下效果:
在这里插入图片描述

### 创建 Cesium 气泡弹窗效果 为了在 Cesium 中创建气泡弹窗效果,可以采用如下方法: 通过 `viewer.entities.add` 方法向场景中添加实体,并利用 HTML 和 CSS 定制化设计气泡窗口样式。对于自动激活弹窗的需求,在不依赖点击事件的情况下,可以在初始化时即调用显示逻辑或者绑定到特定的时间线位置。 针对偏移问题,需注意将三维世界中的笛卡尔坐标 (Cartesian3) 正确转换成屏幕上的二维坐标,同时考虑到高度因素的影响来调整最终呈现的位置[^3]。 下面是一个简单的例子展示如何实现这一功能: ```javascript // 假设已有一个 cesium viewer 实例名为 'viewer' var position = Cesium.Cartesian3.fromDegrees(-75.1641667, 39.9522222); // 给定经纬度定义位置 function createBubblePopup(position){ var entity = viewer.entities.add({ name : 'Philadelphia', position : position, point : { pixelSize : 5, color : Cesium.Color.RED }, billboard: { // 使用billboard作为锚点 image : './path/to/icon.png', // 图标路径可选 verticalOrigin : Cesium.VerticalOrigin.BOTTOM } }); // 获取屏幕坐标并应用至自定义的 DOM 元素 var scene = viewer.scene; var canvas = scene.canvas; function updatePopupPosition(){ if (!scene || !canvas) return; let cartesian2D = scene.cartesianToCanvasCoordinates(entity.position.getValue()); if(cartesian2D){ document.getElementById('custom-popup').style.left = `${cartesian2D.x}px`; document.getElementById('custom-popup').style.top = `${cartesian2D.y}px`; } } // 初始化定位 updatePopupPosition(); // 动态更新位置以保持跟随目标移动 scene.postRender.addEventListener(updatePopupPosition); // 自动打开弹窗内容区 setTimeout(() => { $('#custom-popup').show(); // 利用 jQuery 显示隐藏元素 或者使用原生 JS 替代 }, 0); } ``` 此代码片段展示了基本架,实际项目可能还需要处理更多细节,比如响应式布局适配不同分辨率下的表现、优化性能避免频繁重绘等问题。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李卓书

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值