Cesium 新旧版本加载影像与terrain高程

Cesium因为版本的原因,导致在加载高程数据时存在问题,以下记录一下解决方案。之前使用Cesium的时候版本是1.92,使用以下代码可正常加载显示影像和高程数据:

<!DOCTYPE html>
<html lang="en">

<head>
  <!-- Use correct character set. -->
  <meta charset="utf-8" />
  <!-- Tell IE to use the latest, best version. -->
  <meta http-equiv="X-UA-Compatible" content="IE=edge" />
  <!-- Make the application on mobile take up the full browser screen and disable user scaling. -->
  <meta name="viewport"
    content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no" />
  <title>Hello World!</title>
  <script src="../Build/Cesium/Cesium.js"></script>
  <style>
    @import url(../Build/Cesium/Widgets/widgets.css);

    html,
    body,
    #cesiumContainer {
      width: 100%;
      height: 100%;
      margin: 0;
      padding: 0;
      overflow: hidden;
    }
  </style>
</head>

<body>
  <div id="cesiumContainer"></div>
  <script>
    const viewer = new Cesium.Viewer("cesiumContainer");

    const imageryLayers = viewer.imageryLayers;

    // 影像数据
    const imageryLayer = new Cesium.ImageryLayer(
      new Cesium.TileMapServiceImageryProvider({
        url: 'http://localhost/tms/mercator_img'
      })
    );

    // 高程数据
    const terrainProvider = new Cesium.CesiumTerrainProvider({
      // 高程layer.json上层url地址
      url: 'http://localhost/dem/test_dem',
      requestVertexNormals: true
    });

    viewer.imageryLayers.add(imageryLayer);
    viewer.terrainProvider = terrainProvider;
  </script>
</body>

</html>

后来更新版本到Cesium 1.116,再使用以上代码则发现无法加载显示影像和高程,查看官方文档,发现新版本的CesiumTerrainProvider需要使用await,通过官方实列代码修改终于解决该问题。

以下为Cesium 1.116版本的代码加载影像和高程:

<!DOCTYPE html>
<html lang="en">

<head>
  <!-- Use correct character set. -->
  <meta charset="utf-8" />
  <!-- Tell IE to use the latest, best version. -->
  <meta http-equiv="X-UA-Compatible" content="IE=edge" />
  <!-- Make the application on mobile take up the full browser screen and disable user scaling. -->
  <meta name="viewport"
    content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no" />
  <title>Hello World!</title>
  <script src="../Build/Cesium/Cesium.js"></script>
  <script src="./Sandcastle/Sandcastle-header.js"></script>
  <style>
    @import url(../Build/Cesium/Widgets/widgets.css);

    html,
    body,
    #cesiumContainer {
      width: 100%;
      height: 100%;
      margin: 0;
      padding: 0;
      overflow: hidden;
    }
  </style>
</head>

<body>
  <div id="cesiumContainer"></div>
  <script>
    // 创建Cesium视图器
    const viewer = new Cesium.Viewer('cesiumContainer');

    // 影像
    const wgs84_img = new Cesium.UrlTemplateImageryProvider({
      url: 'http://localhost/tms/mercator_img/{z}/{y}/{x}.png'
    });
    viewer.imageryLayers.addImageryProvider(wgs84_img);

    // 高程
    window.startup = async function (Cesium) {
      'use strict';

      try {
        viewer.scene.terrainProvider =
          await Cesium.CesiumTerrainProvider.fromUrl(
            // layer.json文件所在上层url地址
            "http://localhost/dem/test_dem",
          );
      } catch (error) {
        window.alert(`Failed to load terrain. ${error}`);
      } //Sandcastle_End
      Sandcastle.finishedLoading();
    };

    if (typeof Cesium !== 'undefined') {
      window.startupCalled = true;
      window.startup(Cesium).catch((error) => {
        "use strict";
        console.error(error);
      });
    }

  </script>
</body>

</html>

执行以上代码则正常加载显示影像和高程数据。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐