cesium如何加载大规模数据
Cesium 加载大规模数据的核心思路是分层、分块、按需、流式——把"一次性塞给浏览器"变成"只加载视野内需要的部分"。下面按数据类型分别说明。
一、地形数据(Terrain)
使用 量化网格(quantized-mesh) 格式,配合地形瓦片服务(如 Cesium Ion、自建的 terrain-provider)。
- 原理:地形按四叉树金字塔分块,根据相机距离/屏幕空间误差(SSE)动态调度对应 LOD 层级。
- 接口:
CesiumTerrainProvider+Cesium.createWorldTerrain()或自建服务(如quantized-mesh切片,推荐用 Cesium Ion / terraintools / maki-terrain 生成)。 - 关键:服务端要做瓦片金字塔切片,不能直接丢一个完整 DEM 给前端。
viewer.terrainProvider = await Cesium.createWorldTerrainAsync();
// 或自建
viewer.terrainProvider = new Cesium.CesiumTerrainProvider({url: 'https://your-host/terrain',
});
二、影像与栅格(Imagery)
使用 WMTS / TMS / XYZ / Bing / 自建瓦片服务,按瓦片金字塔按需请求。
- Cesium
ImageryLayer内部已做视锥剔除 + 屏幕空间误差控制,只请求当前可见瓦片。 - 大图不要一次性传
SingleTileImageryProvider,应切成瓦片金字塔。 - 工具:
gdal2tiles、rio-tiler、Cesium Ion 上传栅格自动切片。
三、三维瓦片(3D Tiles)—— 大规模三维模型的核心方案
这是 Cesium 处理大规模三维数据(建筑、倾斜摄影、点云、BIM)的标准答案。
核心机制:
- 瓦片集(Tileset):
Cesium3DTileset,数据按树状层级组织。 - LOD + 屏幕空间误差(SSE):
maximumScreenSpaceError控制何时加载更细层级,数值越小越精细、越吃性能。 - 视锥剔除 + 遮挡剔除:只渲染视野内、未被遮挡的瓦片。
- 批处理 + GPU instancing:一个瓦片内成千上万图元一次性渲染。
const tileset = await Cesium.Cesium3DTileset.fromUrl('https://host/tileset.json');
viewer.scene.primitives.add(tileset);
tileset.maximumScreenSpaceError = 16; // 数值越大越粗糙、越省性能
优化点:
- 用
COMPOSITE/INSTANCED_3DMODEL/POINTCLOUD等瓦片格式分类处理。 - 服务端用 3D Tiles 1.1 的 implicit tiling(隐式瓦片) + 空间索引(quadtree/octree/subtree),避免超大的
tileset.json。 - 切片工具:Cesium Ion、
3d-tiles-tools、py3dtiles、citygml-to-3dtiles。
四、大规模点/矢量数据
| 数据量 | 推荐方案 |
|---|---|
| 几百~几千点 | Entity + Billboard/Point(简单,但量大卡顿) |
| 几万~几十万 | Primitive + BillboardCollection/PointPrimitiveCollection(手动批量) |
| 百万级+ | 3D Tiles(点云) 或 GeoJSON 转 3D Tiles,或 Cesium3DTileset 的 POINTCLOUD 格式 |
| 动态海量点 | PointPrimitiveCollection + 按视域剔除,避免每帧重建 |
矢量线/面同理:量大时转成 3D Tiles(如 VectorTiles / GeoJSON → 3D Tiles),不要用 Entity。
五、动态/实时数据(流式)
- CZML:适合随时间变化的实体,Cesium 会按时间窗口增量解析,但数据量极大时仍需分片。
- WebSocket / Server-Sent Events:业务层自定义推送,Cesium 端只更新
Entity的position/property,配合SampledPositionProperty做插值,避免每帧重算。 - 不要一次性 push 全量历史数据;分窗口请求当前时间窗内的数据。
六、通用性能调优
- 关掉不必要的精度:
viewer.scene.globe.tileCacheSize控制瓦片缓存大小;requestRenderMode在无交互时停止渲染(省 CPU/GPU)。 maximumScreenSpaceError:地形/3DTiles 调大可显著降低加载量。preloadWhenHidden/preloadFlightDestinations:预加载策略,按需开启。- 合并请求:服务端用 HTTP/2、按
subtree批量返回;前端避免小文件海请求。 - 内存释放:超出视野的瓦片会自动 LRU 淘汰;自建
PrimitiveCollection时记得remove不再用的元素。 - 数据端先做金字塔/切片:90% 的卡顿来自"把一坨大数据直接丢前端",而不是 Cesium 本身的渲染。
一句话总结:Cesium 加载大规模数据靠的不是"加载更快",而是"加载更少"——靠瓦片金字塔 + LOD + 视域/遮挡剔除,让任何时刻只把"当前视野、当前精度需要的瓦片"送进 GPU。3D Tiles 是大规模三维数据的统一答案,地形走 quantized-mesh,影像走 WMTS/TMS,海量点/矢量也转成 3D Tiles。
