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

目录

  • 引言
  • 一、基础功能探索
    • 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.xdnf.cn/news/1555679.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

为什么有很多程序员想转产品经理?

许多程序员在转型时&#xff0c;会优先考虑产品经理&#xff0c;这是为什么呢&#xff1f; “演而优则导”&#xff0c;这句戏曲界耳熟能详的俗语&#xff0c;也成为了不少程序员转产品经理朋友的真实写照。 我们将程序员比作演员&#xff0c;产品经理比作导演&#xff0c;将代…

LeetCode讲解篇之98. 验证二叉搜索树

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 我们可以通过递归搜索的方式查询某棵树是不是二叉搜索树&#xff0c;二叉搜索树需要满足的最小值与最大值的约束并且左子树和右子树都是二叉搜索树或者当前节点为空&#xff0c;以当前节点为根节点的树才是二叉搜…

【星汇极客】手把手教学STM32 HAL库+FreeRTOS之创建任务(1-1)

前言 本人是一名嵌入式学习者&#xff0c;在大学期间也参加了不少的竞赛并获奖&#xff0c;包括但不限于&#xff1a;江苏省电子设计竞赛省一、睿抗机器人国二、中国高校智能机器人国二、嵌入式设计竞赛国三、光电设计竞赛国三、节能减排竞赛国三。 后面会经常写一下博客&…

WSL2Linux 子系统(十二)

wsl 子系统安装 cuda 环境 《WSL2Linux 子系统(十一)》讲述 WSL 网络转为桥接模式的两种方法&#xff0c;WSL 网络桥接模式无论是静态 IP 还是动态分配 IP 均支持。本篇文章则是简单讲述 WSL 安装 cuda 环境。 作者&#xff1a;炭烤毛蛋 &#xff0c;点击博主了解更多。 提示…

四、逻辑架构

文章目录 1. 逻辑架构剖析1.1 服务器处理客户端请求1.2 Connectors1.3 第1层&#xff1a;连接层1.4 第2层&#xff1a;服务层1.5 第3层&#xff1a;引擎层1.6 存储层1.7 小结 2. SQL执行流程2.1 MySQL 中的 SQL执行流程2.2 MySQL8中SQL执行原理2.3 MySQL5.7中SQL执行原理2.4 SQ…

Mysql知识体系总结梳理

mysql事务的四大特性 原子性&#xff08;Atomicity&#xff09; 原子性确保事务中的所有操作要么全部完成&#xff0c;要么全部不完成。事务是一个不可分割的最小工作单元。 例子&#xff1a;假设有一个银行转账操作&#xff0c;事务包括从账户A中扣钱和向账户B中加钱。如果…

探索Prompt Engineering:开启大型语言模型潜力的钥匙

前言 什么是Prompt&#xff1f;Prompt Engineering? Prompt可以理解为向语言模型提出的问题或者指令&#xff0c;它是激发模型产生特定类型响应的“触发器”。 Prompt Engineering&#xff0c;即提示工程&#xff0c;是近年来随着大型语言模型&#xff08;LLM&#xff0c;Larg…

C++ struct和class的异同、C中和C++中struct的异同

一、前言 C中的struct结构体和C语言中的struct结构体差异较大。C中的struct结构体和C中的class类极为相似。 二、C的struct和class 1.相同点 &#xff08;1&#xff09;成员 struct和class都可以在主体中定义成员变量和成员函数&#xff01;两者在定义成员变量和成员函数上的…

java中的多层循环控制,包括金字塔和九九乘法表的打印

多重循环控制 多重循环控制练习 多重循环控制 1.将一个循环放在另一个循环体内&#xff0c;就形成了嵌套循环。其中&#xff0c;for&#xff0c;while&#xff0c;do…while均可以作为外层循环和内层循环。【建议一般用两层&#xff0c;最多不要超过3层&#xff0c;否则代码的…

管道内裂缝检测数据集 2000张 管道裂缝 带标注voc yol

管道内裂缝检测数据集 2000张 管道裂缝 带标注voc yol 管道内裂缝检测数据集 (Pipeline Crack Detection Dataset) 数据集概述 该数据集是一个专门用于训练和评估管道内裂缝检测模型的数据集。数据集包含2000张图像&#xff0c;每张图像都带有标注信息&#xff0c;标注格式为…

SimpleRR简洁双栏typecho主题模板

SimpleRR 使用原生 HTML CSS JS 构建。 设置文章封面 准备一张封面图&#xff0c;图片格式为 PNG 。推荐分辨率为 710 x 284px &#xff08;封面图最大展示尺寸&#xff09;。将图片重命名为 cover.png&#xff08;可在设置中自定义&#xff09;将图片上传至文章的“附件”…

【JavaEE】——文件IO的应用

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯 你们的点赞收藏是我前进最大的动力&#xff01;&#xff01; 希望本文内容能够帮助到你&#xff01;&#xff01; 目录 一&#xff1a;文件的搜索&#xff08;面试高频&#xff09; 二&#xff1a;文件的复制 三&#xff1a…

ElasticSearch 备考 -- Snapshot Restore

一、题目 备份集群下的索引 task&#xff0c;存储快照名称为 snapshot_1 二、思考 这个涉及的是集群的备份&#xff0c;主要是通过创建快照&#xff0c;涉及到以下2步骤 Setp1&#xff1a;注册一个备份 snapshot repository Setp2&#xff1a;创建 snapshot 可以通过两种方…

InnoDB 磁盘结构 - Binlog

文章目录 binlog 的格式mysqbinlog 工具SHOW binlog events;binlog 和 redo log 对比 https://dev.mysql.com/doc/refman/8.4/en/binary-log.html binlog 全称 BinaryLog&#xff0c;是 MySQL 数据库中用于记录所有更改数据库状态的事件的日志文件。它主要用于以下几个目的&am…

分析JS Crash(进程崩溃)

一、JS Crash异常检测能力 1、JS Crash日志规格 以下是进程崩溃日志信息中对应字段解释。 Build info:XXX-XXXX X.X.X.XX(XXXXXXXX) <- 版本信息 Module name:com.example.myapplication <- 模块名 Version:1.0.0 <- 版本号 Pid:579 <- 进程号 Uid:0 <- 用户ID…

水凝胶发生器,不对称设计妙,医电应用前景广

大家好&#xff01;今天来了解一种具有工程机械离子不对称性的水凝胶发生器——《A high-current hydrogel generator with engineered mechanoionic asymmetry》发表于《Nature Communications》。嘿&#xff01;你能想象一种材料&#xff0c;它能像魔法一样在低频运动下产生高…

AI 写作工具汇总

&#x1f423;个人主页 可惜已不在 &#x1f424;这篇在这个专栏AI_可惜已不在的博客-CSDN博客 &#x1f425;有用的话就留下一个三连吧&#x1f63c; 目录 前言: 正文: ​ 前言: 在信息时代的浪潮中&#xff0c;AI 写作应运而生。它以强大的算法和海量的数据为支撑&…

人工智能时代中,产品经理的生存指南

前言 从AI技术到商业变现的过程中&#xff0c;一招不慎&#xff0c;很可能满盘皆输。在AI时代&#xff0c;一个优秀的产品经理&#xff0c;应该具备哪些能力呢&#xff1f;通过对人工智能产品生命周期的解读&#xff0c;明确在各个环节中&#xff0c;人工智能所需要承担的工作…

大厂出来的人为什么不比你高效?

在最近参加的一个线下聚会上&#xff0c;有人问我&#xff1a;“我们单位有来自阿里、腾讯、华为这些大厂的人&#xff0c;为什么我没觉得他们做事比我们这些没大厂经历的人更有章法和效率&#xff1f;”你别说&#xff0c;这一问所反映的现象&#xff0c;与我在阿里巴巴工作时…

Cisco Catalyst 9000 交换产品系列 IOS XE 17.15.1 发布下载,新增功能概览

Cisco Catalyst 9000 Series Switches, IOS XE Release 17.15.1 ED 思科 Catalyst 9000 交换产品系列 IOS XE 系统软件 请访问原文链接&#xff1a;https://sysin.org/blog/cisco-catalyst-9000/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&…