基于Cesium绘制抛物弧线


Posted in Javascript onNovember 18, 2020

Cesium绘制抛物弧线,供大家参考,具体内容如下

在网上搜了很多都没有搜到,于是自己花了点时间琢磨了一下,做个记录

思路

两点连线作为坐标轴,模拟抛物线,在线上取点画直线,主要用于高度/p>

基于Cesium绘制抛物弧线

取n个点,依次画线,得到近似的抛物线,点越多越光滑

基于Cesium绘制抛物弧线

JS代码

// 两点之间抛物线绘制函数,twoPoints是一个数组:[lon1,lat1,lon2,lat2]
function animatedParabola(twoPoints) { //动态抛物线绘制
 let startPoint = [twoPoints[0],twoPoints[1],0]; //起点的经度、纬度
 let end = [twoPoints[2],twoPoints[3]]; //终点的经度、纬度
 let step = 80; //线的数量,越多则越平滑
 let heightProportion = 0.125; //最高点和总距离的比值(即图中H比上AB的值)
 let dLon = (end[0] - startPoint[0])/step; //经度差值
 let dLat = (end[1] - startPoint[1])/step; //纬度差值
 let deltaLon = dLon * Math.abs(111000*Math.cos(twoPoints[1])); //经度差(米级)
 let deltaLat = dLat * 111000; //纬度差(米),1纬度相差约111000米
 let endPoint = [0,0,0]; //定义一个端点(后面将进行startPoint和endPoint两点画线)
 let heigh = (step * Math.sqrt(deltaLon*deltaLon+deltaLat*deltaLat) * heightProportion).toFixed(0);
 let x2 = (10000*Math.sqrt(dLon*dLon+dLat*dLat)).toFixed(0); //小数点扩大10000倍,提高精确度
 let a = (heigh/(x2*x2)); //抛物线函数中的a
 function y(x,height) { //模拟抛物线函数求高度
  //此处模拟的函数为y = H - a*x^2 (H为高度常数)
  return height - a*x*x;
 }
 for(let i = 1;i <= step; i++){ //逐“帧”画线
  endPoint[0] = startPoint[0] + dLon; //更新end点经度
  endPoint[1] = startPoint[1] + dLat; //更新end点纬度
  let x = x2*(2*i/step-1); //求抛物线函数x
  endPoint[2] = (y(x,heigh)).toFixed(0); //求end点高度
  viewer.clock.currentTime = Cesium.JulianDate.now(); //将时钟指针移到当前时间
  //这里viewer是容器初始化时new Cesium.Viewer构造的: var viewer = new Cesium.Viewer('mapContainer', {...});
  let IsoTime = Cesium.JulianDate.now(); //获取当前时间
  viewer.entities.add({ //添加动态线
   polyline: {
    positions: Cesium.Cartesian3.fromDegreesArrayHeights(startPoint.concat(endPoint)),
    width: 4,
    material: new Cesium.PolylineOutlineMaterialProperty({
     color: Cesium.Color.GOLD,
     outlineWidth: 0.3,
    })
   },
   availability: new Cesium.TimeIntervalCollection([new Cesium.TimeInterval({ //设置显示的时间区间
    start: {
     dayNumber: IsoTime.dayNumber,
     secondsOfDay: IsoTime.secondsOfDay+((i-1)*300),
    },
    stop: {
     dayNumber: IsoTime.dayNumber,
     secondsOfDay: IsoTime.secondsOfDay+(i*300),
    },
   })]),
  });
  viewer.entities.add({ //添加静态线
   polyline: {
    positions: Cesium.Cartesian3.fromDegreesArrayHeights(startPoint.concat(endPoint)),
    width: 4,
    material: new Cesium.PolylineGlowMaterialProperty({
     color: Cesium.Color.AQUA.withAlpha(0.9),
     outlineWidth: 0.3,
     glowPower : 0.3,
    })
   },
  });
  // end点变为start点
  startPoint[0] = endPoint[0];
  startPoint[1] = endPoint[1];
  startPoint[2] = endPoint[2];
 }
 viewer.clock.shouldAnimate = true; //启动时钟开始转动
 viewer.clock.multiplier = 1600; //时钟转动速度
}
function parabola(twoPoints) { //抛物线绘制
 let startPoint = [twoPoints[0],twoPoints[1],0]; //起点的经度、纬度
 let end = [twoPoints[2],twoPoints[3]]; //终点的经度、纬度
 let step = 80; //线的多少,越多则越平滑(但过多浏览器缓存也会占用越多)
 let heightProportion = 0.125; //最高点和总距离的比值
 let dLon = (end[0] - startPoint[0])/step; //经度差值
 let dLat = (end[1] - startPoint[1])/step; //纬度差值
 let deltaLon = dLon * Math.abs(111000*Math.cos(twoPoints[1])); //经度差(米级)
 let deltaLat = dLat * 111000; //纬度差(米),1纬度相差约111000米
 let endPoint = [0,0,0]; //定义一个端点(后面将进行startPoint和endPoint两点画线)
 let heigh = (step * Math.sqrt(deltaLon*deltaLon+deltaLat*deltaLat) * heightProportion).toFixed(0);
 let x2 = (10000*Math.sqrt(dLon*dLon+dLat*dLat)).toFixed(0); //小数点扩大10000倍,提高精确度
 let a = (heigh/(x2*x2));
 function y(x,height) { return height - a*x*x; }
 for(var i = 1;i <= step; i++){ //逐“帧”画线
  endPoint[0] = startPoint[0] + dLon; //更新end点经度
  endPoint[1] = startPoint[1] + dLat; //更新end点纬度
  let x = x2*(2*i/step-1); //求抛物线函数x
  endPoint[2] = (y(x,heigh)).toFixed(0); //求end点高度
  viewer.entities.add({ //添加静态线
   polyline: {
    positions: Cesium.Cartesian3.fromDegreesArrayHeights(startPoint.concat(endPoint)),
    width: 4,
    material: new Cesium.PolylineGlowMaterialProperty({
     color: Cesium.Color.AQUA.withAlpha(0.9),
     outlineWidth: 0.3,
     glowPower : 0.3,
    })
   },
  });
  // end点变为start点
  startPoint[0] = endPoint[0];
  startPoint[1] = endPoint[1];
  startPoint[2] = endPoint[2];
 }
}

示例

// An Example
var viewer = new Cesium.Viewer('mapContainer');
var twoPoints = [114.3698, 22.6139, 114.2135, 22.6127];
animatedParabola(twoPoints);

运行可得到:

基于Cesium绘制抛物弧线

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript OOP面向对象介绍
Dec 02 Javascript
jQuery的Ajax的自动完成功能控件简要说明
Feb 22 Javascript
探讨JQUERY JSON的反序列化类 using问题的解决方法
Dec 19 Javascript
使用typeof判断function是否存在于上下文
Aug 14 Javascript
详解js闭包
Sep 02 Javascript
JavaScript获取当前运行脚本文件所在目录的方法
Feb 03 Javascript
js剪切板应用clipboardData实例解析
May 29 Javascript
jQuery插件zTree实现删除树子节点的方法示例
Mar 08 Javascript
微信小程序的生命周期的详解
Oct 19 Javascript
使用Bootrap和Vue实现仿百度搜索功能
Oct 26 Javascript
axios进阶实践之利用最优雅的方式写ajax请求
Dec 20 Javascript
vue项目中微信登录的实现操作
Sep 08 Javascript
vue3.0实现点击切换验证码(组件)及校验
Nov 18 #Vue.js
js实现简易计算器小功能
Nov 18 #Javascript
微信小程序实现购物车功能
Nov 18 #Javascript
在Vue中使用Echarts可视化库的完整步骤记录
Nov 18 #Vue.js
微信小程序实现日历小功能
Nov 18 #Javascript
微信小程序实现底部弹出模态框
Nov 18 #Javascript
微信小程序实现左滑删除效果
Nov 18 #Javascript
You might like
php 日期和时间的处理-郑阿奇(续)
2011/07/04 PHP
PHP实现的memcache环形队列类实例
2015/07/28 PHP
PHP+Mysql+jQuery文件下载次数统计实例讲解
2015/10/10 PHP
php array_values 返回数组的所有值详解及实例
2016/11/12 PHP
javascript 面向对象编程 function也是类
2009/09/17 Javascript
jQuery实现用户注册的表单验证示例
2013/08/28 Javascript
二叉树先序遍历的非递归算法具体实现
2014/01/09 Javascript
jQuery实现跟随鼠标运动图层效果的方法
2015/02/02 Javascript
js+css实现超简洁的二级下拉菜单效果代码
2015/09/07 Javascript
js实现精确到毫秒的倒计时效果
2016/08/05 Javascript
在线引用最新jquery文件的实现方法
2016/08/26 Javascript
jquery动态赋值id与动态取id方法示例
2017/08/21 jQuery
jQuery实现的简单对话框拖动功能示例
2018/06/05 jQuery
JavaScript中创建原子的方法总结
2018/08/26 Javascript
用npm安装vue和vue-cli,并使用webpack创建项目的方法
2018/09/28 Javascript
vue中datepicker的使用教程实例代码详解
2019/07/08 Javascript
微信小程序使用GoEasy实现websocket实时通讯
2020/05/19 Javascript
vue 中的动态传参和query传参操作
2020/11/09 Javascript
Python实现的一个找零钱的小程序代码分享
2014/08/25 Python
python 文件查找及内容匹配方法
2018/10/25 Python
linux查找当前python解释器的位置方法
2019/02/20 Python
Python数据可视化:泊松分布详解
2019/12/07 Python
一款基于css3的列表toggle特效实例教程
2015/01/04 HTML / CSS
英国翻新电子产品购物网站:Tech Trade
2017/12/25 全球购物
服装机修工岗位职责
2013/12/26 职场文书
安全标准化汇报材料
2014/02/03 职场文书
校园广播稿500字
2014/02/04 职场文书
历史专业学生的自我评价
2014/02/28 职场文书
农村结婚典礼司仪主持词
2014/03/14 职场文书
公司办公室岗位职责
2014/03/19 职场文书
酒店开业策划方案
2014/06/02 职场文书
创文明城市标语
2014/06/16 职场文书
父亲婚礼答谢词
2015/01/04 职场文书
重阳节主题班会
2015/08/17 职场文书
Python快速优雅的批量修改Word文档样式
2021/05/20 Python
古见同学有交流障碍症 第二季宣传CM公开播出
2022/04/11 日漫