Cesium-记录差值线

/**
 * @param {Object} startTime  Date格式的开始时间
 * @param {Object} endTime Date格式的结束时间
 * @param {Object} coordinates  [x1,y1,x2,y2,x3,y3.......]
 * @param {Object} entityCollection  实体收集器
 */
async function interpolationLine(startTime,endTime,coordinates,entityCollection){
	try{
		var start = Cesium.JulianDate.fromDate(startTime);
		var stop = Cesium.JulianDate.fromDate(endTime);
		// 计算每个坐标点的时间间隔
		var timeIntervals = []; 
		//按每分钟进行插值
		var totalDuration = Cesium.JulianDate.secondsDifference(stop, start)/60; 
		//生成插值点
		var positions = await lerpPostions(coordinates,Math.ceil(totalDuration));
		var intervalDuration = totalDuration / (positions.length - 1);  
		var currentTime = start;  
		  
		for (var i = 0; i < positions.length; i++) {  
		    var nextTime = Cesium.JulianDate.addDays(currentTime, intervalDuration, new Cesium.JulianDate());  
		    timeIntervals.push(new Cesium.TimeInterval({  
		        start: currentTime,  
		        stop: nextTime,  
		        isStartIncluded: true,  
		        isStopIncluded: i === positions.length - 2 // 最后一个间隔包括结束时间  
		    }));  
		    currentTime = nextTime;  
		}  
		let lineps = [];
		const postionsLength = positions.length;
		entityCollection.entities.add({  
		    polyline: {  
				clampToGround: true,
		        positions: new Cesium.CallbackProperty((time)=>{
					var halfHour = Cesium.JulianDate.secondsDifference(time, start)/60;
					var dateRate = (halfHour/totalDuration);
					return positions.slice(0, postionsLength*dateRate);
				}, false),  
		        width: 20,  
		        material: new Cesium.PolylineGlowMaterialProperty({
				  glowPower: 0.1,
				  color: Cesium.Color.YELLOW
				}), 
		    }  
		});
	}catch(error){
		console.log("interpolationLine occur Error:",error);
	}
	
	
}


/**
* 生成均匀随机点坐标
* @param {Array} positions [x1,y1,x2,y2,x3,y3.......]
* @param {Number} number 需要进行插值的数量
* @param {Number} number 生成的随机点数
* @returns 返回生成的随机点坐标集合
*/
async function lerpPostions(positions,number,flag=true){
	var timeNumber = [];//占总时间的比例集合
	var lineDiatance = 0;//线的总长度
	var tempDis = [];//距离	
	const pointPosition = [];
	const points = [];
	try{
		if (positions.length <= 3) return;
		if(!flag){
			return positions;
		}
		//计算线段总长度
		for (var i = 0; i < positions.length - 2; i+=2) {
			let startPoint = new Cesium.Cartesian3.fromDegrees(positions[i],positions[i+1]);
			let currentDistance = Cesium.Cartesian3.distance(
				startPoint,
				new Cesium.Cartesian3.fromDegrees(positions[i+2],positions[i+3])
			);
			lineDiatance += currentDistance;
			tempDis.push(lineDiatance);
			points.push(startPoint);
		}
		//最后一截线段
		var lastPoint = new Cesium.Cartesian3.fromDegrees(positions[positions.length - 2],positions[positions.length - 1]);
		let lastDistance = Cesium.Cartesian3.distance(
			points[points.length - 1],
			lastPoint
		);
		lineDiatance += lastDistance;
		tempDis.push(lineDiatance);
		points.push(lastPoint);
		//设置每一个到达坐标对应的时间节点
		for (let i = 0; i < points.length; i++) {
			var everyTime = tempDis[i] / lineDiatance;
			timeNumber.push(everyTime);
		}
		//使用线性插值(线性插值的性能最高,但也最不圆滑)
		var spline = new Cesium.LinearSpline({
		  times: timeNumber,
		  points: points
		});
		for (let i = 1; i <= number; i++) {
		  var cartesian3 = spline.evaluate(i / number);
		  pointPosition.push(cartesian3);
		  // 绘制插值点
		 //  var interPoint = viewer.entities.add({
			// position: cartesian3,
			// point: {
			//   color: Cesium.Color.YELLOW,
			//   pixelSize: 6,
			//   disableDepthTestDistance: Number.POSITIVE_INFINITY
			// }
		 //  });
		}
		return pointPosition
	}catch(error){
		console.log("lerpPostions occur error:",error);
	}
	return positions;
}

调用代码如下

        //设定了模拟时间的边界
        var startTime = new Date("2022-08-21 11:12:13");
        var endTime = new Date("2022-08-23 05:11:13");
        var start = Cesium.JulianDate.fromDate(startTime);
        var stop = Cesium.JulianDate.fromDate(endTime);
        //确保查看器处于预期的时间
        viewer.clock.startTime = start.clone();
        viewer.clock.stopTime = stop.clone();
        viewer.clock.currentTime = start.clone();
        viewer.clock.clockRange = Cesium.ClockRange.CLAMPED; //循环结束时
        //时间变化来控制速度
        viewer.clock.multiplier = 360;
        
        
        
        //给时间线设置边界
        viewer.timeline.zoomTo(start, stop);
        //建立一个统一管理实体的收集器
        let entityCollection = new Cesium.CustomDataSource("flowEntityCollection");
        viewer.dataSources.add(entityCollection);
        interpolationLine(startTime,endTime,coordinates,entityCollection);

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

工厂 模式

一、工厂模式是什么&#xff1f; 是C多态的一种很好的具体表现。通过继承&#xff0c;重写抽象父类的虚函数&#xff0c;并在main函数中通过基类指针指向子类对象的一种编码风格 工厂模式分为三种&#xff08;简单工厂模式&#xff0c;工厂方法模式&#xff0c;抽象工厂模式&…

晶圆测量新利器:光谱共焦传感器优势解析

光谱共焦位移传感器和激光三角位移传感器在表面测量领域均占据重要位置&#xff0c;它们各自在测量物体厚度方面表现出独特的优势。尽管两者具备测量功能&#xff0c;但根据应用环境和所需精度&#xff0c;它们的适应性呈现出显著差异。 具体而言&#xff0c;光谱共焦位移传感器…

PSCA电源控制集成之分布式PPU

PPU的放置是一个重要考虑因素。最简单的方法是将所有的PPU都放置在SCP所在的始终开启的域中。将所有的PPU放置在一个层次结构中&#xff0c;集成问题&#xff0c;如地址映射、互连、时钟和复位等问题都比较简单。然而&#xff0c;有几个原因可能导致这不是最佳选择。 首先&…

Qt---项目代码解析

文章目录 一、main.cpp代码解析二、widget.h代码解析三、widget.cpp代码解析(一) form file 四、.pro Qt项目的工程文件 一、main.cpp代码解析 main函数的形参就是命令行参数。qt是CDefinitely图形界面化编程&#xff0c;要想编写一个qt的图形界面程序&#xff0c;一定要有QAp…

【Spring底层原理高级进阶】Spring Batch清洗和转换数据,一键处理繁杂数据!Spring Batch是如何实现IO流优化的?本文详解!

&#x1f389;&#x1f389;欢迎光临&#xff0c;终于等到你啦&#x1f389;&#x1f389; &#x1f3c5;我是苏泽&#xff0c;一位对技术充满热情的探索者和分享者。&#x1f680;&#x1f680; &#x1f31f;持续更新的专栏《Spring 狂野之旅&#xff1a;从入门到入魔》 &a…

蚂蚁感冒 刷题笔记

/* 解题思路 首先根据题意可知 1.蚂蚁速度均为1 即同向蚂蚁永远不可能追上 我们需要求最后感冒蚂蚁的数量 因为蚂蚁碰头将会掉头 效果和俩蚂蚁互相穿过继续走是一样的 所以我们将俩蚂蚁碰头视作穿过 2. 如果俩蚂蚁相向而行 则俩蚂蚁必定碰头 首先 我们获得第一个感冒蚂蚁的…

Vue+OpenLayers7入门到实战:OpenLayers7如何使用gifler库来实现gif动态图图片叠加到地图上

返回《Vue+OpenLayers7》专栏目录:Vue+OpenLayers7 前言 OpenLayers7本身不支持gif图片作为图标要素显示到地图上,所以需要通过其他办法来实现支持gif图片。 本章介绍如何使用OpenLayers7在地图上使用gifler库先生成canvas画板,然后通过canvas画板的重绘事件来重新渲染地图…

URL输入到页面渲染过程详解

当我们在浏览器中输入一个URL并按下回车键时&#xff0c;浏览器会执行一系列步骤来解析URL、发送请求、接收响应&#xff0c;并最终渲染页面。这个过程涉及到多个阶段&#xff0c;包括DNS解析、TCP握手、发送HTTP请求、服务器处理请求、返回HTTP响应、浏览器解析和渲染等。下面…

19-Java中介者模式 ( Mediator Pattern )

Java中介者模式 摘要实现范例 中介者模式&#xff08;Mediator Pattern&#xff09;提供了一个中介类&#xff0c;该类通常处理不同类之间的通信&#xff0c;并支持松耦合&#xff0c;使代码易于维护中介者模式是用来降低多个对象和类之间的通信复杂性中介者模式属于行为型模式…

算法刷题Day2 | 977.有序数组的平方、209.长度最小的子数组、59.螺旋矩阵II

目录 0 引言1 有序数组列表1.1 我的题解&#xff08;双指针&#xff09;1.2 根据官方解题修改后 2 长度最小的子数组2.1 我的题解2.2 官方滑动窗口&#xff08;双指针&#xff09;题解 3 螺旋矩阵3.1 我的题解 &#x1f64b;‍♂️ 作者&#xff1a;海码007&#x1f4dc; 专栏&…

CXYGZL实现钉钉、飞书和微信全面覆盖!!!

非常欣慰能在这里与大家分享&#xff0c;CXYGZL已圆满实现多端互通的目标&#xff01;&#xff01;&#xff01; 无论您是在手机、电脑还是平板上使用钉钉、企微还是飞书&#xff0c;只需将CXYGZL轻松集成到您的办公软件中&#xff0c;即可实现无缝审批处理各项任务&#xff0c…

FreeRTOS_day2

作业&#xff1a;1.使用ADC采样光敏电阻数值&#xff0c;如何根据这个数值调节LED灯亮度。 2.总结DMA空闲中断接收数据的使用方法 打开DAM,允许接收外部设备数据&#xff0c;调用中断接收回调函数

王道机试C++第 3 章 排序与查找:排序问题 Day28(含二分查找)

查找 查找是另一类必须掌握的基础算法&#xff0c;它不仅会在机试中直接考查&#xff0c;而且是其他某些算法的基础。之所以将查找和排序放在一起讲&#xff0c;是因为二者有较强的联系。排序的重要意义之一便是帮助人们更加方便地进行查找。如果不对数据进行排序&#xff0c;…

热插拔更换ESXI宿主机系统硬盘导致紫屏故障案例一则

关键词 vmware、esxi5.5raid、热插拔、紫屏 华为 CH121V3刀片、SSD硬盘 There are many things that can not be broken&#xff01; 如果觉得本文对你有帮助&#xff0c;欢迎点赞、收藏、评论&#xff01; 一、问题现象 现网vmware云平台一台华为E9000刀箱CH121V3刀片服务…

面试经典150题——环形链表

Suffering, for the weak is the tomb of death, and for the strong is the soil of germinal ambition.​ 1. 题目描述 2. 题目分析与解析 2.1 思路一 这个题目就是判断一个链表有没有环&#xff0c;其实我们之讲过一个题目&#xff0c;就实现了判断链表有没有环的步骤&a…

1 数据分析概述与职业操守 (3%)

1、 EDIT数字化模型 E——exploration探索 &#xff08;是什么&#xff09; 业务运行探索&#xff1a;探索关注企业各项业务的运行状态、各项指标是否合规以及各项业务的具体数据情况等。 D——diagnosis 诊断 (为什么) 问题根源诊断&#xff1a;当业务指标偏离正常值时&…

C#,哈夫曼编码(Huffman Code)压缩(Compress )与解压缩(Decompress)算法与源代码

David A. Huffman 1 哈夫曼编码简史&#xff08;Huffman code&#xff09; 1951年&#xff0c;哈夫曼和他在MIT信息论的同学需要选择是完成学期报告还是期末考试。导师Robert M. Fano给他们的学期报告的题目是&#xff0c;寻找最有效的二进制编码。由于无法证明哪个已有编码是…

GCN 翻译 - 2

2 FAST APROXIMATE CONVOLUTIONS ON GRAPHS 在这一章节&#xff0c;我们为这种特殊的的图基础的神经网络模型f(X, A)提供理论上的支持。我们考虑一个多层的图卷积网络&#xff08;GCN&#xff09;&#xff0c;它通过以下方式进行层间的传播&#xff1a; 这里&#xff0c;是无…

Spring事务注解@Transactional的流程和源码分析

Spring事务简介 Spring事务有两种方式&#xff1a; 编程式事务&#xff1a;编程式事务通常使用编程式事务管理API实现&#xff0c;比如Spring提供的PlatformTransactionManager接口&#xff0c;使用它操控事务。声明式事务&#xff1a;注解式事务使用AOP&#xff08;面向切面…

【24春招/简历】如果技术和学历不行,如何包装自己在春招中占得先机?突出你的亮点!

面试讲什么 学历&#xff1a; 行情 要美化&#xff08;吹牛&#xff09; 面试很好 技术能力 让面试官知道你会哪些技术&#xff0c;尽量细节 “熟悉spring” > ioc流程&#xff0c;Bean的生命周期&#xff0c;循环依赖&#xff0c;常见注解 熟悉redis > 缓存穿透&…
最新文章