尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

CesiumJS三维数字地球入门:从环境搭建到首个可视化应用实战

CesiumJS三维数字地球入门:从环境搭建到首个可视化应用实战 1. 项目概述从零构建你的第一个三维数字地球最近几年三维可视化在数字孪生、智慧城市、自然资源管理等领域越来越火很多朋友都想上手试试。如果你也对这个方向感兴趣那么CesiumJS绝对是你绕不开的一个名字。它不是一个需要安装的桌面软件而是一个开源的JavaScript库专门用来在浏览器里创建高性能的三维地球和地图。简单来说有了它你就能用几行代码把一个可以随意旋转、缩放、查看地形和影像的“地球仪”嵌入到你的网页里。这听起来很酷对吧但很多新手在第一步“安装”上就卡住了网上的教程要么太旧要么步骤不全。这篇文章我就以一个过来人的身份带你从零开始用最清晰、最接地气的方式搞定CesiumJS的入门安装并亲手点亮你的第一个三维地球。无论你是GIS专业的学生、Web前端开发者还是对三维可视化感兴趣的爱好者这篇指南都能让你少走弯路快速上手。2. 环境准备与核心概念扫盲在动手敲代码之前我们得先把“战场”打扫干净把必要的工具准备好同时理解几个核心概念这样后面的操作才不会懵。2.1 开发环境搭建三件套缺一不可要运行Cesium你需要一个本地开发环境。别被“环境”这个词吓到其实就是三样东西一个代码编辑器、一个本地服务器和一个现代浏览器。1. 代码编辑器你的主武器推荐使用Visual Studio Code (VS Code)。它免费、轻量、插件生态丰富对前端开发非常友好。去官网下载安装即可没什么坑。2. 本地服务器为什么需要它这是新手最容易忽略也最容易出错的一步。Cesium在运行时需要加载大量的本地资源文件如地形切片、3D模型等。现代浏览器出于安全考虑默认禁止通过file://协议即直接双击打开HTML文件来加载这些本地资源。这会导致Cesium地球一片空白并在浏览器控制台看到一堆跨域错误CORS。 解决方案就是启动一个本地HTTP服务器。有几种简单方法使用VS Code的Live Server插件在VS Code扩展商店搜索并安装“Live Server”。安装后在你的项目文件夹里右键点击HTML文件选择“Open with Live Server”它会自动启动一个本地服务器并打开浏览器。使用Node.js的http-server如果你安装了Node.js在命令行进入项目目录运行npx http-server或npm install -g http-server http-server它会告诉你一个本地地址通常是http://localhost:8080用浏览器打开即可。使用Python如果你有Python在项目目录下运行python -m http.serverPython 3或python -m SimpleHTTPServerPython 2。注意务必通过http://localhost:xxxx这样的地址访问你的页面而不是file:///C:/...。这是成功看到地球的关键第一步。3. 现代浏览器你的展示窗口Chrome、Firefox、Edge的最新版本都行。它们对WebGLWeb图形库Cesium的渲染基础的支持最好。记得打开浏览器的“开发者工具”F12后面的调试全靠它。2.2 理解CesiumJS的构成它到底是个啥很多人把Cesium叫做“三维数字地球引擎”这个说法很准确。我们可以把它拆解一下JavaScript库核心是一堆.js文件你通过编写JavaScript代码来调用它提供的各种类和方法比如创建 Viewer视图容器、添加影像图层、加载3D模型等。WebGL驱动所有炫酷的三维渲染包括地形、光影、模型最终都是通过WebGL在GPU上完成的。这意味着你的电脑显卡不能太老。数据驱动Cesium本身不“生产”地图数据它是一个优秀的“数据消费者”和“渲染器”。你需要为它提供底图影像、地形、矢量数据等。它支持多种标准格式和服务如WMS、WMTS、3D Tiles、GeoJSON等。关于版本选择直接去Cesium官网使用最新稳定版即可。对于入门学习不建议使用一些中文社区打包的、版本陈旧的“整合版”或“破解版”它们可能缺失新特性且遇到问题难以在官方社区找到答案。3. 两种主流安装方式详解与实战准备好了环境我们来进入正题如何把CesiumJS“请”到我们的项目里。主要有两种方式直接下载和通过包管理器安装。我会详细讲解两种方法并分析各自的适用场景。3.1 方式一直接下载适合初学者快速体验这是最直观、最不需要其他工具依赖的方法适合想快速看到效果的朋友。步骤拆解获取Cesium访问 Cesium 官方网站找到 “Download” 部分下载 “CesiumJS” 的压缩包通常是一个ZIP文件。解压与项目结构将ZIP包解压到一个你喜欢的目录比如D:\MyCesiumProject。解压后的文件夹结构大致如下Build/ Cesium/ # 压缩合并后的核心库文件用于生产环境 CesiumUnminified/ # 未压缩的源码用于开发调试我们主要用这个 Source/ # Cesium的完整源代码 ThirdParty/ # 第三方依赖库 index.html # 官方的示例入口页面 ...关键目录是Build/CesiumUnminified/里面包含了我们开发时需要的所有未压缩的JS和CSS文件。创建你的第一个HTML文件在Cesium根目录下与index.html同级新建一个文件命名为myFirstEarth.html。编写最小化代码用VS Code打开这个HTML文件输入以下代码。我会逐行解释!DOCTYPE html html langen head meta charsetutf-8 !-- 引入Cesium的Widgets.css它包含了时间轴、动画控件等UI组件的样式 -- link hrefBuild/CesiumUnminified/Widgets/widgets.css relstylesheet !-- 设置视口确保在移动设备上也能正确显示 -- meta nameviewport contentwidthdevice-width, initial-scale1.0 title我的第一个Cesium地球/title style /* 让Cesium的Viewer容器填满整个浏览器窗口 */ html, body, #cesiumContainer { width: 100%; height: 100%; margin: 0; padding: 0; overflow: hidden; } /style /head body !-- 创建一个div作为Cesium渲染三维场景的容器 -- div idcesiumContainer/div !-- 引入Cesium的核心JS库 -- script srcBuild/CesiumUnminified/Cesium.js/script script // 设置Cesium的静态资源如图标、Web Worker文件的基路径。 // 这是必须的否则一些控件图标会显示为空白。 Cesium.Ion.defaultAccessToken 你的Ion默认令牌可选后文解释; // 暂时先注释掉 window.CESIUM_BASE_URL ./Build/CesiumUnminified/; // 创建Viewer实例这是Cesium应用的入口和核心控制器。 // 参数1承载Viewer的HTML元素的ID。 // 参数2一个配置对象。 var viewer new Cesium.Viewer(cesiumContainer, { // 使用Cesium Ion提供的全球影像底图需要网络且可能需要Token // 对于纯本地学习我们可以先注释掉使用默认的无底图黑色背景。 // imageryProvider: new Cesium.IonImageryProvider({ assetId: 1 }), // 使用Cesium World Terrain地形同样需要网络和Token // terrainProvider: Cesium.createWorldTerrain(), // 关闭时间轴和动画控件让界面更简洁 timeline: false, animation: false, // 关闭默认的底图选择器、帮助按钮等 baseLayerPicker: false, geocoder: false, homeButton: false, sceneModePicker: false, navigationHelpButton: false, fullscreenButton: false }); // 将相机视角定位到中国北京上空 viewer.camera.setView({ destination: Cesium.Cartesian3.fromDegrees(116.4, 39.9, 1500000.0), // 经度纬度高度米 orientation: { heading: Cesium.Math.toRadians(0.0), // 朝向北 pitch: Cesium.Math.toRadians(-90.0), // 俯角垂直向下看 roll: 0.0 } }); // 在控制台打印viewer对象方便调试 console.log(Cesium Viewer已创建, viewer); /script /body /html运行与查看在VS Code中右键点击myFirstEarth.html选择 “Open with Live Server”。浏览器会自动打开你应该能看到一个黑色的三维球体并且视角已经定位到了中国区域。你可以用鼠标左键拖拽旋转地球右键拖拽平移滚轮缩放。实操心得第一次运行时如果地球是黑的且控制台没有报错这是正常的因为我们还没有添加任何影像底图。我们的重点是确保Cesium库被正确加载和初始化。如果页面空白且控制台有红色错误请首先检查是否通过http://localhost访问Cesium.js和widgets.css的路径是否正确路径是相对于HTML文件的位置计算的。浏览器控制台F12 - Console是否有“CORS policy”或“404 Not Found”错误3.2 方式二使用NPM/Yarn安装适合正式前端项目如果你正在使用Vue、React、Angular等现代前端框架或者打算构建一个复杂的Cesium应用那么通过Node.js的包管理器NPM或Yarn来集成Cesium是更专业、更主流的方式。它能更好地管理依赖并配合构建工具如Webpack、Vite进行代码优化。步骤拆解初始化Node.js项目在一个空文件夹中打开终端命令行运行npm init -y来快速创建一个package.json文件。安装Cesium运行命令npm install cesium。这会自动下载Cesium库到项目的node_modules文件夹中。项目结构规划一个典型的结构可能如下my-cesium-app/ ├── node_modules/ # 依赖包包括cesium ├── public/ # 静态资源 │ └── index.html # 主HTML文件 ├── src/ # 源代码 │ └── main.js # 主JavaScript文件 ├── package.json └── vite.config.js # 或 webpack.config.js (构建工具配置)配置构建工具以Vite为例Vite是目前非常快的前端构建工具。首先安装Vitenpm install vite --save-dev。然后在项目根目录创建vite.config.js文件进行关键配置// vite.config.js import { defineConfig } from vite; import cesium from vite-plugin-cesium; // 一个方便集成Cesium的Vite插件 export default defineConfig({ plugins: [cesium()], // 使用插件它会自动处理Cesium的路径、资源复制等问题 // 其他配置... });在代码中引入和使用Cesium在你的src/main.js中现在可以像引入其他ES模块一样引入Cesium// src/main.js import * as Cesium from cesium; import cesium/Build/Cesium/Widgets/widgets.css; // 引入样式 // 必须设置静态资源路径这是通过包管理器安装后最关键的一步 // Vite插件通常会帮你设置好但了解原理很重要。 window.CESIUM_BASE_URL ./node_modules/cesium/Build/Cesium/; // 创建Viewer const viewer new Cesium.Viewer(cesiumContainer, { // ... 配置选项同上 }); // 后续你的所有Cesium相关代码都写在这里 viewer.camera.setView({ destination: Cesium.Cartesian3.fromDegrees(116.4, 39.9, 1500000.0) });在HTML中创建容器在public/index.html中确保有一个id为cesiumContainer的div。运行开发服务器在package.json的scripts中添加dev: vite然后运行npm run dev。Vite会启动一个开发服务器并自动处理Cesium模块的加载。注意事项通过NPM安装后最大的不同是资源路径的管理。Cesium运行时需要加载Workers、Assets、ThirdParty等目录下的文件。vite-plugin-cesium或cesium-webpack-plugin这类插件的作用就是在构建过程中将这些必要的资源从node_modules/cesium/Build/Cesium/复制到最终的输出目录如dist并正确配置CESIUM_BASE_URL。如果你手动配置Webpack这个过程会相当繁琐强烈建议使用社区成熟的插件。两种方式对比与选择建议特性直接下载NPM/Yarn安装上手速度极快解压即用较慢需要配置构建环境依赖管理无所有文件本地化优秀版本清晰易于升级项目集成困难适合独立Demo完美可与Vue/React等框架深度集成构建优化无直接使用未压缩/压缩版支持可利用Webpack/Vite进行Tree Shaking、代码分割资源路径相对简单手动设置CESIUM_BASE_URL需插件或手动配置确保运行时资源可访问推荐场景初学者学习、快速原型验证正式的前端项目、团队协作、复杂应用开发对于纯粹想学习Cesium API、做几个小Demo的朋友方式一直接下载足够了它能让你避开构建工具的复杂性专注于Cesium本身。当你打算把Cesium集成到你的产品中时再切换到方式二。4. 核心配置解析与第一个可视化效果安装成功看到了黑乎乎的地球这只是万里长征第一步。接下来我们要给它“穿上衣服”添加底图并理解Viewer这个核心对象。4.1 Viewer你的三维世界总控台Viewer是Cesium中最重要的类它封装了场景Scene、相机Camera、数据源集合DataSourceCollection、UI控件等几乎所有核心模块。创建Viewer时传入的配置对象决定了地球的初始面貌。让我们深入看看之前用到的几个配置项并补充一些更常用的var viewer new Cesium.Viewer(cesiumContainer, { // 【影像提供器】决定地球表面贴什么图。不设置就是黑色。 // imageryProvider: ... , // 【地形提供器】决定地球表面是光滑的球体还是有起伏的地形。不设置就是椭球体。 // terrainProvider: ... , // 【场景模式】默认是3D可设置为2D或哥伦布视图2.5D // sceneMode: Cesium.SceneMode.SCENE3D, // 【是否显示星空背景】默认true在宇宙中看地球。设为false则背景为纯色。 skyBox: false, // 【是否显示大气层效果】默认true地球边缘有朦胧的大气辉光。 // skyAtmosphere: false, // 【是否显示太阳】默认true影响光照和阴影方向。 // showSun: false, // 【是否显示月亮】默认true。 // showMoon: false, // 【投影模式】默认是透视投影有近大远小效果。可设为正交投影。 // scene3DOnly: true, // 如果为true则强制所有几何图形以3D模式绘制性能考虑 // UI控件开关上文已示例 timeline: false, animation: false, baseLayerPicker: false, // 底图选择器 geocoder: false, // 搜索框 homeButton: false, // 主页按钮复位视角 sceneModePicker: false, // 2D/3D模式切换器 navigationHelpButton: false, // 导航帮助 fullscreenButton: false, // 全屏按钮 // 【信息框】默认显示点击实体如点、模型时会弹出。 // infoBox: false, // 【选择指示器】默认显示点击实体时出现的绿色选框。 // selectionIndicator: false, });4.2 为地球添加影像底图一个没有地图的地球只是个黑球。Cesium支持多种影像源最简单的是使用Cesium Ion提供的默认免费底图需要网络和Token但我们也可以使用本地离线的瓦片地图或者免费的在线瓦片服务如天地图、OpenStreetMap。方案A使用Cesium Ion默认底图需网络推荐初学者体验访问 Cesium Ion 官网注册一个免费账户。在账户设置中创建一个默认的Access Token。将Token填入代码中并取消对imageryProvider的注释。Cesium.Ion.defaultAccessToken 你的Ion Token很长一串字符串; var viewer new Cesium.Viewer(cesiumContainer, { imageryProvider: new Cesium.IonImageryProvider({ assetId: 1 }), // assetId 1 是Bing Maps底图 // ... 其他配置 });方案B使用第三方在线瓦片服务以OpenStreetMap为例这种方式不需要Token但依赖外部服务且需遵守其使用条款。var viewer new Cesium.Viewer(cesiumContainer, { imageryProvider: new Cesium.UrlTemplateImageryProvider({ url: https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png, subdomains: [a, b, c], // 用于负载均衡的子域名 maximumLevel: 19, // 最大缩放级别 credit: © OpenStreetMap contributors // 版权声明 }), // ... 其他配置 });方案C添加多个图层并控制显隐Cesium支持添加多个影像图层并可以控制它们的顺序、透明度、显隐。var viewer new Cesium.Viewer(cesiumContainer, { baseLayerPicker: true, // 打开底图选择器方便切换 }); // 添加一个额外的图层例如一个半透明的标注层 var labelsLayer viewer.imageryLayers.addImageryProvider( new Cesium.UrlTemplateImageryProvider({ url: https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png, // 假设这是一个带标注的图层 }) ); labelsLayer.alpha 0.5; // 设置透明度为50% // labelsLayer.show false; // 可以隐藏该图层4.3 添加地形数据地形能让你的地球从“乒乓球”变成真实有起伏的星球。和影像一样也有多种来源。使用Cesium World Terrain需Ion TokenCesium.Ion.defaultAccessToken 你的Token; var viewer new Cesium.Viewer(cesiumContainer, { terrainProvider: Cesium.createWorldTerrain(), // ... 其他配置 }); // 启用地形深度检测让实体如模型贴合地面 viewer.scene.globe.depthTestAgainstTerrain true;使用无地形或创建简单地形如果不需要真实地形或者网络条件不允许可以// 使用椭球体无地形 var viewer new Cesium.Viewer(cesiumContainer, { // 不设置terrainProvider或显式设置为undefined }); // 或者使用Cesium自带的简单地形无高度 // terrainProvider: new Cesium.EllipsoidTerrainProvider(),实操心得初次加载高精度地形如Cesium World Terrain可能会比较慢因为它需要流式加载大量数据。在开发时如果网络不好可以先注释掉地形优先保证影像底图能加载加快调试速度。另外开启depthTestAgainstTerrain后加载模型时会更真实地“站在”地面上但也会消耗更多性能。5. 常见问题排查与性能优化入门即使按照步骤操作你也可能会遇到一些坑。这里我整理了几个新手最常见的问题和解决方法。5.1 安装与运行问题排查表问题现象可能原因解决方案页面一片空白控制台无错误1. Viewer容器div的尺寸为0。2.CESIUM_BASE_URL未设置或设置错误。1. 检查CSS确保#cesiumContainer有明确的宽高如width: 100%; height: 100%;。2. 检查控制台Network面板看Cesium.js和widgets.css是否成功加载状态码200。3. 确认CESIUM_BASE_URL路径正确指向Build/CesiumUnminified/目录。控制台报跨域CORS错误通过file://协议直接打开HTML文件。务必使用本地HTTP服务器如Live Server通过http://localhost访问。控件图标如Home按钮不显示CESIUM_BASE_URL未设置导致控件所需的SVG图标等静态资源找不到。正确设置window.CESIUM_BASE_URL ‘你的路径’;。路径末尾的/不能少。地球显示为黑色无影像1. 未设置imageryProvider。2. 使用的影像服务需要Token但未提供或Token无效。3. 网络问题影像服务无法访问。1. 检查是否配置了imageryProvider。2. 如果使用Cesium Ion检查Token是否正确且未过期。3. 尝试切换一个无需Token的在线瓦片服务如OSM测试网络。浏览器控制台报 “WebGL not supported”浏览器不支持WebGL或显卡驱动过旧/被禁用。1. 更新浏览器到最新版。2. 访问chrome://flags或about:config确保WebGL未被禁用。3. 更新显卡驱动。NPM安装后运行报错找不到模块或资源构建工具未正确复制Cesium的静态资源或CESIUM_BASE_URL配置错误。1. 确认使用了vite-plugin-cesium等集成插件。2. 检查构建后的输出目录如dist中是否有Assets,Workers,ThirdParty等文件夹。3. 在生产环境部署时确保这些资源文件被一同部署到服务器。5.2 初期性能优化与调试技巧当你的场景开始变得复杂添加了很多模型、矢量数据可能会感到卡顿。以下是一些入门级的优化建议使用开发版进行调试在开发阶段务必使用Build/CesiumUnminified/下的未压缩版本。这样当出现错误时浏览器控制台给出的错误信息会指向清晰的源码文件和行号而不是一堆压缩后难以阅读的代码。善用浏览器开发者工具Console控制台查看错误、警告和信息日志。Cesium会输出很多有用的加载和渲染信息。Network网络查看所有资源影像、地形、模型的加载状态、大小和耗时。如果某个资源加载特别慢可以考虑优化或更换数据源。Performance性能或Profiler录制一段时间内的操作分析帧率FPS下降的原因找到性能瓶颈是JavaScript执行太慢还是渲染负载太重。Memory内存监测内存使用情况防止内存泄漏。特别是频繁创建和销毁实体时要注意。控制数据精度与范围相机距离不要一次性加载全球最高精度的数据。根据相机高度动态调整数据的显示精度LODLevel of Detail。Cesium的许多数据源如3D Tiles自带LOD机制。裁剪范围只加载和渲染当前视图范围内的数据。对于自己添加的实体可以通过show属性或distanceDisplayCondition来控制其在特定距离外不可见。简化几何图形在满足视觉效果的前提下使用面数更少的模型。对于自定义的Primitive图形减少顶点数量。注意实体Entity的数量EntityAPI 非常易用但每个Entity都有一定的开销。当需要显示成千上万个简单点如传感器位置时考虑使用PrimitiveAPI 或Cesium3DTileset用于海量点云或模型来批量渲染性能会好得多。5.3 关于Cesium Ion Token的补充说明很多教程对Token一笔带过导致新手困惑。这里详细说一下是什么Token是访问Cesium Ion平台数据服务如默认影像、全球地形、一些3D模型资产的凭证。免费吗注册账户后你会获得一个免费的配额额度用于访问一些基础资产如Asset ID为1的Bing Maps底图。对于学习和个人项目免费额度通常足够。超出后需要付费。安全警告绝对不要将你的Token直接硬编码在提交到公开仓库如GitHub的代码中。否则别人可以用你的Token消耗你的额度。正确的做法是在开发时可以临时写在代码里。在部署时应该通过环境变量、后端接口等安全方式动态获取Token并在前端通过异步请求来设置Cesium.Ion.defaultAccessToken。走到这里你已经成功搭建了CesiumJS的开发环境理解了其核心概念并让一个基础的三维地球在浏览器中运行了起来。这只是一个开始Cesium的世界里还有海量的数据加载3D模型、矢量数据、点云、丰富的空间分析测量、通视分析、逼真的视觉效果光照、后处理等高级主题等待探索。但无论如何坚实的入门是这一切的基础。记住遇到问题多查官方文档虽然英文有压力但最权威多利用浏览器控制台进行调试社区的活跃度也很高很多坑都有前人踩过。接下来你可以尝试加载一个本地的GeoJSON文件显示一些区域或者用Cesium.Model加载一个glTF模型放到地球上那会更有成就感。
返回列表