当前位置: 首页 > web >正文

Cesium 自带的标注碰撞检测实现标注避让

  1. 随机生成10000个点
let labels: any = []
function addLabel(){labels = viewer.scene.primitives.add(new Cesium.LabelCollection())for (let index = 0; index < 10000; index++) {const angle = 2 * Math.PI * Math.random() // 随机角度labels.add({id: index,show: false,font: "14px sans-serif",position: Cesium.Cartesian3.fromDegrees(113.381345 + Math.cos(angle) * 10 * Math.random(), 30.287564 + Math.sin(angle) * 10 * Math.random(), 0),text: "标注" + index, // props.CJGZQYMC,disableDepthTestDistance: 10000.0,pixelOffset: new Cesium.Cartesian2(10, 0),// 这里设置了就不会被遮盖了,设为负值则在更上层eyeOffset: new Cesium.Cartesian3(0, 0, -500)})}
}
  1. 避让计算
const rectangleCollisionCheck: any = new Cesium.RectangleCollisionChecker()function calculateLabel() {const padding = 20rectangleCollisionCheck._tree.clear()for (const oneLabel of labels._labels) {if (oneLabel) {try {const ssPos = oneLabel.computeScreenSpacePosition(CIM.viewer.scene)let boundingRectangle = nulltry {boundingRectangle = Cesium.Label.getScreenSpaceBoundingBox(oneLabel, ssPos)} catch (e) {console.log(e)}if (boundingRectangle) {const { x, y, width, height } = boundingRectangleif (-Infinity === x || -Infinity === y || -Infinity === width || -Infinity === height) {oneLabel.show = false} else {const west = x - paddingconst south = y - paddingconst east = x + width + paddingconst north = y + height + paddingconst rectangle = new Cesium.Rectangle(west, south, east, north)const isCollide = rectangleCollisionCheck.collides(rectangle)if (isCollide) {oneLabel.show = false} else {oneLabel.show = truerectangleCollisionCheck.insert(oneLabel.id, rectangle)}}} else {oneLabel.show = false}} catch (e) {oneLabel.show = falseconsole.log("🚀 ~ updateLabelVisibility ~ e:", e)}} else {oneLabel.show = false}}
}
  1. 相机监听事件
viewer.camera.moveEnd.addEventListener(() => {calculateLabel()console.log("🚀 ~ CIM.viewer.camera.changed.addEventListener ~ calculateLabel:")})

如果是多个图层,可以通过优先占位的方式实现优先显示。

效果图:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

http://www.xdnf.cn/news/10702.html

相关文章:

  • esp32关于PWM最清晰的解释
  • 渊龙靶场-sql注入(数字型注入)
  • 快乐大冒险:解锁身体里的 “快乐密码”
  • 力扣刷题Day 68:搜索插入位置(35)
  • 如何在 Windows 11 24H2 的任务栏时钟中显示秒数
  • js的时间循环的讲解
  • 100V离线语音通断器
  • java笔记08
  • 15-2021剑侠情缘2-各种修复完善+虚拟机单机端+外网服务端整理+文本教程+视频教程
  • Linux服务器安装GUI界面工具
  • 【数据集】NCAR CESM Global Bias-Corrected CMIP5 Output to Support WRF/MPAS Research
  • Redis部署架构详解:原理、场景与最佳实践
  • Java函数式编程(中)
  • 第十二节:第五部分:集合框架:Set集合的特点、底层原理、哈希表、去重复原理
  • 《QDebug 2025年5月》
  • 基于大模型的急性乳腺炎全病程风险预测与综合治疗方案研究
  • Playwright Python API 测试:从入门到实践
  • 滑动窗口 -- 灵神刷题
  • C# 异常处理进阶:精准获取错误行号的通用方案
  • ubuntu安装devkitPro
  • 什么算得到?什么又算失去?
  • ps曝光度调整
  • 继承(全)
  • 2024年数维杯国际大学生数学建模挑战赛D题城市弹性与可持续发展能力评价解题全过程论文及程序
  • YOLOv10改进|爆改模型|涨点|C2F引入空间和通道注意力模块暴力涨点(附代码+修改教程)
  • 九(4).存在指针的引用,不存在引用的指针
  • uniapp-商城-77-shop(8.2-商品列表,地址信息添加,级联选择器picker)
  • window ollama部署模型
  • 2025年主流编程语言全面分析与学习指南
  • 【MySQL】使用C语言连接数据库