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

Cesium实战:手把手教你实现一个可拖拽编辑的交互式绘图工具(点线面圆矩形)

Cesium交互式绘图工具开发实战从基础绘制到可编辑图形引擎在三维地理信息系统开发中交互式绘图功能已经成为行业标配需求。本文将深入探讨如何基于Cesium构建一个功能完备的绘图工具模块不仅实现基础的点线面绘制更重点解决图形编辑这一技术难点。1. 绘图工具架构设计一个工业级的绘图工具需要具备完整的生命周期管理能力。我们采用分层架构设计将系统划分为四个核心层次交互层处理鼠标/触摸事件管理用户操作流程图形层维护图形实体集合处理渲染逻辑数据层存储图形几何数据支持序列化/反序列化服务层提供撤销/重做、样式配置等增值功能class DrawingTool { constructor(viewer) { this.viewer viewer; this.entities new Cesium.EntityCollection(); this.historyManager new HistoryStack(50); // 保留50步历史记录 this.stylePresets { default: { point: { color: Cesium.Color.RED, pixelSize: 10 }, polyline: { width: 3, material: Cesium.Color.BLUE }, polygon: { material: Cesium.Color.GREEN.withAlpha(0.4) } } }; } }关键设计要点使用单一EntityCollection管理所有绘图实体采用命令模式实现操作历史记录样式配置与图形数据分离支持热更新2. 基础绘制功能实现2.1 智能点捕捉技术传统点绘制直接使用屏幕坐标在实际项目中会遇到精度问题。我们实现三级捕捉策略地形捕捉优先获取地形表面坐标模型捕捉支持3DTiles/glTF模型表面取点椭球体捕捉作为最后回退方案function getPrecisePosition(viewer, screenPosition) { // 优先从3DTiles获取精确坐标 const pickedFeature viewer.scene.pick(screenPosition); if (pickedFeature pickedFeature.primitive) { const exactPosition viewer.scene.pickPosition(screenPosition); if (exactPosition) return exactPosition; } // 次选地形坐标 const ray viewer.scene.camera.getPickRay(screenPosition); const terrainPosition viewer.scene.globe.pick(ray, viewer.scene); if (terrainPosition) return terrainPosition; // 最后使用椭球体坐标 return viewer.scene.camera.pickEllipsoid( screenPosition, viewer.scene.globe.ellipsoid ); }2.2 动态图形预览在绘制过程中提供实时视觉反馈至关重要。我们利用CallbackProperty实现流畅的动态效果let tempPoints []; const dynamicPolyline viewer.entities.add({ polyline: { positions: new Cesium.CallbackProperty(() { return currentMousePosition ? [...tempPoints, currentMousePosition] : tempPoints; }, false), width: 2, material: new Cesium.PolylineGlowMaterialProperty({ glowPower: 0.2, color: Cesium.Color.YELLOW }) } });提示CallbackProperty的isConstant参数设置为false才能实现动态更新但会带来性能开销在复杂场景中需要谨慎使用。3. 图形编辑核心技术3.1 顶点拖拽实现方案实现可编辑图形的关键在于建立完整的交互链路拾取阶段通过射线检测确定被拖拽顶点拖拽阶段实时更新顶点位置并重绘图形提交阶段验证几何有效性并触发更新事件let draggedEntity null; let dragIndex -1; handler.setInputAction((movement) { const pickedObject viewer.scene.pick(movement.endPosition); if (draggedEntity) { // 更新顶点位置 const newPosition getPrecisePosition(viewer, movement.endPosition); if (newPosition) { draggedEntity.position newPosition; polygon.positions[dragIndex] newPosition; // 如果是闭合多边形同步更新首尾顶点 if (isClosed (dragIndex 0 || dragIndex polygon.positions.length-1)) { const syncIndex dragIndex 0 ? polygon.positions.length-1 : 0; polygon.positions[syncIndex] newPosition; } } } }, Cesium.ScreenSpaceEventType.MOUSE_MOVE);3.2 几何约束处理专业绘图工具需要支持各种几何约束约束类型实现方式应用场景垂直约束计算法向量建筑轮廓绘制平行约束保持斜率道路设计等长约束固定距离规则地块划分角度约束极坐标计算工程制图function applyLengthConstraint(positions, fixedIndex, targetIndex, fixedLength) { const vec Cesium.Cartesian3.subtract( positions[targetIndex], positions[fixedIndex], new Cesium.Cartesian3() ); Cesium.Cartesian3.normalize(vec, vec); Cesium.Cartesian3.multiplyByScalar( vec, fixedLength, vec ); return Cesium.Cartesian3.add( positions[fixedIndex], vec, positions[targetIndex] ); }4. 性能优化策略4.1 渲染性能提升当处理大量图形时需要特别关注渲染效率实例化渲染对同类图形使用Primitive API细节层次根据视距动态调整图形精度空间索引使用K-D树加速空间查询const instanceCollection new Cesium.GeometryInstance({ geometry: new Cesium.PolygonGeometry({ polygonHierarchy: new Cesium.PolygonHierarchy(positions), height: height, vertexFormat: Cesium.EllipsoidSurfaceAppearance.VERTEX_FORMAT }), attributes: { color: Cesium.ColorGeometryInstanceAttribute.fromColor( Cesium.Color.WHITE.withAlpha(0.5) ) } }); viewer.scene.primitives.add( new Cesium.Primitive({ geometryInstances: instanceCollection, appearance: new Cesium.EllipsoidSurfaceAppearance({ material: new Cesium.Material({ fabric: { type: Color, uniforms: { color: new Cesium.Color(1.0, 1.0, 1.0, 0.5) } } }) }) }) );4.2 内存管理要点长期运行的WebGIS应用必须注意内存泄漏及时销毁不再使用的Entity和Primitive合理释放事件监听器对大型几何数据使用Web Worker处理function cleanup() { // 销毁事件处理器 if (handler !handler.isDestroyed()) { handler.destroy(); } // 清除临时实体 if (tempEntity) { viewer.entities.remove(tempEntity); } // 释放几何缓存 if (geometryCache) { geometryCache.forEach(geom geom.destroy()); } }5. 高级功能扩展5.1 撤销/重做实现基于命令模式的撤销栈设计class HistoryStack { constructor(maxSize 30) { this.stack []; this.index -1; this.maxSize maxSize; } push(command) { // 截断当前索引之后的历史 this.stack this.stack.slice(0, this.index 1); this.stack.push(command); // 保持栈大小 if (this.stack.length this.maxSize) { this.stack.shift(); } else { this.index; } } undo() { if (this.index 0) { this.stack[this.index--].undo(); } } redo() { if (this.index this.stack.length - 1) { this.stack[this.index].execute(); } } }5.2 样式模板系统支持可配置的样式预设const styleTemplates { surveyArea: { polygon: { material: new Cesium.StripeMaterialProperty({ evenColor: Cesium.Color.WHITE.withAlpha(0.5), oddColor: Cesium.Color.BLUE.withAlpha(0.5), repeat: 5 }), outline: true, outlineColor: Cesium.Color.BLACK, outlineWidth: 2 }, point: { pixelSize: 12, color: Cesium.Color.RED, outlineColor: Cesium.Color.WHITE, outlineWidth: 2 } }, // 更多预设... }; function applyStyle(entity, templateName) { const template styleTemplates[templateName]; if (!template) return; if (entity.polygon template.polygon) { entity.polygon Object.assign({}, entity.polygon, template.polygon); } // 其他图形类型处理... }6. 工程化实践建议在实际项目集成绘图工具时推荐采用以下架构src/ ├── components/ │ └── DrawingTool/ │ ├── core/ # 核心绘图逻辑 │ ├── commands/ # 各种绘图命令 │ ├── styles/ # 样式配置 │ └── utils/ # 辅助工具 ├── stores/ │ └── drawingStore.js # 状态管理 └── assets/ └── drawing-icons/ # 绘图相关图标关键工程实践使用Vuex/Pinia管理绘图状态采用Web Worker处理复杂几何计算实现自动保存/恢复机制提供完善的TypeScript类型定义interface DrawingPoint { position: Cartesian3; properties?: Recordstring, any; style?: PointStyle; } interface DrawingOptions { snapping?: boolean; terrainClamp?: boolean; maxPoints?: number; constraints?: DrawingConstraints; } type DrawingEvent | { type: draw-start; shape: string } | { type: draw-update; positions: Cartesian3[] } | { type: draw-complete; result: DrawingResult };在开发过程中我们遇到的最棘手问题是移动端触摸交互的支持。最终通过实现触摸手势识别和适当增大热区解决了操作精度问题。对于需要高精度绘制的场景建议增加顶点吸附和输入框精确坐标输入功能。

相关文章:

Cesium实战:手把手教你实现一个可拖拽编辑的交互式绘图工具(点线面圆矩形)

Cesium交互式绘图工具开发实战:从基础绘制到可编辑图形引擎 在三维地理信息系统开发中,交互式绘图功能已经成为行业标配需求。本文将深入探讨如何基于Cesium构建一个功能完备的绘图工具模块,不仅实现基础的点线面绘制,更重点解决图…...

Talk It 文字转语音:优缺点分析,寻找替代方案

您是否尝试过 Talkit,但发现它难以满足您的文本转语音需求?或者您只是想在安装 Talkit 应用之前了解一下它?无论如何,您都可以在本文中找到答案。我们测试了这款应用以及一些替代方案,并在下文中进行了总结。您可以轻松…...

马斯克起诉OpenAI开庭,索赔最高1800亿美元,案件责任认定5月21日结束

奥尔特曼、布罗克曼到场,马斯克未出席 当地时间4月27日上午,案件如期开庭,进入陪审团遴选阶段。据彭博社报道,奥尔特曼和布罗克曼亲自到场,这对于知名科技高管来说较为罕见,一般不会出庭,马斯克…...

ARM处理器ETB调试系统架构与配置指南

1. ARM RealView ETB调试系统架构解析嵌入式追踪缓冲器(ETT Buffer)作为ARM处理器调试体系的核心组件,其硬件架构由三大部分构成:追踪数据采集单元(ETM)、数据缓冲单元(ETB)以及调试接口单元(JTAG)。在ARM926EJ-S和ARM1136J-S等经典处理器中,…...

Windows 11任务栏歌词插件终极指南:桌面歌词悬浮完整方案

Windows 11任务栏歌词插件终极指南:桌面歌词悬浮完整方案 【免费下载链接】Taskbar-Lyrics BetterNCM插件,在任务栏上嵌入歌词,目前仅建议Windows 11 项目地址: https://gitcode.com/gh_mirrors/ta/Taskbar-Lyrics 还在为听歌时需要频…...

基于安卓的家电以旧换新评估系统毕设源码

博主介绍:✌ 专注于Java,python,✌关注✌私信我✌具体的问题,我会尽力帮助你。一、研究目的本研究旨在构建一个基于安卓平台的智能化家电以旧换新评估系统,以解决传统家电回收评估过程中存在的信息不对称、评估标准不统一及资源利用效率低下等…...

AMD Ryzen终极调试指南:SMUDebugTool深度使用教程

AMD Ryzen终极调试指南:SMUDebugTool深度使用教程 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https://gitcod…...

ChatGPT 图像2.0发布:开发者最该关注的5个变化与上手清单

先说结论 如果你只记一件事:这次不是“画得更好看”这么简单,而是“更能按指令把图做对”。 对开发者最直接的价值是:做封面图、流程图、UI 草图、运营图时,返工次数会明显下降。一、ChatGPT 图像 2.0 到底是什么 根据 OpenAI 202…...

基于vue的鲜花销售网站[vue]-计算机毕业设计源码+LW文档

摘要:随着互联网技术的发展和人们消费习惯的改变,线上鲜花销售市场前景广阔。本文介绍了一个基于Vue框架开发的鲜花销售网站,详细阐述了其设计目标、采用的相关技术、需求分析、系统设计以及具体的实现过程。该网站实现了用户管理、商品展示与…...

【论文解读】Deformable Mamba for Wide Field of View Segmentation

论文题目:Deformable Mamba for Wide Field of View Segmentation 论文链接:https://arxiv.org/pdf/2411.164811. Abstract 宽视场(WFoV)图像分割对于自动驾驶至关重要,但面临着两大挑战:一是广角镜头带来的…...

升级鸿蒙6后,大家担心的痛点都搞定啦!真香!

朋友们,被用户追着说“还不去适配鸿蒙”的产品经理委托我发篇贴。 最近我在各大极客论坛看到好多鸿蒙6先锋用户在担心:鸿蒙6是真流畅,但你们升级后最怕的不是“卡”,而是“空”——书架空了、网盘空了、连看视频的快乐都没了。 …...

(课堂笔记)SQL 高级查询技巧:行列转换、重复数据、递归查询、连续登录

📝SQL高级查询技巧本笔记总结了SQL数据处理中的5个核心技巧:1)行列转换:使用CASE WHEN/PIVOT实现行转列,UNION ALL/UNPIVOT实现列转行;2)伪列应用:ROWNUM分页查询,ROWID精确去重;3)重…...

League Akari终极指南:英雄联盟智能自动化工具完全教程

League Akari终极指南:英雄联盟智能自动化工具完全教程 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit League Akari是一款基于英雄…...

FPGA图像处理提速秘籍:用双口RAM乒乓操作实现1080P视频流无缝缓存(实战篇)

FPGA图像处理提速秘籍:双口RAM乒乓操作实现1080P视频流无缝缓存实战 在实时视频处理领域,1080P60fps的高清视频流对硬件处理能力提出了严峻挑战。当数据速率达到148.5MHz(1920108060)时,传统单缓存架构往往难以避免帧…...

别再只会画板子了!用AD16仿真验证你的电路设计,保姆级避坑指南

从原理图到可靠设计:AD16电路仿真实战避坑手册 在硬件开发流程中,电路仿真常常被工程师们视为"可有可无"的步骤——直到某次打板后发现设计存在致命缺陷。Altium Designer 16内置的混合信号仿真工具,实际上是一个被严重低估的设计验…...

OpenCore Configurator:黑苹果引导配置的终极图形化解决方案

OpenCore Configurator:黑苹果引导配置的终极图形化解决方案 【免费下载链接】OpenCore-Configurator A configurator for the OpenCore Bootloader 项目地址: https://gitcode.com/gh_mirrors/op/OpenCore-Configurator 在非苹果硬件上运行macOS&#xff08…...

STM32F103驱动四路直流减速电机:DRV8848硬件连接与PWM配置避坑指南

STM32F103驱动四路直流减速电机:DRV8848硬件连接与PWM配置避坑指南 在机器人底盘或智能小车项目中,直流减速电机的稳定驱动是核心环节。许多嵌入式开发者初次使用STM32F103搭配DRV8848驱动模块时,常会遇到电机不转、异常抖动或控制失准等问题…...

告别绿幕!3分钟掌握OBS AI背景移除插件,让直播画面瞬间升级

告别绿幕!3分钟掌握OBS AI背景移除插件,让直播画面瞬间升级 【免费下载链接】obs-backgroundremoval An OBS plugin for removing background in portrait images (video), making it easy to replace the background when recording or streaming. 项…...

2026主流GEO优化公司实测推荐-技术自研与交付能力TOP5综合排行

一、市场形势:2026年GEO从“可选”到“必选”2026年,生成式AI已成为用户获取信息的第一入口。据CNNIC数据,中国生成式AI用户规模达5.15亿,半数网民将AI作为消费决策依据。与此同时,IDC报告显示2026年全球GEO市场规模已…...

怎样高效使用开源工具KeymouseGo:3种实用技巧与实战方案告别重复工作

怎样高效使用开源工具KeymouseGo:3种实用技巧与实战方案告别重复工作 【免费下载链接】KeymouseGo 类似按键精灵的鼠标键盘录制和自动化操作 模拟点击和键入 | automate mouse clicks and keyboard input 项目地址: https://gitcode.com/gh_mirrors/ke/KeymouseGo…...

命令行进度条完全指南:倒计时、缓冲区刷新与动态下载

进度条—命令行版本 前置知识 1.回车换行 \r:回车,将光标移动到当前行的开头。\n:换行,将光标移动到下一行的相同位置(通常是下一行开头)。在终端中,单独使用 \r 可以实现在同一行覆盖输出&…...

MixMatch实战避坑指南:在CIFAR-10上跑出论文效果,我踩了这些数据增强和超参数的坑

MixMatch实战避坑指南:在CIFAR-10上跑出论文效果的关键细节 当你在CIFAR-10数据集上尝试复现MixMatch论文结果时,可能会遇到各种意料之外的性能瓶颈。本文将分享我在实际项目中积累的经验教训,从数据增强管道的搭建到超参数的精细调节&#x…...

426-opencua tmux

技术趋势概述 2024年CSDN技术趋势预测聚焦于人工智能、云计算、边缘计算、量子计算、区块链等领域的突破性进展。文章将从技术革新、行业应用、开发者工具三个维度展开分析。 人工智能与机器学习 生成式AI的演进:多模态模型(如GPT-5)在代码生…...

别再为YOLOv8-Pose数据集发愁了!手把手教你用CVAT标注COCO格式关键点(附可视化代码)

从零构建YOLOv8-Pose数据集:CVAT标注全流程与实战技巧 当我们需要在特定场景下训练高精度的人体姿态估计模型时,现成的公开数据集往往难以满足需求。本文将带你完整走通从原始图像到可训练数据集的全部流程,重点解决标注过程中的实际痛点。 1…...

Ledger 硬件钱包支持币种大全(中国用户参考版)

Ledger 硬件钱包支持币种大全(中国用户参考版) 【核心摘要】 截至 2026 年,Ledger 硬件钱包通过其专有操作系统 BOLOS 与内置 SE 安全芯片(CC EAL5),已实现对全球超过 5,500 种数字资产的深度支持。对于中…...

别再乱装图片插件了!我手写了一个,能扒光整个网页(含背景/iframe/Shadow DOM)

开场白 我真的受够了,每次想从网页批量保存图片,要么右键被禁用,要么装了五六个插件还漏掉一半的 CSS 背景图,要么好不容易抓到图了,却发现插件在后台偷偷上报我的浏览记录。 于是我自己写了一个 —— Image Harvest…...

秘语盾技术团队解析 Ledger Nano X 蓝牙连接优化

秘语盾技术团队解析 Ledger Nano X 蓝牙连接优化 【核心摘要】 作为 Ledger 系列中唯一具备移动端无线连接功能的旗舰产品,Nano X 的蓝牙连接稳定性受限于移动设备系统版本及复杂的射频环境。针对中国用户在使用 Ledger Live App 时常见的“搜索不到设备”或“配对…...

MagiskHide Props Config终极指南:Android设备指纹伪装与安全检测绕过完整方案

MagiskHide Props Config终极指南:Android设备指纹伪装与安全检测绕过完整方案 【免费下载链接】MagiskHidePropsConf This tool is now dead... 项目地址: https://gitcode.com/gh_mirrors/ma/MagiskHidePropsConf 你是否曾经遇到过这样的困扰?在…...

暴雨大讲堂|AI算力异构与液冷重塑算力产业新格局

今年年初至今,短短四个月外部环境的变化应接不暇,不确定性成为常态,似乎人人都可以来上一句“唯一不变的是变化本身”作为口头禅。然而就在这些不确定中市场却给出了一个真实的“确定性”——那就是人工智能驱动下的算力增长。据彭博社近期报…...

基于云模型-MABAC决策框架的冷链物流供应商选择研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…...