尧图网络 高端网站定制 · 原创设计
免费咨询热线
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/11/8 12:34:20
西门子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/10/14 8:22:06
为什么说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/10/8 15:05:08
MORE NEWS

更多资讯

📰

沧州肃宁县电工证怎么考才不被中介坑?考前押题资料别错过

沧州肃宁县电工证怎么考才不被中介坑?考前押题资料别错过 不知道去哪报名怕被中介坑?沧州肃宁县电工证考试流程复杂、报名渠道真假难辨,很多想考电工证的小伙伴都遇到过类似的问题。尤其是刚接触这个行业的新手,最容易被一些“代办机构”忽悠,不仅花钱还…

📰

南宁1300考电工证通过率揭秘:电工证怎么考才能稳过?

南宁1300考电工证通过率揭秘:电工证怎么考才能稳过? 你是不是也正为找工作发愁?特种作业证不全,连面试都过不了,南宁1300考电工证成了不少人的刚需。别急,今天就带你从零开始,看看电工证到底怎么考、怎么报,还能避开哪些坑。…

📰

电工证与建筑电工证郑州报考避坑指南:学历不高怕报不上名?看这篇就够了

电工证与建筑电工证郑州报考避坑指南:学历不高怕报不上名?看这篇就够了 你是不是也这样?学历不高,担心自己报不了电工证或者建筑电工证,生怕被拒之门外。其实不然,只要掌握正确的报考流程和准备材料,即使是初中毕业,也能顺利拿到证书。今天这篇文章,…

📰

文登在哪考低压电工证通过率揭秘:证书过期了不知道怎么复审延期怎么办

文登在哪考低压电工证通过率揭秘:证书过期了不知道怎么复审延期怎么办 证书过期了不知道怎么复审延期?别慌,文登低压电工证复审流程其实没你想象的那么复杂。今天就带你一步步搞清楚文登低压电工证在哪考,到期如何换证,以及通过率到底怎么样。…

📰

舒城县办电工证通过率揭秘,没证真不能上岗找工作

舒城县办电工证通过率揭秘,没证真不能上岗找工作 你是不是也遇到过这种情况,拿着简历去面试,对方看了一眼就说“没有电工证不能上岗”?这不是危言耸听,这是现实。现在大多数工地、工厂、电力项目等岗位都明确要求特种作业证,尤其是 舒城县办电工证…

📰

新疆电工证要体检吗真实经历告诉你怎么选培训机构

新疆电工证要体检吗真实经历告诉你怎么选培训机构 刚拿到特种作业证就能上岗,这是很多刚毕业或想转行的小伙伴的共同愿望。可问题是, 新疆电工证要体检吗…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

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

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

📞 💬