news 2026/6/21 3:25:32

Cesium 路线导航教程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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 开源仓库
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/21 3:23:34

构建面向全双工对话的生成式奖励模型:从AI裁判到强化学习优化

1. 项目概述&#xff1a;为什么我们需要一个“会打分”的对话模型&#xff1f;如果你做过对话系统的开发&#xff0c;尤其是尝试过用强化学习来优化一个聊天机器人&#xff0c;那你一定对“奖励稀疏”和“奖励滞后”这两个词深恶痛绝。传统的做法是&#xff0c;我们设计一堆规则…

作者头像 李华
网站建设 2026/6/21 3:21:30

基于秘密共享OPRF的模糊隐私集合求交(Fuzzy PSI)协议设计与实现

1. 项目概述&#xff1a;当“模糊匹配”遇上“隐私计算”最近在做一个挺有意思的隐私计算项目&#xff0c;核心目标是在两个互不信任的参与方之间&#xff0c;安全地计算他们各自持有的数据集合的交集&#xff0c;而且这个交集还不是精确匹配&#xff0c;是“模糊”的。比如&am…

作者头像 李华
网站建设 2026/6/21 3:17:04

Ruby类型转换本质:语义重建而非强制转型

1. 项目概述&#xff1a;Ruby数据类型转换不是“强制转型”&#xff0c;而是“语义重建”你刚在终端里敲下ruby -v&#xff0c;发现系统自带的 Ruby 版本是 2.6.3&#xff0c;而某个新 gem 报错说failed to convert string value unified_test_platform to an enum value of ty…

作者头像 李华
网站建设 2026/6/21 3:10:06

emWin控件深度定制:从BUTTON/CHECKBOX基础到WIDGET_SetEffect与自定义绘制实战

1. 项目概述在嵌入式GUI开发领域&#xff0c;emWin以其高效、稳定和丰富的控件库而著称&#xff0c;是许多嵌入式设备人机交互界面的首选。无论是工业控制面板上的一个急停按钮&#xff0c;还是智能家居中控屏上的一个模式选择开关&#xff0c;其背后都离不开BUTTON和CHECKBOX这…

作者头像 李华
网站建设 2026/6/21 2:59:58

Weyl半金属的拓扑特性与强相互作用效应研究

1. Weyl半金属的拓扑特性与强相互作用效应1.1 Weyl半金属的基本特性Weyl半金属是近年来凝聚态物理领域备受关注的一类拓扑量子材料。这类材料的独特之处在于其能带结构中存在被称为Weyl点的简并点&#xff0c;这些点在动量空间中成对出现&#xff0c;每个对中的两个点具有相反的…

作者头像 李华