cesium模型路径漫游实现

 开始调用模拟飞行:(viewer是初始化地图容器对象,具体可参考文章:Cesium初始化地图对象容器配置项汇总_cesium 初始化容器大小-CSDN博客)

                import flyModelRoam from "../utils/GISRoam";// 开始模拟飞行let flyModel = flyModelRoam.flyInit(viewer,allPoints,8,);

暂停飞行:

flyModelRoam.stopFly(); 

继续飞行:

flyModelRoam.keepFly();

结束飞行:

flyModelRoam.endFly();

控制速度:(如果要回退路径则输入-1) 

flyModelRoam.speed();

假数据:

// 所有的飞行轨迹中途点
let allPoints = [{longitude: 121.478,latitude: 31.2356,height: 104},{longitude: 121.477,latitude: 31.2363,height: 120.1},{longitude: 121.477,latitude: 31.237,height: 90.5},{longitude: 121.476,latitude: 31.2377,height: 120.8},{longitude: 121.476,latitude: 31.2384,height: 111.2},{longitude: 121.475,latitude: 31.2391,height: 101.5},{longitude: 121.475,latitude: 31.2398,height: 141.9},{longitude: 121.474,latitude: 31.2405,height: 102.2},{longitude: 121.474,latitude: 31.2412,height: 98.6},{longitude: 121.473,latitude: 31.2419,height: 102.9},{longitude: 121.473,latitude: 31.2426,height: 103.3},{longitude: 121.472,latitude: 31.2433,height: 103.6},{longitude: 121.472,latitude: 31.244,height: 104.0},{longitude: 121.471,latitude: 31.2447,height: 104.3},{longitude: 121.471,latitude: 31.2454,height: 104.7},{longitude: 121.470,latitude: 31.2461,height: 105.0},{longitude: 121.470,latitude: 31.2468,height: 175.4},{longitude: 121.469,latitude: 31.2475,height: 155.7}
]

在utils文件夹中新建GISRoam.js文件,输入如下代码:

import * as Cesium from "cesium";let flyModel = {times: "",startTime: "",stopTime: "",gisModel: [],// 地图容器,点集合,初始速度flyInit(viewer, myPoints, speed) {if (myPoints.length > 0) {// 时间速率倍率,数字越大时间过的越快viewer.clock.multiplier = speed;let sourceCopy = new Array();for (let i = 0; i < myPoints.length; i++) {let obj = {log: myPoints[i].longitude,lat: myPoints[i].latitude,alt: myPoints[i].height,};sourceCopy.push(obj);}// 起始时间this.startTime = Cesium.JulianDate.fromDate(new Date("2023-2-13 11:00:00"));//获取每个杆塔对应的时间点this.times = this.getTimes(sourceCopy, viewer.clock.multiplier);let property = this.computeFlight(sourceCopy);let orientProperty = this.computeOrient(sourceCopy);//添加模型let velocityOrientationProperty = new Cesium.VelocityOrientationProperty(orientProperty);let planeModel = this.addFlyModel(property, velocityOrientationProperty);window.planmodel = planeModel;viewer.flyTo(planeModel, {duration: 1,offset: {heading: Cesium.Math.toRadians(0.0),pitch: Cesium.Math.toRadians(-25),range: 230,},});this.keepFly();return planeModel;}},// 计算点坐标顺便加载点到地图computeFlight(source) {// 取样位置 相当于一个集合let property = new Cesium.SampledPositionProperty();let lineArray = [];for (let i = 0; i < source.length; i++) {let time = Cesium.JulianDate.addSeconds(this.startTime,this.times[i],new Cesium.JulianDate());lineArray.push(source[i].log);lineArray.push(source[i].lat);lineArray.push(source[i].alt);let position = Cesium.Cartesian3.fromDegrees(parseFloat(source[i].log),parseFloat(source[i].lat),parseFloat(source[i].alt));// 添加位置,和时间对应property.addSample(time, position);//同时为我们生成的每个样本创建一个点this.gisModel.push(viewer.entities.add({id: "点" + i,position: position, //定位billboard: {image: "SampleData/fire.png",width: 10,height: 15,verticalOrigin: Cesium.VerticalOrigin.BOTTOM,disableDepthTestDistance: Number.POSITIVE_INFINITY,},}));}this.gisModel.push(viewer.entities.add({id: "线",polyline: {positions: Cesium.Cartesian3.fromDegreesArrayHeights(lineArray),width: 2,material: Cesium.Color.WHITE,show: true,},}));return property;},// 计算插值时间的方位角computeOrient(position) {let property = new Cesium.SampledPositionProperty();this.times = this.getTimes(position, viewer.clock.multiplier);for (let i = 0; i < position.length; i++) {let time = Cesium.JulianDate.addSeconds(this.startTime,this.times[i],new Cesium.JulianDate());// 定死hprlet heading = 20;let pitch = -90;let roll = 45;let hpr = new Cesium.HeadingPitchRoll(heading, pitch, roll);let orientation = Cesium.Quaternion.fromHeadingPitchRoll(hpr);// 添加位置,和时间对应property.addSample(time, orientation);}return property;},//  添加模型addFlyModel(positionProperty, orientProperty) {// 结束时间this.stopTime = Cesium.JulianDate.addDays(this.startTime,3,new Cesium.JulianDate());// 运动轨迹运动一遍后停止viewer.clock.clockRange = Cesium.ClockRange.CLAMPED;// 设置始时钟始时间viewer.clock.startTime = this.startTime.clone();// 设置时钟当前时间viewer.clock.currentTime = this.startTime.clone();// 设置时钟停止时间viewer.clock.stopTime = this.stopTime.clone();let planeModel = viewer.entities.add({// 和时间轴关联availability: new Cesium.TimeIntervalCollection([new Cesium.TimeInterval({start: this.startTime,stop: this.stopTime,}),]),position: positionProperty,// 根据所提供的速度计算点相机角度// orientation: orientProperty,//默认移动方向orientation: new Cesium.VelocityOrientationProperty(positionProperty),// 模型数据model: {uri: "SampleData/models/CesiumAir/Cesium_Air.glb",// 模型最小刻度minimumPixelSize: 80,// 模型最大刻度maximumPixelSize: 100,// 模型是否可见show: true,},// 将路径显示为以1秒为增量采样线path: {material: new Cesium.PolylineGlowMaterialProperty({color: new Cesium.Color.fromAlpha(Cesium.Color.BLUE, 0.9),}),width: 5,show: true,leadTime: 0,loop: false, //是否循环},});this.gisModel.push(planeModel);return planeModel;},// 继续飞行keepFly() {viewer.clock.shouldAnimate = true;},// 停止飞行stopFly() {viewer.clock.shouldAnimate = false;},// 结束飞行endFly() {this.gisModel.forEach((item, e) => {viewer.entities.remove(item);});this.gisModel = [];},// 控制运动速度speed(val) {// 控制时间速率viewer.clockViewModel.multiplier = val;},// 根据速度获取两个点之间的时间getTime(point1, point2, speed) {if (point1 === point2) {return 0.0;}// 计算两个点的空间直角坐标系直线距离let distance = Math.sqrt((point1.x - point2.x) * (point1.x - point2.x) +(point1.y - point2.y) * (point1.y - point2.y) +(point1.z - point2.z) * (point1.z - point2.z)).toFixed(2);if (!speed || speed <= 0) {speed = 4;}// 计算两点之间的时间let time = distance / speed;return time;},getTimes(points, speed) {let _this = this;if (!points || !points.length) {return null;}let times = [];times.push(0.0);if (points.length < 2) {return;}for (let i = 1; i < points.length; i++) {let position = Cesium.Cartesian3.fromDegrees(points[i].log,points[i].lat,points[i].alt);let position1 = Cesium.Cartesian3.fromDegrees(points[i - 1].log,points[i - 1].lat,points[i - 1].alt);let timeSpan1 = _this.getTime(position, position1, speed);// 计算到达每个点的时刻times.push(times[i - 1] + timeSpan1);}return times;},
};
export default flyModel;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/7420.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

超详细——集成学习——Adaboost——笔记

资料参考 1.【集成学习】boosting与bagging_哔哩哔哩_bilibili 集成学习——boosting与bagging 强学习器&#xff1a;效果好&#xff0c;模型复杂 弱学习器&#xff1a;效果不是很好&#xff0c;模型简单 优点 集成学习通过将多个学习器进行结合&#xff0c;常可获得比单一…

代码整洁之道第3章-函数

五一假期结束了, 今天继续读一下第三章:函数的相关内容, 其实函数的相关内容设计到的东西很多, 想把一个函数写好也是很难的; 还是按照之前的样子, 先总结一下本章内容, 然后聊一下相关的话题 内容总结 函数应该尽量小 ​ 在从业生涯中我见过最长的一个函数是几千行, 那简直就是…

AI绘画ComfyUI工作流安装教程,新手入门安装部署教程

ComfyUI 是专为 Stable Diffusion 打造的图形用户界面&#xff08;GUI&#xff09;&#xff0c;采用了基于节点的操作方式。用户可以通过连接不同的模块&#xff08;即节点&#xff09;来创建复杂的图像生成流程。这些节点涵盖了多样的功能&#xff0c;包括加载检查点模型、输入…

慧天卓特干旱监测系统:2023年云南最强冬春连旱分析

2023年开春以来&#xff0c;由于高温少雨&#xff0c;土壤失墒快&#xff0c;我国西南的云贵川渝等地区出现连续快速干旱&#xff0c;云南地区的干旱尤为严重。 2023年1月下旬至6月18日&#xff0c;云南平均降水量197.7毫米&#xff0c;为1961年以来历史同期最少&#xff0c;气…

生成requirements.txt文件

前言 对于Python项目&#xff0c;生成和使用requirements.txt是十分必要的。通过requirements.txt可以一次性保存和安装项目所需要的所有库。尤其是在复现github上的实验代码时。 方法1 常用的命令 pip freeze > requirements.txt然而这种方法并不好用&#xff0c;有时会…

什么是泛域名证书?与普通SSL证书有什么区别

随着互联网的发展&#xff0c;越来越多的网站开始使用SSL证书来保护用户的隐私和安全。在SSL证书中&#xff0c;泛域名SSL证书和普通域名证书是两种常见的类型。那么&#xff0c;什么是泛域名SSL证书&#xff0c;与普通域名证书有什么区别呢&#xff1f; 首先&#xff0c;我们来…

ChatGPT变懒原因:正在给自己放寒假!已被网友测出

ChatGPT近期偷懒严重&#xff0c;有了一种听起来很离谱的解释&#xff1a; 模仿人类&#xff0c;自己给自己放寒假了&#xff5e; 有测试为证&#xff0c;网友Rob Lynch用GPT-4 turbo API设置了两个系统提示&#xff1a; 一个告诉它现在是5月&#xff0c;另一个告诉它现在是1…

基于改进遗传优化的BP神经网络金融序列预测算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 4.1 遗传算法&#xff08;GA&#xff09;原理 4.2 BP神经网络原理 4.3 遗传优化BP神经网络结合应用 4.4 遗传算法简要改进 5.完整程序 1.程序功能描述 基于改进遗传优化的BP神经网络金融…

什么是影响力?HR招聘测评,如何考察候选人的影响力?

什么是影响力&#xff1f; 影响力也即是说服别人同你的观点&#xff0c;或者是潜移默化的改变他人&#xff0c;从而形成自我凝聚力&#xff0c;影响力可以推动某一个事务的进行。影响力尤其在管理型岗位上具有重要作用。 在百科中有如下定义&#xff1a;影响力是用别人乐于接受…

Python类方法探秘:从单例模式到版本控制

引言&#xff1a; 在Python编程中&#xff0c;类方法作为一种特殊的实例方法&#xff0c;以其独特的魅力在众多编程范式中脱颖而出。它们不仅提供了无需实例即可调用的便捷性&#xff0c;还在设计模式、版本控制等方面发挥着重要作用。本文将通过几个生动的示例&#xff0c;带您…

大厂常见算法50题-最小栈

专栏持续更新50道算法题&#xff0c;都是大厂高频算法题&#xff0c;建议关注, 一起巧‘背’算法! 文章目录 题目解法一 遍历找最小值&#xff08;不要求时间复杂度情况下&#xff09;解法二 辅助栈总结 题目 解法一 遍历找最小值&#xff08;不要求时间复杂度情况下&#xff0…

艾体宝方案 | 加密USB金融解决方案

在现代金融行业中&#xff0c;保护敏感数据和合规性已成为至关重要的任务。为了帮助金融公司应对移动性风险和合规挑战&#xff0c;我们提供了一种高效的加密USB解决方案。 一、为什么金融公司需要加密USB解决方案 1、降低移动性风险 金融服务公司正在迅速过渡到一种模式&a…

《深入理解kafka-核心设计与实践原理》

本文是对于《深入理解kafka-核心设计与实践原理》的笔记和提纲整理 主要用于复习和知识点快速复习 第一章&#xff1a;概念 链接&#xff1a;《深入理解kafka-核心设计与实践原理》第一章&#xff1a;概念 第一章&#xff1a;概念 [1.1] 基本概念 [1.1.1] 基本角色与概念[1.1.…

教程分享:如何为跨境电商、外贸、国际展会制作二维码?

不论是做跨境电商、在全球做产品推广&#xff0c;还是国外的餐厅运营、参加国际展会&#xff0c;或者是做创意户外广告、制作个性化的个人名片、有趣的产品包装……只要是在国外使用二维码&#xff0c;你都可以在QR Tiger去制作您需要的二维码&#xff01; 一、认识QR Tiger 二…

SpringBoot+Redission实现排行榜功能

SpringBootRedission实现排行榜功能 demo地址&#xff1a;ranking-demo: 排行榜DEMO (gitee.com) 一、业务需求 实现一个排行榜&#xff0c;要求按照分数和达成这个分数的时间排序&#xff0c;即相同分数下&#xff0c;时间早的在上面 二、Redis中的zSet(有序集合) 1.简介 …

Flutter 中的 @immutable:深入解析与最佳实践

在 Flutter 开发中&#xff0c;immutable 注释扮演着至关重要的角色&#xff0c;用于标记不可变类。不可变类顾名思义&#xff0c;其状态一旦创建便不可更改&#xff0c;这与可变类截然不同。后者允许在创建后对实例进行修改。 immutable 的利好 引入不可变类可以带来诸多优势…

GO日志打印添加goroutineid

今天想给日志添加一个前缀&#xff0c;以区分不同goroutine的日志&#xff0c;方便做并发问题的排查&#xff0c;做日志跟踪。 为了解决goroutineid&#xff0c;网上各出奇招&#xff0c;有的使用runtime包未公开的方法获取&#xff1a; func Goid() int {defer func() {if e…

如何在Windows 11中查找产品密钥?这里提供两种办法

Windows 11使用产品密钥来确保你的操作系统是正版的,换句话说,不是盗版的。你可以在你的电脑上找到正在使用的产品密钥,如果你自己购买了Windows并需要重新安装,该密钥特别有用。 什么是Windows产品密钥 产品密钥是微软确保所使用的Windows副本是正版的方法。当激活Windo…

docker容器 怎么查看运行日志

在Docker中&#xff0c;查看容器的运行日志可以使用docker logs命令。该命令允许你获取容器的日志输出&#xff0c;这对于调试和监控容器的状态非常有用。 以下是docker logs命令的一些常用用法&#xff1a; 基本用法 docker logs [OPTIONS] CONTAINERCONTAINER 是容器的ID或…

【Pytorch】3.Transforms的运用

什么是Transforms 在PyTorch中&#xff0c;transforms是用于对数据进行预处理、增强和变换的操作集合。transforms通常用于数据载入和训练过程中&#xff0c;可以包括数据的归一化、裁剪、翻转、旋转、缩放等操作&#xff0c;以及将数据转换成PyTorch可以处理的Tensor格式。 Tr…