发布时间:2026/9/5 17:31:05
Cesium圆绘制工具:从Ellipse原理到动态交互实现 在 Cesium 项目里“圆”可能是我见过开发频率最高的图元之一。很多业务场景都会先画一个半径范围雷达扫描范围、风电场影响圈、安全警戒区、通勤圈、地块覆盖范围等。最初我习惯把圆心和半径写成常量直接塞进一个ellipse但等到需求变成“让业务人员在三维场景里自己动态绘制一个圆”时事情就变得不太一样了鼠标点哪、半径怎么算、预览怎么实时更新、取消和完成如何区分、圆是贴地还是贴模型这些细节如果没处理好后期会一直返工。这篇文章就以Cesium 绘图工具 - Circle为切入点从底层的EllipseGraphics概念讲到一套可直接复用的交互工具实现覆盖圆心拾取、动态半径计算、实时预览、完成回调以及后续如何接 Vue3 项目或把结果转成 GeoJSON。新手可以直接拿来学习有一定经验的开发者也可以把里面的交互状态机抽取出来扩展成矩形、多边形、高德箭头线等其他绘图工具。1. 认识 Cesium 中的 Circle 绘图1.1 Circle 的本质是 EllipseCesium 没有专门的CircleGraphics这样一个类你可能会在中文文档或英文文档里找不到“Circle”这个独立 API。通常我们说的“画圆”在 Cesium Entity API 里实际上是用椭圆图元ellipse实现的只要让椭圆的semiMajorAxis长半轴和semiMinorAxis短半轴相等它在视觉上就是一个标准圆。viewer.entities.add({ position: Cesium.Cartesian3.fromDegrees(116.3913, 39.9075), ellipse: { semiMajorAxis: 5000, // 长半轴单位米 semiMinorAxis: 5000, // 短半轴单位米 material: Cesium.Color.CYAN.withAlpha(0.4), outline: true, outlineColor: Cesium.Color.WHITE, outlineWidth: 2 } });如果你只想画一个空心的圆形“边界线”不需要填充面可以设置fill: false当然也可以保留半透明填充这在业务上通常更清晰。1.2 为什么不能直接传一个“像素半径”或“经纬度半径”很多刚开始接触 Cesium 的同学会把“圆的大小”想象成屏幕上多少像素或者把半径理解成经纬度差值。但 Cesium 的三维场景是建立在椭球体模型上的所以ellipse.semiMajorAxis和semiMinorAxis的单位都是米圆心位置的坐标系是 Cartesian3世界坐标而不是单纯的经纬度。也就是说如果我们想得到一个真实的 5 公里范围圆前提是拿到一个真实的空间距离 5000 米。如果直接从屏幕上两点之间通过百分比换算半径很容易在地图缩放级别不同时得到完全不一致的结果比如在北京和在赤道附近同样拖动 100 像素实际代表的半径可能差好几倍。1.3 Circle 的常见应用场景雷达探测范围展示用一个半透明圆表示雷达最大探测距离。规划禁入区在 GIS 场景中给操作员提供绘制圆形禁飞区、禁入区的能力。影响半径分析加油站服务半径、学校通勤半径、商业选址影响范围等。风电或光伏项目覆盖圈围绕风机的噪音影响范围、生态红线范围。三维可视化教学帮助初学 Cesium 的人理解坐标拾取、椭圆体计算、CallbackProperty 动态更新等核心概念。从架构上讲Circle 是最容易实现的绘图工具非常适合作为编码入门案例。理解它之后再去看 Cesium 中如何实现矩形、多边形、圆柱体、可视域分析、雷达光波甚至自定义线材质很多思路都是同构的。2. 环境准备与基础工程搭建2.1 技术栈版本说明我下面给出的示例基于原生 HTML JavaScript 本地 Cesium 包重点演示绘图工具本身的代码不依赖任何框架。如果你使用的是 Vue3 Vite只需要把绘图工具类单独抽成 JS 文件在生命周期函数里创建Viewer和工具实例即可核心逻辑完全一致。Cesium 本身迭代速度比较快不同小版本的 API 会有细微差异。因此本文不写死某一个固定版本号请以你项目中实际安装的 Cesium 包为准建议使用较新的 1.x 稳定版本。在本地运行时请确保能通过静态资源路径访问到 Cesium 的Cesium.js和widgets.css。2.2 最小可运行页面为了便于完全复现我先搭建一个最基础的index.html。!DOCTYPE html html langzh-CN head meta charsetUTF-8 / titleCesium Circle Draw Tool/title style html, body, #cesiumContainer { width: 100%; height: 100%; margin: 0; overflow: hidden; } .toolbar { position: absolute; top: 20px; left: 20px; z-index: 999; background: rgba(255, 255, 255, 0.9); padding: 10px 16px; border-radius: 6px; box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2); } .toolbar button { padding: 6px 14px; cursor: pointer; } /style link relstylesheet href./node_modules/cesium/Build/Cesium/Widgets/widgets.css / !-- 如果你的 Cesium 不是通过 npm 安装请改成实际静态资源路径 -- script window.CESIUM_BASE_URL ./node_modules/cesium/Build/Cesium/; /script script src./node_modules/cesium/Build/Cesium/Cesium.js/script script src./src/drawCircleTool.js/script /head body div idcesiumContainer/div div classtoolbar button iddrawCircleBtn绘制圆形/button button idclearCircleBtn清空/button /div script Cesium.Ion.defaultAccessToken 在这里填入你的 Cesium Ion Token; const viewer new Cesium.Viewer(cesiumContainer, { baseLayerPicker: false

相关新闻

2026/9/5 17:31:05

从写代码到说需求:vivo广告小游戏AI辅助开发全解析

在vivo开放平台投广告小游戏,最直观的感受就是:以前我写的是if (player.score > 100) { levelUp(); },现在我写的是“帮我加一个逻辑,玩家分数超过100就升级,并且弹个窗提示他获得新技能”。这不是段子,…

2026/9/5 17:31:05

从反射到强类型:FUI路由的Source Generator演进

从 GetTypes() 到强类型 Route:FUI Source Generator 的设计演进先交代一下背景。FUI 是我们内部的一个跨端 UI 框架,核心模块之一就是路由。早期版本的路由注册走的是最典型的反射方案:程序启动时扫描程序集,拿到所有标记了 Rout…

2026/9/5 17:26:05

AI游戏开发实战:NVIDIA ACE与生成式引擎的落地组合

2026年聊AI游戏开发,已经没有多少人还在纠结“要不要接入AI”了,大家默认一件事:AI跟渲染管线、物理引擎一样,是立项阶段就要想清楚的底层能力。我最近大半年几乎把NVIDIA ACE和Summer Engine这两类代表工具翻了个底朝天&#xff…

2026/9/5 18:21:08

校园食堂点评系统开发全流程:基于Spring Boot+Vue+MySQL的详细实现

写校园食堂点评系统这类毕业设计时,最容易出现的问题不是某个功能不会写,而是“数据库表之间是什么关系、前后端如何约定接口、评论状态该由谁控制”这些整体性问题没有梳理清楚。一个看起来只是“给食堂打分、留言”的项目,实际上要同时处理…

2026/9/5 18:21:08

基于STM32F103的智能井盖终端:从传感器采集到低功耗上报全流程实现

我最近把普中 STM32F103 开发板重新拿出来做了一个“精灵”智能井盖项目。目的不是简单地驱动几个模块点灯,而是把一套完整的物联网终端链路走通:井盖状态感知、环境气体监测、水浸预警、低功耗处理、远程数据上报。这块开发板在很多人的桌面上已经吃了很…

2026/9/5 18:21:08

STM8S105C8T6精准解码PT2259-S红外协议实战指南

简介:本资源是一套基于STM8S105C8T6微控制器的红外遥控解码完整开发包,面向嵌入式初学者、电子设计爱好者及STM8平台开发者,解决红外信号捕获、协议解析(如NEC/RC5)与上位机通信等核心问题,适用于智能家居遥…

2026/9/5 2:46:54

vSound小提琴数字处理器实操指南:从接线到演出的完整配置

电小提琴或者原声小提琴插电演出,第一个绕不开的坎就是声音难听。原声琴的共鸣和空气感一旦进了拾音器,出来的往往是一坨干瘪、发尖、带着奇怪塑料味的信号。我当初第一次把琴接上乐队调音台,直接被主唱吐槽"你这声音像在锯钢丝"。…

2026/9/5 2:46:52

传感器接口IC如何攻克生物化学传感的微弱信号难题?

1. 从电极到比特流:为什么生物化学传感必须依赖专用接口IC 做生物化学传感的人都有过类似的经历:明明传感器本身性能很好,信号输出却一塌糊涂——噪声大、漂移明显、重复性差,怎么调都达不到预期。很多时候问题并不在传感器&#…

2026/9/5 2:44:34

STM32F411CEU6多通道ADC采集:扫描模式+DMA实现详解

1. 多通道 ADC 的用武之地把“Multichannel ADC”和“STM32F411CEU6”这两个关键字放在一起,其实就是嵌入式开发里最常遇到的一类需求:用一块不算贵的 MCU,同时采集多路模拟信号。STM32F411CEU6 是 48 引脚的 Cortex-M4F 主控,主频…

2026/9/5 0:04:47

流式背压机制:避免前端渲染卡死与内存暴涨的滑动窗口限流

流式背压机制:避免前端渲染卡死与内存暴涨的滑动窗口限流在大模型流式输出(Streaming)与智能体实时推流的架构中,生产环境中经常出现一种“上下游生产消费速率严重失衡”的极端情况: 生产端极速产出:大模型…

2026/9/5 2:45:13

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/5 2:30:42

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/5 2:46:50

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…