利用cesium模拟台风移动路径——以利奇马台风为例

2024-09-02 19:08

本文主要是介绍利用cesium模拟台风移动路径——以利奇马台风为例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

根据cesium官网示例(https://sandcastle.cesium.com/?src=Interpolation.html)改造为台风移动轨迹,台风数据从台风路径实时发布系统获取。模拟台风移动路径从台风发生地开始,动态移动至台风消亡地,之后从起点又开始循环移动。采用实体ellipse模拟台风的旋转,给椭圆背景material贴图,使用CallbackProperty设置rotation和stRotation逆时针转动。

<!DOCTYPE html>
<html lang="en">
<head><!-- Use correct character set. --><meta charset="utf-8"><!-- Tell IE to use the latest, best version. --><meta http-equiv="X-UA-Compatible" content="IE=edge"><!-- Make the application on mobile take up the full browser screen and disable user scaling. --><meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no"><title>typhoon path</title><script src="../js/jquery-3.3.1.min.js"></script><script src="../js/require.min.js" data-main="../js/main"></script><style>@import url(../../build/Cesium/Widgets/widgets.css);@import url(../css/main.css);</style>
</head>
<body>
<div id="cesiumContainer"></div>
<script>var viewer;function onload(Cesium) {var url = 'http://{s}.tianditu.com/img_w/wmts?service=WMTS&version=1.0.0&request=GetTile&tilematrix={TileMatrix}&layer=img&style={style}&tilerow={TileRow}&tilecol={TileCol}&tilematrixset={TileMatrixSet}&format=tiles&tk=fb0dd2b4158b2f9d4bec0aaaf9722801';viewer = new Cesium.Viewer('cesiumContainer', {imageryProvider: new Cesium.WebMapTileServiceImageryProvider({url: url,layer: 'img',style: 'default',format: 'tiles',tileMatrixSetID: 'w',credit: new Cesium.Credit('天地图全球影像服务'),subdomains: ['t0', 't1', 't2', 't3', 't4', 't5', 't6', 't7'],maximumLevel: 18}),baseLayerPicker: false,selectionIndicator: false,infoBox: false,animation: false, // 动画timeline: false, // 时间线navigationHelpButton: false, // 关闭帮助控件fullscreenButton: false, // 关闭全屏显示geocoder : false // 关闭搜索控件});viewer._cesiumWidget._creditContainer.style.display = "none"; // 去除水印viewer.scene.globe.enableLighting = false; // 关闭日照viewer.scene.globe.depthTestAgainstTerrain = true; // 开启地形探测(地形之下的不可见)viewer.scene.globe.showGroundAtmosphere = false; // 关闭大气层var imageryLayers = viewer.imageryLayers;var url2 = 'http://{s}.tianditu.com/cia_w/wmts?service=WMTS&version=1.0.0&request=GetTile&tilematrix={TileMatrix}&layer=cia&style={style}&tilerow={TileRow}&tilecol={TileCol}&tilematrixset={TileMatrixSet}&format=tiles&tk=fb0dd2b4158b2f9d4bec0aaaf9722801';var labelImagery = new Cesium.WebMapTileServiceImageryProvider({url: url2,layer: 'cia',style: 'default',format: 'tiles',tileMatrixSetID: 'w',credit: new Cesium.Credit('天地图全球影像中文注记服务'),subdomains: ['t0', 't1', 't2', 't3', 't4', 't5', 't6', 't7']});imageryLayers.addImageryProvider(labelImagery);var scene = viewer.scene;var camera = viewer.scene.camera;// 初始位置var initViewLocation = {destination : Cesium.Cartesian3.fromDegrees(112.951085, 28.148327, 1000),duration : 0, // 旋转速度 数值越大越慢orientation : { // 朝北向下俯视heading : 5.857107801269642,pitch : -0.02842342271796139, // 相机间距roll : 0.0  // 相机滚动}}$.get("../data/json/typhoonData.json", null, function(data){console.log(data)var typhoonName = "利奇马";var result = [];if (data.length > 0) {for(let i = 0; i < data.length; i++){if(typhoonName===data[i].name){const points = data[i].pointsfor(let p=0; p<points.length; p++){const d = {'FID' : points[p].time,'serial': p+1,'fLongitude': points[p].lng,'fLatitude': points[p].lat}result.push(d);}}}typhoonFlytoPath(viewer, result, typhoonName)}})}function typhoonFlytoPath(viewer, positions, typhoonName){// 允许飞行动画viewer.clock.shouldAnimate = true;// 设定模拟时间的界限const start = Cesium.JulianDate.fromDate(new Date(2015, 2, 25, 16));const stop = Cesium.JulianDate.addSeconds(start, positions.length, new Cesium.JulianDate());viewer.clock.startTime = start.clone();viewer.clock.stopTime = stop.clone();viewer.clock.currentTime = start.clone();viewer.clock.clockRange = Cesium.ClockRange.LOOP_STOP; //末尾循环// 飞行速度,值越大速度越快,multiplier为0停止移动viewer.clock.multiplier = 3;// viewer.timeline.zoomTo(start, stop);// 计算飞行时间和位置const property = computeFlight(start, positions)var rotation = Cesium.Math.toRadians(30);function getRotationValue() {rotation += -0.03;return rotation;}const typhoonEntity = viewer.entities.add({name : '台风路径',availability : new Cesium.TimeIntervalCollection([new Cesium.TimeInterval({start : start,stop : stop})]),position : property,orientation : new Cesium.VelocityOrientationProperty(property), // 根据位置移动自动计算方向ellipse : {semiMinorAxis : 35000.0,semiMajorAxis : 35000.0,height: 0.0,fill: true,outlineColor: Cesium.Color.RED,outlineWidth: 5,outline : false,rotation: new Cesium.CallbackProperty(getRotationValue, false),stRotation: new Cesium.CallbackProperty(getRotationValue, false),material: new Cesium.ImageMaterialProperty({image: "../images/typhoon.gif",transparent: true})},point : {pixelSize : 10,color : Cesium.Color.TRANSPARENT,outlineColor : Cesium.Color.YELLOW,outlineWidth : 4},label : {text: typhoonName,font : '18px sans-serif',pixelOffset : new Cesium.Cartesian2(0.0, 50)},path : {resolution : 1,material : new Cesium.PolylineGlowMaterialProperty({glowPower : 0.9,color : Cesium.Color.YELLOW}),width : 3}})// 设置飞行视角viewer.trackedEntity = undefined;viewer.flyTo(typhoonEntity,{duration: 2,offset : {heading : Cesium.Math.toRadians(0.0),pitch : Cesium.Math.toRadians(-90),range : 1500000}})// 飞行视角追踪var preUpdateHandler = function(){if(typhoonEntity){const center = typhoonEntity.position.getValue(viewer.clock.currentTime);const hpr = new Cesium.HeadingPitchRange(Cesium.Math.toRadians(0.0), Cesium.Math.toRadians(-90), 1500000)if(center){viewer.camera.lookAt(center, hpr)}}}viewer.scene.preUpdate.addEventListener(preUpdateHandler)// viewer.zoomTo(typhoonEntity, new Cesium.HeadingPitchRange(0, Cesium.Math.toRadians(-90), 15000));// 设置插值函数为拉格朗日算法typhoonEntity.position.setInterpolationOptions({interpolationDegree : 3,interpolationAlgorithm : Cesium.LagrangePolynomialApproximation});}function computeFlight(start, positions){const property = new Cesium.SampledPositionProperty();for(let i=0; i<positions.length; i++){const time = Cesium.JulianDate.addSeconds(start, i, new Cesium.JulianDate());const position = Cesium.Cartesian3.fromDegrees(parseFloat(positions[i].fLongitude), parseFloat(positions[i].fLatitude), Cesium.Math.nextRandomNumber() * 500 + 1750);property.addSample(time, position);}return property;}
</script>
</body>

效果如下
在这里插入图片描述

这篇关于利用cesium模拟台风移动路径——以利奇马台风为例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

VSCode设置python SDK路径的实现步骤

《VSCode设置pythonSDK路径的实现步骤》本文主要介绍了VSCode设置pythonSDK路径的实现步骤,包括命令面板切换、settings.json配置、环境变量及虚拟环境处理,具有一定... 目录一、通过命令面板快速切换(推荐方法)二、通过 settings.json 配置(项目级/全局)三、

使用Python和Matplotlib实现可视化字体轮廓(从路径数据到矢量图形)

《使用Python和Matplotlib实现可视化字体轮廓(从路径数据到矢量图形)》字体设计和矢量图形处理是编程中一个有趣且实用的领域,通过Python的matplotlib库,我们可以轻松将字体轮廓... 目录背景知识字体轮廓的表示实现步骤1. 安装依赖库2. 准备数据3. 解析路径指令4. 绘制图形关键

Python使用pynput模拟实现键盘自动输入工具

《Python使用pynput模拟实现键盘自动输入工具》在日常办公和软件开发中,我们经常需要处理大量重复的文本输入工作,所以本文就来和大家介绍一款使用Python的PyQt5库结合pynput键盘控制... 目录概述:当自动化遇上可视化功能全景图核心功能矩阵技术栈深度效果展示使用教程四步操作指南核心代码解析

如何更改pycharm缓存路径和虚拟内存分页文件位置(c盘爆红)

《如何更改pycharm缓存路径和虚拟内存分页文件位置(c盘爆红)》:本文主要介绍如何更改pycharm缓存路径和虚拟内存分页文件位置(c盘爆红)问题,具有很好的参考价值,希望对大家有所帮助,如有... 目录先在你打算存放的地方建四个文件夹更改这四个路径就可以修改默认虚拟内存分页js文件的位置接下来从高级-

Python模拟串口通信的示例详解

《Python模拟串口通信的示例详解》pySerial是Python中用于操作串口的第三方模块,它支持Windows、Linux、OSX、BSD等多个平台,下面我们就来看看Python如何使用pySe... 目录1.win 下载虚www.chinasem.cn拟串口2、确定串口号3、配置串口4、串口通信示例5

一文详解如何查看本地MySQL的安装路径

《一文详解如何查看本地MySQL的安装路径》本地安装MySQL对于初学者或者开发人员来说是一项基础技能,但在安装过程中可能会遇到各种问题,:本文主要介绍如何查看本地MySQL安装路径的相关资料,需... 目录1. 如何查看本地mysql的安装路径1.1. 方法1:通过查询本地服务1.2. 方法2:通过MyS

双系统电脑中把Ubuntu装进外接移动固态硬盘的全过程

《双系统电脑中把Ubuntu装进外接移动固态硬盘的全过程》:本文主要介绍如何在Windows11系统中使用VMware17创建虚拟机,并在虚拟机中安装Ubuntu22.04桌面版或Ubunt... 目录一、首先win11中安装vmware17二、磁盘分区三、保存四、使用虚拟机进行系统安装五、遇见的错误和解决

使用FileChannel实现文件的复制和移动方式

《使用FileChannel实现文件的复制和移动方式》:本文主要介绍使用FileChannel实现文件的复制和移动方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录使用 FileChannel 实现文件复制代码解释使用 FileChannel 实现文件移动代码解释

Python如何调用指定路径的模块

《Python如何调用指定路径的模块》要在Python中调用指定路径的模块,可以使用sys.path.append,importlib.util.spec_from_file_location和exe... 目录一、sys.path.append() 方法1. 方法简介2. 使用示例3. 注意事项二、imp

使用Python实现矢量路径的压缩、解压与可视化

《使用Python实现矢量路径的压缩、解压与可视化》在图形设计和Web开发中,矢量路径数据的高效存储与传输至关重要,本文将通过一个Python示例,展示如何将复杂的矢量路径命令序列压缩为JSON格式,... 目录引言核心功能概述1. 路径命令解析2. 路径数据压缩3. 路径数据解压4. 可视化代码实现详解1