【WebGIS实例】(10)Cesium开场效果(场景、相机旋转,自定义图片底图)

效果

漫游效果视频:

【WebGIS实例】(10)Cesium开场效果(场景、相机

点击鼠标后将停止旋转并正常加载影像底图:

代码

可以直接看代码,注释写得应该比较清楚了:

js 复制代码
/*
 * @Date: 2023-07-28 16:21:53
 * @LastEditors: ReBeX  420659880@qq.com
 * @LastEditTime: 2023-07-28 18:18:34
 * @FilePath: \cesium-tyro-blog\src\utils\Visualization\roaming.js
 * @Description: 相机漫游效果
 */

import { viewer } from '@/utils/createCesium.js' // 引入地图对象
import * as Cesium from 'cesium'

import darkEarth from '@/assets/images/darkEarth.jpg'

function showAllImagery(boolean = true) {
  // 获取图像图层集合
  const imageryLayers = viewer.imageryLayers;

  // 遍历图像图层并隐藏它们
  let numLayers = imageryLayers.length;
  for (let i = 0; i < numLayers; i++) {
    const layer = imageryLayers.get(i); // 获取图像图层对象
    layer.show = boolean; // 设置图像图层隐藏
  }
}

function roaming() {
  let isRoaming = true; // 漫游标志位
  const DEFAULT_LIGHTING = viewer.scene.globe.enableLighting; // 默认光照状态
  const DEFAULT_SKY_ATMOSPHERE = viewer.scene.skyAtmosphere.show; // 默认光照状态
  let bgImglayer; // 地球底图

  showAllImagery(false); // 隐藏所有图层
  viewer.clock.multiplier = -2000.0;  // 时间加速!

  const provider = await Cesium.SingleTileImageryProvider.fromUrl('/src/assets/images/darkEarth.jpg')
  bgImglayer = viewer.imageryLayers.addImageryProvider(provider); // 加载背景底图

  if (!DEFAULT_LIGHTING) {
    viewer.scene.globe.enableLighting = true; // 开启光照
  }
  if (!DEFAULT_SKY_ATMOSPHERE) {
    viewer.scene.skyAtmosphere.show = true; // 开启天空大气,能在一定程度上降低地球轮廓锯齿
  }

  // 添加鼠标事件,触发后停止漫游效果
  const handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas); // 交互句柄
  handler.setInputAction((event) => {
    isRoaming = false // 停止旋转
    showAllImagery(true) // 显示图层
    if (!DEFAULT_LIGHTING) {
      viewer.scene.globe.enableLighting = false; // 关闭光照
    }
    if (!DEFAULT_SKY_ATMOSPHERE) {
      viewer.scene.skyAtmosphere.show = false; // 关闭光照
    }
    viewer.imageryLayers.remove(bgImglayer, true); // 移除图层
    viewer.clock.multiplier = 1;  // 正常时间流速

    handler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_CLICK); // 移除鼠标事件监听
  }, Cesium.ScreenSpaceEventType.LEFT_CLICK);

  (function roamingEvent() {
    if (isRoaming) {
      // 控制相机围绕 Z 轴旋转
      viewer.camera.rotate(Cesium.Cartesian3.UNIT_Z, Cesium.Math.toRadians(0.1));
      requestAnimationFrame(roamingEvent);
    }
  })()
}


export {
  roaming
}

调用:

js 复制代码
import {roaming} from '@/utils/Visualization/roaming.js'

roaming()

其他

刚进入时就是直接加载这种图片作为SingleTileImageryProvider的,因为这样能够很快得加载出完整效果,而且不会像瓦片底图那样一张一张的加载。

相关推荐
空中海2 小时前
01 React Native 基础、核心组件与布局体系
javascript·react native·react.js
前端之虎陈随易4 小时前
2年没用Nodejs了,Bun很香
linux·前端·javascript·vue.js·typescript
好运的阿财6 小时前
OpenClaw工具拆解之host_workspace_write+host_workspace_edit
前端·javascript·人工智能·机器学习·ai编程·openclaw·openclaw工具
XiYang-DING6 小时前
JavaScript
开发语言·javascript·ecmascript
空中海7 小时前
02 React Native状态、导航、数据流与设备能力
javascript·react native·react.js
空中海7 小时前
02 状态、Hooks、副作用与数据流
开发语言·javascript·ecmascript
空中海8 小时前
04 React Native工程化、质量、发布与生态选型
javascript·react native·react.js
杨超凡8 小时前
豆包收费了?我特么自己用“意念”搓了一个!
javascript
threelab9 小时前
Three.js 咖啡杯烟雾效果 | 三维可视化 / AI 提示词
开发语言·javascript·人工智能