尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Cesium@1.138中点击绘制直线
export default class DrawLineTool { /** * 构造函数 * param {Object} cesium - Cesium 对象 * param {Object} viewer - Cesium Viewer 实例 */ constructor(cesium, viewer) { this.Cesium cesium; this.viewer viewer; this.handler null; this.isDrawing false; } /** * 开始绘制 * returns {PromiseArray{lon: number, lat: number}} 返回经纬度数组 */ startDraw() { const { Cesium, viewer } this; return new Promise((resolve, reject) { if (this.isDrawing) { console.warn(正在绘制中...); return; } this.isDrawing true; let tempEntities []; let firstPointPos null; // 动态更新虚线的位置回调 let currentMousePos null; let dynamicPositions new Cesium.CallbackProperty(() { if (firstPointPos currentMousePos) { return [firstPointPos, currentMousePos]; } return null; }, false); // 1. 鼠标变十字 viewer.canvas.style.cursor crosshair; if (!this.handler || this.handler.isDestroyed()) { this.handler new Cesium.ScreenSpaceEventHandler(viewer.canvas); } // 辅助方法笛卡尔坐标转经纬度 const getLonLat (cartesian) { const cartographic Cesium.Cartographic.fromCartesian(cartesian); return { lon: Cesium.Math.toDegrees(cartographic.longitude), lat: Cesium.Math.toDegrees(cartographic.latitude) }; }; // 2. 监听鼠标移动 this.handler.setInputAction((movement) { if (!this.isDrawing || !firstPointPos) return; // 这里的 pickEllipsoid 获取椭球面坐标对于贴地已经足够 const cartesian viewer.camera.pickEllipsoid(movement.endPosition, viewer.scene.globe.ellipsoid); if (cartesian) { currentMousePos cartesian; } }, Cesium.ScreenSpaceEventType.MOUSE_MOVE); // 3. 监听点击事件 this.handler.setInputAction((click) { const cartesian viewer.camera.pickEllipsoid(click.position, viewer.scene.globe.ellipsoid); if (!cartesian) return; // 第一次点击 if (!firstPointPos) { firstPointPos cartesian; // [修复重点]绘制不会被遮挡的、完整显示的起点 const pointEntity viewer.entities.add({ position: cartesian, point: { pixelSize: 12, color: Cesium.Color.YELLOW, outlineColor: Cesium.Color.BLACK, outlineWidth: 3, // 关键属性1贴地解决高度偏差问题 heightReference: Cesium.HeightReference.CLAMP_TO_GROUND, // 关键属性2禁用深度测试防止点被地形/模型遮挡显示不全 // 设置为 Number.POSITIVE_INFINITY 表示无论距离多远都禁用深度测试 disableDepthTestDistance: Number.POSITIVE_INFINITY } }); tempEntities.push(pointEntity); // 绘制跟随鼠标的黄色虚线 const dashLineEntity viewer.entities.add({ polyline: { positions: dynamicPositions, width: 3, material: new Cesium.PolylineDashMaterialProperty({ color: Cesium.Color.YELLOW, dashLength: 10.0 }), // 线也需要贴地否则会穿入地下 clampToGround: true } }); tempEntities.push(dashLineEntity); } // 第二次点击 else { const secondPointPos cartesian; // 清理临时图形点和虚线 tempEntities.forEach(entity { viewer.entities.remove(entity); }); // 绘制最终的实线 viewer.entities.add({ polyline: { positions: [firstPointPos, secondPointPos], width: 3, material: Cesium.Color.YELLOW, clampToGround: true } }); // 结束绘制状态 this.destroy(); // 返回结果 resolve([ getLonLat(firstPointPos), getLonLat(secondPointPos) ]); } }, Cesium.ScreenSpaceEventType.LEFT_CLICK); }); } /** * 销毁资源并恢复状态 */ destroy() { this.isDrawing false; this.viewer.canvas.style.cursor default; if (this.handler) { this.handler.destroy(); this.handler null; } } }使用// 1. 初始化工具类 const drawTool new DrawLineTool(Cesium, viewer); // 2. 调用绘制方法 async function handleDraw() { console.log(开始绘制请点击两点...); try { // 等待用户点击两点 const coordinates await drawTool.startDraw(); console.log(绘制完成坐标数据, coordinates); // 可以在这里进行后续业务逻辑处理 } catch (error) { console.error(绘制出错:, error); } }
RELATED

相关推荐

深度拆解旅行AI为什么需要Hotel MCP:从LLM局限到协议层价值

深度拆解旅行AI为什么需要Hotel MCP:从LLM局限到协议层价值

【开发者来信栏目导语】 本栏目为旅行Agent开发者生态共建专栏,定期收录一线酒旅开发者、渠道运维、Agent 搭建者的落地开发日志、对接复盘、功能适配笔记。内容仅做技术交流、行业开源参考,所有组件能力、接口能力,仅为开发者对接使用。 我做…

📅 2026/7/22 18:04:01
西门子WINCC V8.1详细图文安装教程(附安装包)WINCC安装教程

西门子WINCC V8.1详细图文安装教程(附安装包)WINCC安装教程

文章目录西门子WINCC V8.1 下载西门子WINCC V8.1 安装前准备西门子WINCC V8.1 安装教程西门子WINCC V8.1与PLC通信怎么设置?完整配置教程整理了一份西门子WINCC V8.1安装教程,从下载到运行每一步都配了截图,头一回接触这款工控组态软件的话&a…

📅 2026/9/10 5:02:13
为什么说GPT-5不是升级而是重构?——从Transformer-XL残差分支到Claude Fable 5的神经符号混合引擎,这5个底层差异决定你明年技术债规模

为什么说GPT-5不是升级而是重构?——从Transformer-XL残差分支到Claude Fable 5的神经符号混合引擎,这5个底层差异决定你明年技术债规模

更多请点击: https://kaifayun.com 第一章:GPT-5与Claude Fable 5的本质分野:一场范式迁移而非参数膨胀 当业界热议GPT-5与Claude Fable 5的“万亿级参数”时,真正深刻的差异并不藏于算力堆叠之中,而在于底层认知架构…

📅 2026/8/4 3:44:35
MORE NEWS

更多资讯

📰

Trae项目:.NET Core智能代码生成与Ollama集成实践

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

📰

Mastra React 最佳实践:提取复杂派生逻辑,让渲染前的数据推导保持可读、可测、可评审

Mastra React 最佳实践:提取复杂派生逻辑,让渲染前的数据推导保持可读、可测、可评审 【免费下载链接】mastra Mastra is the modern TypeScript framework for AI-powered applications and agents. 项目地址: https://gitcode.com/GitHub_Trending/m…

📰

React/Vue框架级性能优化实战与核心技术解析

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

📰

Windows 跑 vLLM 完整指南:WSL2 + Qwen3-8B-FP8 部署高吞吐推理服务

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

📰

AI全栈开发实战:四层穿透式工程化落地方法

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

📰

免费CAD在线预览指南:kkFileView 让 DWG 图纸在浏览器直接打开

免费CAD在线预览指南:kkFileView 让 DWG 图纸在浏览器直接打开 【免费下载链接】kkFileView Universal File Online Preview Project based on Spring-Boot 项目地址: https://gitcode.com/GitHub_Trending/kk/kkFileView 上周三,同事把一份 20MB…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬