利用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

相关文章

hdu2544(单源最短路径)

模板题: //题意:求1到n的最短路径,模板题#include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<queue>#include<set>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#i

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

usaco 1.2 Transformations(模拟)

我的做法就是一个一个情况枚举出来 注意计算公式: ( 变换后的矩阵记为C) 顺时针旋转90°:C[i] [j]=A[n-j-1] [i] (旋转180°和270° 可以多转几个九十度来推) 对称:C[i] [n-j-1]=A[i] [j] 代码有点长 。。。 /*ID: who jayLANG: C++TASK: transform*/#include<

poj 1734 (floyd求最小环并打印路径)

题意: 求图中的一个最小环,并打印路径。 解析: ans 保存最小环长度。 一直wa,最后终于找到原因,inf开太大爆掉了。。。 虽然0x3f3f3f3f用memset好用,但是还是有局限性。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#incl

hdu4431麻将模拟

给13张牌。问增加哪些牌可以胡牌。 胡牌有以下几种情况: 1、一个对子 + 4组 3个相同的牌或者顺子。 2、7个不同的对子。 3、13幺 贪心的思想: 对于某张牌>=3个,先减去3个相同,再组合顺子。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOExcepti

我在移动打工的日志

客户:给我搞一下录音 我:不会。不在服务范围。 客户:是不想吧 我:笑嘻嘻(气笑) 客户:小姑娘明明会,却欺负老人 我:笑嘻嘻 客户:那我交话费 我:手机号 客户:给我搞录音 我:不会。不懂。没搞过。 客户:那我交话费 我:手机号。这是电信的啊!!我这是中国移动!! 客户:我不管,我要充话费,充话费是你们的 我:可是这是移动!!中国移动!! 客户:我这是手机号 我:那又如何,这是移动!你是电信!!

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

【408DS算法题】039进阶-判断图中路径是否存在

Index 题目分析实现总结 题目 对于给定的图G,设计函数实现判断G中是否含有从start结点到stop结点的路径。 分析实现 对于图的路径的存在性判断,有两种做法:(本文的实现均基于邻接矩阵存储方式的图) 1.图的BFS BFS的思路相对比较直观——从起始结点出发进行层次遍历,遍历过程中遇到结点i就表示存在路径start->i,故只需判断每个结点i是否就是stop

用Unity2D制作一个人物,实现移动、跳起、人物静止和动起来时的动画:中(人物移动、跳起、静止动作)

上回我们学到创建一个地形和一个人物,今天我们实现一下人物实现移动和跳起,依次点击,我们准备创建一个C#文件 创建好我们点击进去,就会跳转到我们的Vision Studio,然后输入这些代码 using UnityEngine;public class Move : MonoBehaviour // 定义一个名为Move的类,继承自MonoBehaviour{private Rigidbo

Android Environment 获取的路径问题

1. 以获取 /System 路径为例 /*** Return root of the "system" partition holding the core Android OS.* Always present and mounted read-only.*/public static @NonNull File getRootDirectory() {return DIR_ANDR