cesium之数据加载

260 阅读3分钟

使用 Cesium 时,数据加载是非常重要的一步,因为 Cesium 提供了许多方法来加载各种不同的数据类型。以下是一些常用的 Cesium 数据加载方法:

  1. 加载 3D 模型

Cesium 支持加载多种格式的 3D 模型,包括 glTF、Collada、OBJ、3D Tiles 等等。可以使用 Cesium 提供的 load 方法进行加载,如下所示:

var viewer = new Cesium.Viewer('cesiumContainer');
var modelMatrix = Cesium.Transforms.eastNorthUpToFixedFrame(
  Cesium.Cartesian3.fromDegrees(-75.62898254394531, 40.02804946899414, 0.0));
var model = viewer.scene.primitives.add(Cesium.Model.fromGltf({
  url : './models/CesiumMilkTruck/CesiumMilkTruck.glb',
  modelMatrix : modelMatrix,
  scale : 200.0
}));

2. 加载影像数据

Cesium 支持加载多种格式的影像数据,包括 WMS、WMTS、TMS、ArcGIS REST 服务等等。可以使用 Cesium 提供的相关方法进行加载,如下所示:

var viewer = new Cesium.Viewer('cesiumContainer');
viewer.imageryLayers.addImageryProvider(new Cesium.UrlTemplateImageryProvider({
  url : 'https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}',
  maximumLevel: 19,
  credit : '© Esri'
}));

3. 加载地形数据

Cesium 支持加载多种格式的地形数据,包括 Quantized-Mesh、Terrain-RGB、Heightmap 等等。可以使用 Cesium 提供的相关方法进行加载,如下所示:

var viewer = new Cesium.Viewer('cesiumContainer');
viewer.terrainProvider = new Cesium.CesiumTerrainProvider({
  url : 'https://assets.agi.com/stk-terrain/v1/tilesets/world/tiles',
  requestWaterMask : true,
  requestVertexNormals : true
});

4. 加载矢量数据

Cesium 支持加载多种格式的矢量数据,包括 GeoJSON、TopoJSON、KML、KMZ 等等。可以使用 Cesium 提供的相关方法进行加载,如下所示:

var viewer = new Cesium.Viewer('cesiumContainer');
var dataSource = new Cesium.KmlDataSource();
dataSource.load('https://example.com/data.kml').then(function() {
  viewer.dataSources.add(dataSource);
});

在实际工作中,我们经常会遇到以下问题:

  1. 加载大规模数据时可能会导致性能问题。

解决办法:Cesium 提供了一些方法来优化大规模数据的加载和显示,如 Cesium 3D Tiles 等。此外,还可以使用一些算法和技术来优化数据的加载和显示,例如数据压缩、级别分割、延迟加载等等。

  1. 不同数据格式之间的兼容性问题。

解决办法:可以使用Cesium提供的各种数据源加载器来加载不同格式的数据。常用的数据源包括:

  • Cesium ion:Cesium官方提供的云服务平台,提供了多种类型的3D数据和影像数据,可以通过API访问并加载到Cesium中。
  • Cesium World Terrain:Cesium提供的全球高精度地形数据集,支持离线下载并加载到Cesium中。
  • Cesium OSM Buildings:Cesium提供的开源建筑数据集,包含全球范围内的建筑物模型数据,可以直接在Cesium中加载并渲染。
  • Cesium CityBuilder:Cesium官方提供的城市建模工具,可以将各种格式的地图数据转换为Cesium可用的格式,并提供在线编辑和预览功能。

下面是一个使用Cesium ion加载3D建筑模型的示例代码:

// 初始化Cesium Viewer
var viewer = new Cesium.Viewer('cesiumContainer', {
    terrainProvider: Cesium.createWorldTerrain()
});

// 加载3D建筑模型
var tileset = new Cesium.Cesium3DTileset({
    url: 'https://assets.cesium.com/4362/tileset.json',
    maximumScreenSpaceError: 16,
    maximumMemoryUsage: 512
});
viewer.scene.primitives.add(tileset);

// 将相机位置设置为模型中心点
tileset.readyPromise.then(function () {
    var boundingSphere = tileset.boundingSphere;
    viewer.camera.viewBoundingSphere(boundingSphere, new Cesium.HeadingPitchRange(0, -0.5, 0));
    viewer.camera.lookAtTransform(Cesium.Matrix4.IDENTITY);
});

这段代码使用Cesium Viewer初始化一个地球场景,并加载了一个3D建筑模型。在加载模型时,使用Cesium3DTileset类创建一个Tileset对象,并指定其URL地址。通过Tileset对象的readyPromise属性,可以在模型加载完成后执行一些操作,比如将相机位置设置为模型中心点。

注意,在使用Cesium ion加载数据时,需要在代码中指定Cesium ion的访问令牌。可以在Cesium ion网站上申请一个免费的令牌,并在代码中使用如下方式指定:

Cesium.Ion.defaultAccessToken = 'your_access_token';

如果不指定访问令牌,则只能加载本地的数据文件。此外,如果加载的数据源较大或网络环境不稳定,可能会出现数据加载速度缓慢的情况,需要进行优化或调整。