WebGL 系列——(一)Cesium 初始化

597 阅读2分钟

一、Cesium 简介

  • Cesium 是 AGI 公司计算机图形开发小组与 2011 年研发的三维地球和地图可视化开源 JavaScript 库,Cesium 一词来源于化学元素铯,铯是制造原子钟的关键元素,研发小组通过命名强调 Cesium 产品精益求精,专注时间数据可视化。Cesium 为三维 GIS 提供了一个高效的数据可视化平台。
  • 其可跨平台、跨浏览器展示三维地球和地图,使用 WebGL 来进行硬件加速图形,使用时不需要任何插件支持,其基于 Apache2.0 许可的开源程序,可以免费用于商业和非商业用途。
  • 作为前端工程师,就是要把晦涩难懂的代码以可视化的方式呈现在用户面前,2D 也好,3D 也罢,都是调用 api 去完成,因此,对前端来说,Cesium 与“高德地图api”、“echarts”、“leaflet”等等都没有本质的区别,只不过呈现效果不同而已,因此不必抱有太大的心理负担。

二、准备工作

(一)注册账号

image.png

(二)拿到 token

image.png

(三)添加资产

  • 这里会有很多资产

image.png

  • 选择自己要用的添加到个人资产里面

image.png

三、初始化地球

(一)绑定key

Cesium.Ion.defaultAccessToken = “刚刚拿到的key”

(二)初始化一个干干净净的球

const viewer = new Cesium.Viewer('cesiumContainer', {
      geocoder: false, //关闭地理编码搜索展示
      homeButton: false, //关闭主页按钮展示
      fullscreenButton: false, //关闭全屏按钮展示
      sceneModePicker: false, //关闭场景选择器展示
      baseLayerPicker: false, //关闭基础图层选择器展示
      navigationHelpButton: false, //关闭导航帮助按钮展示
      navigationInstructionsInitiallyVisible: false, //关闭导航说明展示
      animation: false, //关闭设置动画小组件展示
      timeline: false, //关闭时间轴展示
      shouldAnimate: true, //打开自动播放
      orderIndependentTranslucency: false, //关闭与阶段无关的半透明
      contextOptions: {
        webgl: {
          alpha: true, //使用alpha通道实现背景透明
        },
      },
      infoBox: false, //关闭点击右侧弹出的信息框
      selectionIndicator: false, //关闭点击绿色选中框效果
      sceneMode: 3, //开启场景模式为3D
      scene3DOnly: false, //是否指定仅为三维模式,全部使用三维模式可节约GPU资源      
      imageryProvider: new Cesium.ArcGisMapServerImageryProvider({
        url: 'https://services.arcgisonline.com/arcgis/rest/services/World_Imagery/MapServer',
      }), //图像图层源,这个只能设置一个
      terrainProvider: new Cesium.CesiumTerrainProvider({
        url: Cesium.IonResource.fromAssetId(1),
        requestVertexNormals: true,
        requestWatermark: true,
      }), //地形图层源,这个代码从个人资产那里复制
    });
    
    // 去cesium水印
    viewer._cesiumWidget._creditContainer.style.display = 'none';
    viewer.scene.globe.depthTestAgainstTerrain = false;
    viewer.scene.globe.showGroundAtmosphere = false;

(三)性能优化(这个根据个人电脑承受度来)

    // 开启抗锯齿 fxaa
    viewer.scene.fxaa = true;
    viewer.scene.postProcessStages.fxaa.enabled = true;
    viewer.camera.flyTo({
      destination: Cesium.Cartesian3.fromDegrees(104.07, 30.57, 40000000),
    });
    handler.setInputAction(event => {
      let cartesian = viewer.camera.pickEllipsoid(event.position);
      const lnglat = radiansToCoordinate(cartesian);
      console.log('event', lnglat);
    }, Cesium.ScreenSpaceEventType.LEFT_CLICK);
  };
  // 抗锯齿处理     
    antiAliasing();

      const antiAliasing = () => {
        if (Cesium.FeatureDetection.supportsImageRenderingPixelated()) {
          viewer.resolutionScale = window.devicePixelRatio;
        }
        const supportsImageRenderingPixelated = viewer.cesiumWidget._supportsImageRenderingPixelated;
        if (supportsImageRenderingPixelated) {
          let vtxf_dpr = window.devicePixelRatio;
          while (vtxf_dpr >= 2.0) {
            vtxf_dpr /= 2.0;
          }
          viewer.resolutionScale = vtxf_dpr;
        }
      };

三、效果展示

Honeycam 2023-03-07 14-19-11.gif