欢迎光临
我们一直在努力

Cesium入门:加载地图与地形

有前端基础再上手Cesium,难住人的往往不是代码本身——真正容易卡住的,是token、地形服务、静态资源配置这些GIS特有的概念。这篇一次讲清楚:用一个HTML文件,把带真实地形的三维地球在浏览器里跑起来——珠峰的每一道山脊,都来自官方数据。

这是「Cesium入门与实战」合集的入门篇。合集里已经有可视域分析、大雁塔模型剖切、土方计算三篇实战,回头补这篇地基:Cesium到底是什么、环境怎么搭、第一段代码怎么写。后续每一篇的代码,都建立在这篇的基础上。

一、CesiumJS是什么

一句话:CesiumJS 是开源的三维地球引擎,把整个地球装进浏览器,地形、影像、3D Tiles模型、矢量数据都能加载,Apache 2.0协议商用免费。智慧城市、数字孪生、军事推演这些项目里,前端三维部分十有八九是它。

常和它搞混的是另外两个引擎,一张表说清区别:

引擎定位适用场景
Three.js 通用WebGL渲染库 纯三维展示、产品可视化,没有地理概念
MapLibre / Leaflet 二维(或2.5D)地图 普通WebGIS底图应用,轻量
CesiumJS 三维地球引擎 有真实地球、地形、模型、坐标系的场景

简单说:要做"真实地球",直接上CesiumJS。

二、准备工作:一个HTML文件 + 一个token + 一个本地服务

为了聚焦概念本身,本文用CDN引入Cesium,代码写在一个独立的HTML里;跑通原理之后,后面深入篇再切到npm + Vite的完整工程也不迟。新建好index.html——但注意,别双击打开它:浏览器禁止file://页面跨源拉取瓦片数据,直接双击只会看到一片星空(这是新手第一大坑,第五节细说)。正确姿势二选一:

  • VS Code + Live Server插件(推荐):装好插件后右键index.html → Open with Live Server,浏览器自动弹出;

  • 一行命令:在HTML文件所在目录执行python -m http.server 8000,然后浏览器访问 http://localhost:8000/index.html。

  • 和一般Web项目不同,Cesium的token这一步省不掉:本文要加载的Cesium World Terrain(全球真实地形)存在官方云服务Ion上,没有token就拿不到数据。去 ion.cesium.com/tokens 注册个免费账号,创建一个token,复制备用——免费额度对学习来说绰绰有余。

    三、第一段代码:把地球转起来

    完整代码贴出,跟着敲就能跑:

    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
     <meta charset="utf-8">
     <title>加载地球与地形</title>
     <script>window.CESIUM_BASE_URL = 'https://cdn.jsdelivr.net/npm/cesium@1.132/Build/Cesium/';</script>
     <script src="https://cdn.jsdelivr.net/npm/cesium@1.132/Build/Cesium/Cesium.js"></script>
     <link href="https://cdn.jsdelivr.net/npm/cesium@1.132/Build/Cesium/Widgets/widgets.css" rel="stylesheet">
     <style>
       html, body, #cesiumContainer { width: 100%; height: 100%; margin: 0; padding: 0; overflow: hidden; }
     </style>
    </head>
    <body>
     <div id="cesiumContainer"></div>
     <script>
       Cesium.Ion.defaultAccessToken = '把你的token粘到这里';
       var viewer = new Cesium.Viewer('cesiumContainer');
     </script>
    </body>
    </html>

    通过本地服务打开,一颗能拖能转的三维地球就出现在浏览器里。三个关键点:

  • CESIUM_BASE_URL 必须写在引入Cesium.js之前。引擎运行时要去这个目录拉控件图标、Web Worker等静态资源,不设的话地球能出来、控件全是裂图。

  • Cesium.Ion.defaultAccessToken 填你的token。只新建Viewer不传参数,默认加载Ion的Bing影像,效果最漂亮。

  • 全局样式把#cesiumContainer撑满窗口,这是三维应用的标准起手式。

  • 此时地球还是个"光球"——影像有、地形没有。喜马拉雅摸上去和平原一样平。下一步把山请回来。

    四、加载世界地形,镜头对准珠峰

    给Viewer加一个terrain参数,再控制镜头,完整的<script>部分升级成:

    // Ion token:去 ion.cesium.com/tokens 免费注册(地形数据在官方云端)
    Cesium.Ion.defaultAccessToken = '把你的token粘到这里';

    // 创建三维地球,terrain 一行挂上官方世界地形
    var viewer = new Cesium.Viewer('cesiumContainer', {
     terrain: Cesium.Terrain.fromWorldTerrain(),
     baseLayerPicker: false,
     geocoder: false,
     animation: false,
     timeline: false,
     navigationHelpButton: false,
     homeButton: false,
     fullscreenButton: false,
     sceneModePicker: false
    });

    // 让后续贴地的模型、绘制贴合地形起伏(实战篇的前置开关)
    viewer.scene.globe.depthTestAgainstTerrain = true;

    // 镜头飞到珠峰上空,-35° 斜视,山体立体感才出得来
    viewer.camera.setView({
     destination: Cesium.Cartesian3.fromDegrees(86.925, 27.90, 9000),
     orientation: {
       heading: 0,
       pitch: Cesium.Math.toRadians(-35),
       roll: 0
    }
    });

    四个关键点:

  • terrain: Cesium.Terrain.fromWorldTerrain() 就是加载地形的全部。1.107后的推荐写法,一行挂上全球地形,珠峰、科罗拉多大峡谷都长在数据里。地形是异步加载的,页面转几秒山才隆起,别急着关。

  • 后面一串false是关掉默认控件(底部动画条、时间轴这些学习阶段用不上的),画面清爽。

  • depthTestAgainstTerrain = true打开地形深度测试:后续篇章里模型贴地、可视域分析、地表绘制,都依赖这个开关,这里先埋个伏笔。

  • 镜头destination三个参数是经度、纬度、高度(米),落点在珠峰南侧10公里的上空。这里的坑必须划重点:orientation不写时pitch默认0度,是平视地平线——很多人第一次跑完发现画面里只有星空,就是这个原因。而看地形也别给-90°正俯视,从头顶往下看山就是一个平面,-35°斜着看,山体的立体感才出得来。

  • 刷新页面,世界之巅的雪山山脊、冰川谷地就这样铺在你浏览器里。到这里,恭喜,三维GIS的门算是推开了——后面无非是往这颗真实地球上放更多东西:模型、轨迹、分析。

    五、高频报错与排查

    最后把入门阶段最常见的五个报错集中收一下,对照排查:

    1. 双击打开,画面只有一片星空 你是双击(file://协议)打开的。浏览器安全策略禁止file://页面跨源拉取影像和地形瓦片,本地渲染的星空还在,瓦片全被拦了。按第二节的两种方式,通过本地http服务打开即可。

    2. 控制台报 401,地球出不来 Ion token 没填、失效或粘贴不完整。去 ion.cesium.com 的 Tokens 页面核对,确认复制的是完整一串。

    3. 地球能转,但山始终不隆起 地形是异步加载的,等几秒再看;另外检查写法——网上老教程的 terrainProvider 参数已过时,1.107后用 terrain: Cesium.Terrain.fromWorldTerrain()。

    4. 地球能出来,控件图标全是裂图/404 CESIUM_BASE_URL 没设置,或者写在了引入 Cesium.js 之后。它必须写在前面。

    5. CDN 加载慢,白屏半天 把 jsdelivr 换成 unpkg 试试;或者干脆去 npm 下载 cesium 包,把 Build/Cesium 整个目录拷到项目里本地引用,一劳永逸。

    赞(0)
    未经允许不得转载:171主机测评 » Cesium入门:加载地图与地形
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址