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

Cesium 路线导航教程

路线导航 ·Route Nav· ▶ 在线运行案例

  • 案例合集:三维可视化功能案例(threehub.cn)
  • 开源仓库github地址:https://github.com/z2586300277/three-cesium-examples
  • 400个案例代码:网盘链接

你将学到什么

  • Cesium Entity 高层实体 API

效果说明

本案例演示路线导航效果:基于 WebGL 实现「路线导航」可视化效果,附完整可运行源码;核心用到 Cesium。建议先打开文首在线案例查看动态画面,再对照下方源码逐步理解。

核心概念

  • Viewer聚合 Scene、Camera、Clock 与渲染循环,是 Cesium 应用入口。
  • Entity面向点线面/模型/标签的高层 API;与 Primitive 相比更适合交互与属性驱动。
  • 阅读下方完整源码时,建议从init/load/animate三条主线入手,再深入 shader 与工具函数。

实现步骤

  • 创建 Viewer,配置地形/影像(若案例需要)并设置初始相机
  • requestAnimationFrame循环中更新状态并 render(Cesium 为viewer.render或自动渲染)
  • 代码要点

    import * as Cesium from 'cesium'

    const box = document.getElementById('box')

    const viewer = new Cesium.Viewer(box, {

    animation: false,//是否创建动画小器件,左下角仪表

    baseLayerPicker: false,//是否显示图层选择器,右上角图层选择按钮

    baseLayer: false, // 不显示默认图层

    fullscreenButton: false,//是否显示全屏按钮,右下角全屏选择按钮

    timeline: false,//是否显示时间轴

    infoBox: false,//是否显示信息框

    })

    const layer = Cesium.ImageryLayer.fromProviderAsync(Cesium.ArcGisMapServerImageryProvider.fromUrl(GLOBAL_CONFIG.getLayerUrl()))

    viewer.imageryLayers.add(layer)

    const list = [ { "longitude": 116.3877535895933, "latitude": 39.917986883763334, "height": 5 }, { "longitude": 116.3879258383737, "latitude": 39.91794008705796, "height": 5 }, { "longitude": 116.38861928968578, "latitude": 39.91781284391525, "height": 5 }, { "longitude": 116.38869191428421, "latitude": 39.91818495388228, "height": 5 } ]

    const cartesianPoints = list.map(item => { const { longitude, latitude, height } = item return Cesium.Cartesian3.fromDegrees(longitude, latitude, height) })

    // CatmullRomSpline 插值 const catmullRomSpline = new Cesium.CatmullRomSpline({ points: cartesianPoints, times: cartesianPoints.map((_, index) => index / (cartesianPoints.length - 1)) })

    const numPoints = 1000 // 插值点数量 const interpolatedPoints = [] for (let i = 0; i < numPoints; i++) { const t = i / (numPoints - 1) const point = catmullRomSpline.evaluate(t) interpolatedPoints.push(point) }

    viewer.entities.add({ name: '路线', polyline: { positions: interpolatedPoints, width: 1, material: Cesium.Color.RED } })

    // 添加无人机 const entity = viewer.entities.add({ position: Cesium.Cartesian3.fromDegrees(list[0].longitude, list[0].latitude, 7), model: { uri: FILE_HOST + '/models/uav.glb' }, viewFrom: new Cesium.Cartesian3(0, -20, 10) // 设置第三人称视角偏移(后方20米,上方10米) }) viewer.trackedEntity = entity // 设置相机跟随飞机

    // 动画 const start = Cesium.JulianDate.fromDate(new Date()) // 设置起始时间 const speedFactor = 50 // 设置速度因子,值越大速度越快 let stop = Cesium.JulianDate.addSeconds(start, interpolatedPoints.length / speedFactor, new Cesium.JulianDate())

    function setProperty(t1, t2) { const property = new Cesium.SampledPositionProperty() for (let i = 0; i < interpolatedPoints.length; i++) property.addSample(Cesium.JulianDate.addSeconds(t1, i / speedFactor, new Cesium.JulianDate()), interpolatedPoints[i]) entity.position = property entity.orientation = new Cesium.VelocityOrientationProperty(property) entity.availability = new Cesium.TimeIntervalCollection([new Cesium.TimeInterval({ start: t1, stop: t2 })]) }

    setProperty(start, stop)

    // 监听飞机的位置属性,当飞机到达终点时重新设置位置属性 viewer.clock.onTick.addEventListener(function (clock) { if (Cesium.JulianDate.compare(clock.currentTime, stop) >= 0) { const newStart = Cesium.JulianDate.clone(stop); stop = Cesium.JulianDate.addSeconds(newStart, interpolatedPoints.length / speedFactor, new Cesium.JulianDate()); setProperty(newStart, stop) } })

    viewer.clock.shouldAnimate = true // 开始动画

    完整源码:GitHub

    小结

    • 本文提供路线导航完整 Cesium.js 源码与在线 Demo,建议先运行案例再改 uniform/参数做二次实验
    • 更多 Cesium.js 实战案例见 three-cesium-examples 合集 与 GitHub 开源仓库
http://www.jsqmd.com/news/1052440/

相关文章:

  • AlphaFold3-PyTorch:10分钟掌握AI驱动蛋白质三维结构预测
  • 人形机器人敏捷移动:基于技能图与强化学习的技能切换系统
  • DS4Windows手柄固件更新终极指南:解决兼容性问题的完整方案
  • ControlFoley:基于动态权重仲裁的视频到音频可控生成框架解析
  • 机器学习在宇宙学参数推断中的应用:从归一化流到分布外检测
  • 2026年东莞TikTok培训骗局常见套路与防范指南 - 东莞选校指南
  • 双随机矩阵:缓解图神经网络过平滑问题的有效工具
  • 构建面向全双工对话的生成式奖励模型:从AI裁判到强化学习优化
  • 大语言模型因果推理去毒:从CAUSALDETOX原理到本地部署实践
  • 大模型不确定性量化:基于上下文矛盾评估的IUQ方法与实践
  • GazeX框架:基于眼动追踪的AI医学影像报告生成系统
  • AI训练网络瓶颈诊断:从交换效率到通信模式的全链路分析
  • 电容触摸传感调试利器:Electrode Graphing Tool 实战指南
  • 大语言模型不确定性量化:基于上下文矛盾评估的IUQ方法实践
  • ControlFoley:跨模态冲突处理的可控视频到音频生成技术解析
  • 数据驱动负载预测与健康感知在船舶混合动力系统能量管理中的应用
  • DNA功能化分子群行为研究:温度调控与仿真建模
  • 2026年比较好的板结料破碎机/湖南板结料破碎机优质公司推荐 - 品牌宣传支持者
  • 2026年有实力的塑料电力管/安徽UPVC电力管/安徽拖拉电力管/拖拉电力管实力工厂推荐 - 品牌宣传支持者
  • OpenWRT插件管理终极指南:深度解析iStore架构设计与高级使用技巧
  • 基于CBF与CCG的机器人未知动态障碍物概率安全导航方法
  • 2026年湖南PD门品牌单发布:技术与格局之变 - 品牌鉴赏官2026
  • WaveTools鸣潮工具箱终极指南:3步解锁120FPS帧率优化游戏性能
  • Java泛型不是语法糖:擦除机制与类型安全实战
  • emWin Flex皮肤系统实战:从机制到定制,打造嵌入式GUI独特外观
  • Burp Suite Intruder四种攻击类型详解:Sniper、Battering Ram、Pitchfork与Cluster Bomb
  • LiveData核心原理深度解析:LifecycleBoundObserver与mVersion机制
  • LPC213x UART0驱动开发:从波特率计算、自动波特到中断FIFO的实战指南
  • 告别龟速下载:9大网盘直链助手如何帮你实现下载自由?
  • 2026揭阳防水补漏避坑指南:卫生间/厨房/阳台/屋顶/地下室漏水检测维修全攻略,正规施工+透明报价+口碑榜靠谱服务商推荐 - 安佳防水