1. 为什么Cesium 1.107要重构地形加载接口?
如果你最近升级了Cesium到1.107版本,可能会遇到一个让人头疼的问题:viewer.terrainProvider突然报错了。这不是你的代码写错了,而是Cesium团队对地形加载API进行了重大重构。作为一个长期使用Cesium的老玩家,我完全理解这种变化带来的困扰,但换个角度想,这种重构其实是为了解决一些长期存在的问题。
在1.107版本之前,地形加载的方式确实存在几个痛点。首先,viewer.terrainProvider的用法过于直接,缺乏必要的异步处理机制,这在加载大型地形数据时经常会导致界面卡顿。其次,旧API的设计没有很好地考虑错误处理和资源加载状态管理,开发者需要自己处理很多边界情况。最重要的是,随着Cesium支持的地形数据源越来越多样化,旧接口的扩展性已经跟不上需求了。
新引入的createWorldTerrainAsync和Cesium.Terrain.fromWorldTerrain()等方法,正是为了解决这些问题。它们采用了更现代的异步设计模式,内置了错误处理机制,并且为未来的功能扩展预留了空间。虽然短期内需要适应新API,但从长远来看,这种改变会让我们的代码更健壮、更易维护。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 新旧API对比与迁移策略
2.1 旧版API的典型用法
在1.107版本之前,我们通常这样加载地形数据:
javascript复制// 直接创建地形提供者
viewer.terrainProvider = new Cesium.CesiumTerrainProvider({
url: 'https://assets.agi.com/stk-terrain/world',
requestWaterMask: true,
requestVertexNormals: true
});
// 或者使用快捷方式
viewer.terrainProvider = Cesium.createWorldTerrain();
这种方式简单直接,但存在几个问题:没有考虑地形数据加载的异步性;错误处理完全交给开发者;当需要加载多个地形源时,管理起来比较麻烦。
2.2 新版API的核心变化
1.107版本引入了几个关键变化:
- 移除
