《Cesium基础》cesium初始化

316 阅读3分钟
const CESIUMTOKEN = "";
const cesiumDefaultOptions = {
  animation: false, //是否显示动画控件
  baseLayerPicker: false, //是否显示图层选择控件
  fullscreenButton: false, //是否显示全屏按钮
  vrButton: false, // vr部件
  geocoder: false, // 位置搜索部件
  homeButton: false, //是否显示Home按钮
  infoBox: false, //是否显示点击要素之后显示的信息
  sceneModePicker: false, // 二三维切换部件
  timeline: false, //是否显示时间线控件
  navigationHelpButton: false, //是否显示帮助信息控件
  navigationInstructionsInitiallyVisible: false, // 导航说明显示
  scene3DOnly: true, //每个几何实例将只能以3D渲染以节省GPU内存

  shouldAnimate: true,
  // selectedImageryProviderViewModel: undefined, //当前图像图层的显示模型,仅baseLayerPicker设为true有意义
  // imageryProviderViewModels: Cesium.createDefaultImageryProviderViewModels(), //可供BaseLayerPicker选择的图像图层ProviderViewModel数组
  // selectedTerrainProviderViewModel: undefined, //当前地形图层的显示模型,仅baseLayerPicker设为true有意义
  // terrainProviderViewModels: Cesium.createDefaultTerrainProviderViewModels(), //可供BaseLayerPicker选择的地形图层ProviderViewModel数组
  // skyBox: false,  // 配置天空盒子或不显示天空盒子
  // skyAtmosphere: false, // 配置大气或不显示大气

  useDefaultRenderLoop: true, // 控制是否继续渲染
  // targetFrameRate: 30, // 控制渲染帧数
  maximumScreenSpaceError: 64, //屏幕空间最大误差
  showRenderLoopErrors: false, // 报错是否弹出错误
  useBrowserRecommendedResolution: false, // 设置为false使用window.devicePixelRatio属性
  automaticallyTrackDataSourceClocks: false, // 设置成true,使用公共clock对象,设置false,所有功能使用独立clock对象
  contextOptions: {
    webgl: {
      preserveDrawingBuffer: !0,
    },
    // requestWebgl2: true,
  }, // 创建场景时,配置webgl
  sceneMode: 3, //初始场景模式 1 2D模式 2 2D循环模式 3 3D模式  Cesium.SceneMode
  // orderIndependentTranslucency: true, // 如果为true且配置支持,则使用顺序无关的透明性。
  // creditContainer: document.getElementById("units"), // 部件容器
  // // creditViewport: '', // 提示显示容器
  // // dataSources: new Cesium.DataSourceCollection(), // 小部件数据源设置
  // terrainExaggeration: 1.0, // 夸大地形
  shadows: false, // 是否打开阴影
  terrainShadows: Cesium.ShadowMode.DISABLED, // 是否打开地形阴影
  resolutionScale: 1, //清晰度 0-1
  // mapMode2D: Cesium.MapMode2D.INFINITE_SCROLL, // 设置2D地图水平旋转
  // projectionPicker: false, // 设置为true,  ProjectionPicker部件会被创建,    ProjectionPicker:设置地球最佳视角
  // // 如果为真,渲染帧只会在需要时发生,这是由场景中的变化决定的。启用可以减少你的应用程序的CPU/GPU使用,并且在移动设备上使用更少的电池,但是需要使用Scene#requestRender在这种模式下显式地渲染一个新帧。在许多情况下,在API的其他部分更改场景后,这是必要的。请参阅使用显式呈现提高性能。
  // // 不是特别明白,应该是提高渲染性能的
  requestRenderMode: true, //启用请求渲染模式
  // // 如果requestRenderMode为true,这个值定义了在请求渲染之前允许的模拟时间的最大变化。请参阅使用显式呈现提高性能。
  maximumRenderTimeChange: Infinity,

  fullscreenElement: document.body, //全屏时渲染的HTML元素 暂时没发现用处

  imageryProvider: false,
};
const cesiumOptionsKeys = [
  "animation",
  "baseLayerPicker",
  "fullscreenButton",
  "vrButton",
  "geocoder",
  "homeButton",
  "infoBox",
  "sceneModePicker",
  "selectionIndicator",
  "timeline",
  "navigationHelpButton",
  "navigationInstructionsInitiallyVisible",
  "scene3DOnly",
  "shouldAnimate",
  "clockViewModel",
  "selectedImageryProviderViewModel",
  "imageryProviderViewModels",
  "selectedTerrainProviderViewModel",
  "terrainProviderViewModels",
  "imageryProvider",
  "terrainProvider",
  "skyBox",
  "skyAtmosphere",
  "fullscreenElement",
  "useDefaultRenderLoop",
  "targetFrameRate",
  "showRenderLoopErrors",
  "useBrowserRecommendedResolution",
  "automaticallyTrackDataSourceClocks",
  "contextOptions",
  "sceneMode",
  "mapProjection",
  "globe",
  "orderIndependentTranslucency",
  "creditContainer",
  "creditViewport",
  "dataSources",
  "shadows",
  "terrainShadows",
  "mapMode2D",
  "projectionPicker",
  "blurActiveElementOnCanvasFocus",
  "requestRenderMode",
  "maximumRenderTimeChange",
  "depthPlaneEllipsoidOffset",
  "msaaSamples",
];

/*
@params opts.mapId  {string}  地图容器ID
@params opts.XXX    {none}    其他参数按照官方文档里的传即可
*/
export function initCesium(opts) {
  let constructorOptions = {};
  let options = { ...cesiumDefaultOptions, ...opts };

  for (let k in options) {
    if (cesiumOptionsKeys.indexOf(k) > -1) {
      constructorOptions[k] = options[k];
    }
  }

  Cesium.Ion.defaultAccessToken = CESIUMTOKEN;

  let viewer = new Cesium.Viewer(options.mapId, {
    ...constructorOptions,
  });

  return viewer;
}

使用示例:

let viewer = initCesium({
    mapId: "cesiumContainer"
})

封装的好处:

  • 多个页面调用地图初始化方法不需要每次写一大堆参数,同时支持不同页面的地图设置不同的初始化参数
  • 防止传入非cesium api文档里的参数字段导致可能产生异常