新闻详情

新闻详情

首页 / 资讯中心 / 详情

CesiumJS 自定义 Widget 快速上手:Cesium Viewer 控件扩展完整指南

发布时间:2026/9/11 14:20:43来源:尧图网络
CesiumJS 自定义 Widget 快速上手:Cesium Viewer 控件扩展完整指南
CesiumJS 自定义 Widget 快速上手Cesium Viewer 控件扩展完整指南【免费下载链接】cesiumAn open-source JavaScript library for world-class 3D globes and maps :earth_americas:项目地址: https://gitcode.com/GitHub_Trending/ce/cesiumCesiumJS 自定义 Widget 是扩展三维地球界面的核心手段。官方 Widget 源码 里的 HomeButton、Geocoder 全是同一套套路容器 视图模型 事件订阅。本文用一个最小示例走通 CesiumJS 组件开发的完整链路引入、注册、通信、销毁。 默认控件不够用的场景Viewer 自带地理编码器、Home 按钮、场景模式切换都在工具栏里。可业务一来就露馅要加切换坐标显示一键定位厂区按类别筛选图层这些控件官方没有。Widget 在 CesiumJS 里就是挂在 Viewer 旁边、能操作场景的 UI 模块。CesiumWidget 管场景渲染Viewer 在它上面再管工具栏和图层你自定义的控件和它们平级共享同一套容器、事件、生命周期约定。 第一个自定义组件跑起来依赖怎么引CDN 样式页面里引入两个东西主库和样式。样式文件里已经有cesium-button、cesium-toolbar-button这些现成类按钮风格能和官方控件保持一致。link relstylesheet hrefhttps://cdn.jsdelivr.net/npm/cesium115/Build/Cesium/Widgets/widgets.css / script srchttps://cdn.jsdelivr.net/npm/cesium115/Build/Cesium/Cesium.js/script div idviewer/div写出你的第一个自定义控件下面这个添加标注按钮结构和官方 HomeButton 完全同构构造函数建 DOM、绑定事件销毁时清理干净。class MarkerDropper { constructor(container, viewer) { this._viewer viewer; this._container container; this._buildButton(); } _buildButton() { const btn document.createElement(button); btn.type button; btn.className cesium-button cesium-toolbar-button; btn.textContent 添加标注; btn.addEventListener(click, () { viewer.entities.add({ position: Cesium.Cartesian3.fromDegrees(116.39, 39.9, 2000), point: { pixelSize: 10, color: Cesium.Color.RED }, }); }); this._btn btn; this._container.appendChild(btn); } destroy() { if (!this.isDestroyed()) { this._btn.removeEventListener(click, this._onAdd); this._container.removeChild(this._btn); } return destroyObject(this); } }几个点说明一下按钮直接appendChild到工具栏容器和官方按钮共用一套 class样式自动对齐点击回调里操作的是viewer.entities这是组件和场景交互的入口事件回调建议单独存成具名方法示例里为紧凑写成了箭头函数否则removeEventListener对不上号一行代码挂到 Viewer 上官方控件的构造签名是new HomeButton(container, scene)你的组件同理把往哪儿放作为容器传进去。定位靠 CSS别在 JS 里算坐标。const viewer new Cesium.Viewer(viewer); // 容器放在 viewer 内按钮就落在工具栏那一排 const holder document.createElement(div); holder.className my-widget-holder; viewer.container.appendChild(holder); const dropper new MarkerDropper(holder, viewer);.my-widget-holder { position: absolute; top: 5px; right: 5px; z-index: 5; }viewer.container是 Viewer 的根元素把自定义容器挂进去后position: absolute就相对整个视口生效右上角、右下角随你摆。 它是怎么工作的——拆解官方控件想让自己的控件和官方一个味值得看看 HomeButton 的真实结构一个视图文件 一个 ViewModel 文件靠 Knockout 的 MVVM 模式串起来。ViewModel 持有状态HomeButtonViewModel里存了scene和可观察属性tooltip用knockout.track(this, [tooltip])声明响应视图声明式绑定按钮上写data-bindattr: {title: tooltip}, click: commandKnockout 自动同步属性变化和点击行为不用手写addEventListenercommand 模式点击逻辑包在createCommand里视图只负责触发销毁对称knockout.cleanNode(element)清绑定再removeChild移除节点和构造过程一一对应最小示例里我省掉了 viewModel 层只留了视图 事件两步。等控件有了需要响应式更新的状态比如显示当前坐标再把 viewModel 补回来骨架不变。 组件与场景的对话——事件驱动多个组件都盯着同一个场景时别让 A 组件直接持有 B 组件的引用。Cesium 的 Event 就是干这个的发布方只管raiseEvent订阅方按需addEventListener互不依赖。典型流向是场景每帧渲染完 → 某个组件收到通知 → 更新自己的 UI。比如一个坐标面板订阅scene.postRender每帧读一次相机位置刷到自己的 DOM 上另一个飞行按钮组件订阅相机状态变化来切换自己的可用态。数据从场景流出组件之间零耦合谁先谁后、有没有第三个组件都无所谓。♻️ 初始化、更新与销毁——生命周期初始化构造函数里完成 DOM 创建和事件绑定只做一次别放每帧逻辑更新每帧跑的东西坐标刷新、样式切换挂到scene.postRender这类事件上随场景帧循环走销毁逆序清理。移除 DOM 监听 →removeChild节点 → 取消Event订阅 →destroyObject⚠️ 销毁时防内存泄漏的关键就是最后一步return destroyObject(this)之后isDestroyed()返回true这是 Cesium 对象的通用约定官方所有可销毁对象都这样收尾。 工程化清单事项做法目录组织src/下分widgets/组件、controls/基础控件、utils/工具、main.js入口一个组件一个目录视图和 viewModel 各一个文件样式隔离自定义类名加业务前缀如myapp-toolbar-btn别动cesium-开头的官方类避免升级时被覆盖DOM 批量操作一次更新多个节点时先拼好DocumentFragment再插入减少重排事件委托列表类控件把点击绑在父容器上用closest判断目标而不是每个子项一个监听器资源清理destroy里逐条移除监听、取消 Event 订阅、清空容器最后destroyObject 常见坑速查现象可能原因处理方式组件飘到左上角、挡住球体容器没定位或viewer.container不是定位父级容器设position: absolutez-index确认挂在 Viewer 根元素内窗口缩放后控件错位没处理 resize监听window.resize重新计算位置或改用 CSS 百分比定位界面文字写死中文硬编码字符串文案抽到语言包参考官方 Knockout i18n 绑定 思路做属性绑定按钮和官方风格不一致没用官方按钮类加cesium-button cesium-toolbar-button颜色跟随 widgets.css 主题收尾自定义 Widget 在 CesiumJS 里不是什么黑科技容器、事件、销毁三件事做齐就和官方工具栏上的按钮一样规整。把上面的最小示例跑通再对着官方控件改复杂度上去了也有章法可依。继续往下挖官方 Widget 源码packages/widgets/Source/编码规范写代码前必读Documentation/Contributors/CodingGuide/示例库每个示例含可运行的 main.jspackages/sandcastle/gallery/全局样式入口packages/widgets/Source/widgets.css官方贡献者文档总览Documentation/Contributors/【免费下载链接】cesiumAn open-source JavaScript library for world-class 3D globes and maps :earth_americas:项目地址: https://gitcode.com/GitHub_Trending/ce/cesium创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

嵌入式面试高频考点与实战避坑清单:C语言、Linux驱动与通信协议全解析 2026/9/11 14:56:57

嵌入式面试高频考点与实战避坑清单:C语言、Linux驱动与通信协议全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
PyTorch单卡到DDP分布式训练迁移完全指南 2026/9/11 14:56:57

PyTorch单卡到DDP分布式训练迁移完全指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
RK3588实战:双LQ50存算一体卡跑通Qwen3-27B大模型 2026/9/11 14:56:57

RK3588实战:双LQ50存算一体卡跑通Qwen3-27B大模型

很多搞嵌入式AI的同行看到标题第一反应大概率是:27B参数的Qwen模型,那不是要48G显存起步?怎么搬进一个RK3588盒子里?去年我也这么想,直到手里多了一块AIBOX PRO KIT——原生带两个M.2插槽的RK3588开发套件,…

阅读更多 →
ROS2节点与话题:机器人分布式通信核心机制解析 2026/9/11 14:56:57

ROS2节点与话题:机器人分布式通信核心机制解析

1. ROS2节点与话题的本质解析作为机器人操作系统ROS2的核心通信机制,节点(Node)和话题(Topic)构成了分布式系统的神经网络。在最近参与的机械臂开发项目中,我深刻体会到这两个概念的重要性——它们就像机器人的神经元和突触,节点负责处理具体…

阅读更多 →
conda报错bad interpreter?从shebang原理到环境迁移的完整修复指南 2026/9/11 14:56:57

conda报错bad interpreter?从shebang原理到环境迁移的完整修复指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
LeNet5与MNIST:PyTorch实现与交互式应用开发 2026/9/11 14:53:55

LeNet5与MNIST:PyTorch实现与交互式应用开发

1. LeNet5与MNIST:经典组合的现代实践1998年Yann LeCun提出的LeNet5架构,作为卷积神经网络的先驱,至今仍是入门计算机视觉的首选教学模型。这个仅有7层的"浅层"网络,在MNIST数据集上能达到99%以上的准确率——这个包含6…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞