【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的,因为这样能够很快得加载出完整效果,而且不会像瓦片底图那样一张一张的加载。

相关推荐
huwuhang10 分钟前
跨平台电子书阅读器 | Readest最新版 安卓版+PC版全平台
android·前端·javascript
Shirley~~11 分钟前
力扣hot100:每日温度
开发语言·javascript·ecmascript
条tiao条12 分钟前
不止语法糖:TypeScript Set 与 Map 深度解析
前端·javascript·typescript
freewlt33 分钟前
React Server Components 深度解析:从原理到实战的完整指南
前端·javascript·react.js
zhensherlock1 小时前
Protocol Launcher 系列:1Writer iOS 上的 Markdown 文档管理
javascript·笔记·ios·typescript·node.js·iphone·ipad
心静财富之门1 小时前
《前端零基础入门:HTML + CSS + JavaScript 全套速查表(详细版 + 实例)》
前端·javascript·python
We་ct1 小时前
JS手撕:DOM操作 & 浏览器API高频场景详解
开发语言·前端·javascript·面试·状态模式·操作·考点
Dxy12393102162 小时前
如何使用 ECharts 绘制 K 线图
开发语言·javascript
小小小米粒2 小时前
原生 JS:数据和视图「分离」,必须手动同步原生 JS 里,数据是数据,视图是视图,两者完全没关系
前端·javascript·vue.js