【WebGis开发 - Cesium】三维可视化项目教程---视点管理

news/2024/10/10 21:49:02/

目录

  • 引言
  • 一、基础功能探索
    • 1. 镜头视角获取
    • 2. 镜头视角移动
  • 二、进一步封装代码
    • 1. 封装hooks函数
    • 2. 看下效果
    • 3. 如何使用该hooks函数
  • 三、总结

引言

本教程主要是围绕Cesium这一开源三维框架开展的可视化项目教程。总结一下相关从业经验,如果有什么疑问或更好的见解,欢迎评论、私聊探讨,共同进步。

本篇主要讨论如何完成视点管理功能。视点(有的地方也叫收藏点)信息存储了特定视角的相机数据,可以将镜头移动至最佳视角观察三维场景。通常会有以下应用场景:

  • 三维场景的初始化视角,通常情况下三维可视化项目都是针对一个园区、片区、城市等多种范围而立项的。所以针对这些范围设置并保存一个最佳视角是非常重要的。
  • POI点保存视点信息,在一个范围内可能有多个亮点项目或独特建筑,设置POI点时绑定视点信息,通过点选POI点将镜头移动至最佳观察点。
  • 纯收藏功能,把一些项目好看的角度都保存下来并截图,提供汇报工作时演示。

一、基础功能探索

1. 镜头视角获取

在初始化Cesium场景后,通常会设置全局变量 viewer。我们通过 viewer.camera 来获取镜头信息。主要获取 positionheadingpitchroll 这四个属性:

  • position,笛卡尔坐标系下的相机位置坐标。
  • heading,表示左右摇头。
  • pitch,表示上下点头。
  • roll,表示左右歪头。一般情况下,为了减少用户眩晕感,将roll值默认为0。
{position:{"x": -2392730.83864336,"y": 5412946.353618708,"z": 2439801.3235747567},heading: 6.283185307179586,pitch: -1.5695637657002988,roll: 0,// 其他信息
}

2. 镜头视角移动

这里使用 viewer.cameraflyTo 方法,控制视角移动至特定视角。

主要使用到两个参数:

  • destination,接收一个笛卡尔坐标系的x、y、z三参数对象。表示镜头目标坐标点。
  • orientation,偏航角(heading)、俯仰角(pitch)和倾斜角(roll)属性的对象,或包含方向(direction )和向上(up)属性的对象。一般使用前者。
  • 其他属性通过查阅cesium api示例研究。
  viewer.camera.flyTo({destination: {x: -2392668.884812449,y: 5404950.676815235,z: 2436590.0523108398,},orientation: {heading: 6.283185307179586,pitch: -1.5695637656997583,roll: 0,},});

至此你已经可以获取镜头数据以及控制镜头移动了。


二、进一步封装代码

先理清楚使用场景,需要一个获取视角的方法,一个设置视角的方法,最好可以告诉用户视角移动完成。

1. 封装hooks函数

解释下封装函数的内容

  • 设置 currentView 变量 ,用作响应式的赋值当前选中视点信息。
  • 设置 isFlying 变量,用于给定视角移动的标识。利用这一标识,可以规避一些误操作。
  • getView 函数,获取当前视角的镜头信息。只保留需要的部分,并返回字符串形式数据,用于业务存储数据
  • setView 函数,设置视角,返回promise对象。使用链式调用或者await,可以更方便的获得移动完成的时间点,方便进行下一步操作。同时支持自定义移动周期以及运动的缓动函数。
  • 其他参数在后续的深入研究后,结合业务场景判断是否需要集成到当前hooks函数中。

src/hooks 目录下添加 useViewManager.js 文件

import { ref } from "vue";export const useViewManager = () => {// 当前获取的视点信息const currentView = ref(null);// 是否在视角移动过程中const isFlying = ref(false);/*** @description: 获取当前视点信息* @return { string } 返回当前视点信息,使用JSON.stringify转换为字符串*/const getView = () => {const cameraData = viewer.camera;currentView.value = JSON.stringify({destination: cameraData.position.clone(),orientation: {heading: cameraData.heading,pitch: cameraData.pitch,roll: cameraData.roll,},});return currentView.value;};/*** @description: 设置视角* @param {*} view 视点信息,由getView方法获取的字符串* @param {*} duration 移动时间* @param {*} easingFunction 缓动函数* @return {*}*/const setView = (view, duration = 1.5, easingFunction) => {return new Promise((resolve, reject) => {isFlying.value = true;const cameraData = JSON.parse(view);viewer.camera.flyTo({...cameraData,duration,complete: () => {isFlying.value = false;resolve(true);},cancel: () => {isFlying.value = false;reject(false);},// 缓动函数枚举值参考链接: https://cesium.com/learn/cesiumjs/ref-doc/EasingFunction.html?classFilter=EasingFunction// 你也可以自己编写缓动函数,注意函数返回值在[0,1]区间内即可。easingFunction: easingFunction || Cesium.EasingFunction.LINEAR_NONE,});});};return {currentView,isFlying,getView,setView,};
};

2. 看下效果

在这里插入图片描述

3. 如何使用该hooks函数

以下为最基础的使用方式,通过两个点击按钮去获取、设置视角。在业务中注意结合数据存储、获取等操作,灵活使用。

<script setup>
import { useViewManager } from "@/hooks/useViewManager.js";
const { getView, setView, currentView, isFlying } = useViewManager();
let viewData = "";
// 获取视角点击事件
const getCamera = () => {viewData = getView();
};
// 设置视角点击事件
const setCamera = () => {setView(viewData , 2).then((res) => {console.log("fly complete ", res);// 执行其他操作});
};// 设置视角点击事件(同步)
const setCameraSync = async () => {await setView(viewData , 2);console.log("fly complete ");// 执行其他操作
};
</script>

三、总结

本篇主要介绍了如何利用 viewer.cameraflyTo 完成了视点管理模块必备功能的hooks函数封装。完整的视点管理还需结合后台数据存储,业务数据绑定等等复杂逻辑,这就需要你自行判断如何将本篇的hooks函数应用到业务中去。

视点管理或是视角控制,是三维可视化项目中的重点功能。这个功能优化好了,可以让项目操作起来更加丝滑令人舒适。有一些可以探索优化的点:

  • 飞行路径的修正,目前是由cesium框架默认计算的飞行路径,没有进行人为干预,可以尝试 maximumHeightpitchAdjustHeightflyOverLongitudeflyOverLongitudeWeight 这几个参数去优化路径。
  • 飞行缓动效果优化,通过尝试 easingFunction 自行编写缓动函数,优化飞行速度。
  • 感兴趣可以一起讨论研究下。

再接再厉~


http://www.ppmy.cn/news/1537134.html

相关文章

第十九章 基于逻辑回归的信用卡欺诈检测

目的 预测哪些交易记录是异常的哪些是正常的 任务流程 加载数据&#xff0c;观察问题针对问题给出解决方案数据集切分评估方法对比逻辑回归模型建模结果分析方案效果对比 主要解决问题 &#xff08;1&#xff09;在此项目中&#xff0c;我们首选对数据进行了观察&#xff…

C语言基本概念

简单程序的一般形式 指令 预处理器执行的命令称为指令。所有指令都是以字符#开始的&#xff0c;默认只占一行&#xff0c;每条指令的结尾没有分号或其他特殊标记 函数 函数是C语言中构建程序的构建块&#xff0c;事实上&#xff0c;C语言是函数的集合。函数分为两大类&…

Java使用注解进行参数校验

在Java中&#xff0c;使用注解来校验请求参数通常与Spring框架结合使用&#xff0c;特别是当你使用Spring MVC或Spring Boot时。Spring提供了一套完整的校验机制&#xff0c;通过注解来实现参数的自动校验。 以下是一个使用注解进行参数校验的示例&#xff1a; 1. 添加依赖 …

@RequestMapping指定请求方式的用法

RequestMapping("/depts")public Result list() {log.info("查询全部部分数据");return Result.success();}上面代码没有指定请求方式&#xff0c;通过postman测试&#xff0c;可以用GET&#xff0c;POST&#xff0c;Delete的方式调用。 要想指定请求方式…

Django-rest-framework(DRF)怎么使用redis

一、redis作用 Redis&#xff0c;作为一款开源的内存数据结构存储系统&#xff0c;它可以用作数据库、缓存和消息中间件。以下是Redis的主要作用&#xff1a; 1、高速缓存 Redis能够极大地加速数据的读取速度&#xff0c;因为它将数据存储在内存中通过缓存热点数据&#xff…

鼓组编写:SsdSample鼓映射 GM Map 自动保存 互换midi位置 风格模板 逻辑编辑器

SsdSample音源的键位映射 方便编写鼓的技巧 可以这样去设置键位关系的面板和钢琴卷帘窗的面板&#xff0c;方便去写鼓。 可以先按GM的midi标准去写鼓&#xff0c;然后比对下鼓的键位映射的关系&#xff0c;去调整鼓。 可以边看自己发b站等处的图文笔记&#xff0c;然后边用电…

平台数据分类与聚类实验报告

参考书籍&#xff1a;《数据流挖掘与在线学习算法》 李志杰 1.6.1 实验目的 本书内容以及课程实验主要涉及Java程序设计语言、数据挖掘工具Weka和数据流机器学习平台MOA&#xff0c;因此&#xff0c;需要安装、配置并熟悉实验环境。Java、Weka和MOA都是开源小软件&#xff0…

MySQL基本操作(1)

初始数据库 数据库的基本概念 数据库是一个按照数据结构来组织、存储和管理数据的仓库&#xff0c;换句话说&#xff0c;就是存储数据的仓库。 为何使用数据库&#xff1f;使用数据库不仅仅为了使数据持久化&#xff0c;还能使得数据能够进行有效的管理&#xff0c;以…