zoukankan      html  css  js  c++  java
  • cesium 模拟飞行以及波束跟随

    今天将两个功能整合起来做一个效果:

    //

    $(function () {

    //添加一个按钮 ,控制他

      $("#alongWith").click(

    function () {

          if ($("#alongWith").val() == 0) {

            // 起始时间

            let start = Cesium.JulianDate.fromDate(new Date(2020, 9, 15));

            // 结束时间

            let stop = Cesium.JulianDate.addSeconds(start, 360, new Cesium.JulianDate());

            $("#alongWith").val(1);

    //传入图层,开始,结束,模型

           alongWithTheSecurity(viewer, start, stop, "../../../assets/gltfModel/Cesium_Air.glb");

          } else {

            $("#alongWith").val(0);

             //删除模型及移动波束

            window.clearInterval(jumpLightFun);

            for (let entity of entitys) {

              viewer.entities.remove(entity);

            }

            //解除相机视角锁定

            viewer.camera.lookAtTransform(Cesium.Matrix4.IDENTITY);

          }

        }

      );

    });

    //跳波束方法定时任务

    let jumpLightFun;

    let entitys = [];   //任务伴随所有实体 删除时使用

    /**

     * 任务伴随保障功能

     * @param {图层对象} viewer

     * @param {开始时间} start   // 起始时间  let start = Cesium.JulianDate.fromDate(new Date(2020, 9, 15));

     * @param {结束时间} stop    // 结束时间  let stop = Cesium.JulianDate.addSeconds(start, 360, new Cesium.JulianDate());

     * @param {模型路径} modelUrl  ../../../assets/gltfModel/Cesium_Air.glb

     */

    function alongWithTheSecurity (viewer, start, stop, modelUrl) {

      //给任务伴随添加的配置

      viewer.homeButton = false;

      viewer.fullscreenButton = false;

      viewer.sceneModePicker = false;

      viewer.navigationInstructionsInitiallyVisible = false;

      viewer.navigationHelpButton = false;

      viewer.shouldAnimate = true;

      let flyName = "AAAA";

      // 设置始时钟始时间

      viewer.clock.startTime = start.clone();

      // 设置时钟当前时间

      viewer.clock.currentTime = start.clone();

      // 设置始终停止时间

      viewer.clock.stopTime = stop.clone();

      // 时间速率,数字越大时间过的越快

      viewer.clock.multiplier = 5;

      // 时间轴

      viewer.timeline.zoomTo(start, stop);

      // 循环执行,即为2,到达终止时间,重新从起点时间开始  LOOP_STOP:循环执行  CLAMPED:执行1次

      viewer.clock.clockRange = Cesium.ClockRange.LOOP_STOP;

      for (let j = 0; j < dataFly.length; j++) {

        let property = computeFlight(dataFly[j]);

        //console.log(property)

        // 添加模型

        let palner = viewer.entities.add({

          // 和时间轴关联

          availability: new Cesium.TimeIntervalCollection([new Cesium.TimeInterval({

            start: start,

            stop: stop

          })

          ]),

          selectionIndicator: true,

          label: {

            text: flyName,

            font: '26px Sans-Serif',

            fillColor: Cesium.Color.YELLOW,

            outlineColor: Cesium.Color.YELLOW,

            style: Cesium.LabelStyle.CENTER_LABEL,

            // 垂直位置

            verticalOrigin: Cesium.VerticalOrigin.TOP,

            // 中心位置

            pixelOffset: new Cesium.Cartesian2(0, -50),

          },

          position: property,

          // 根据所提供的速度计算模型的朝向

          orientation: new Cesium.VelocityOrientationProperty(property),

          // 模型数据

          model: {

            uri: modelUrl ? modelUrl : '../../../assets/gltfModel/Cesium_Air.glb',

            minimumPixelSize: 128,

          }

        });

        entitys.push(palner);

        //动态刷新模型位置,进而刷新相机位置

        let cameraEntity = viewer.scene.preUpdate.addEventListener(function () {

          //console.log("==============================================")

          if (palner && $("#alongWith").val() == 1) {

            // console.log("aaaaaaaaaaaa:" + new Date());

            hpRange = viewer.camera;

            //hpRange.heading = Cesium.Math.toRadians(180);

            // hpRange.pitch = Cesium.Math.toRadians(45);

            hpRange.range = 15000000;

            var center = palner.position.getValue(viewer.clock.currentTime);

            if (center) viewer.camera.lookAt(center, hpRange);

          }

        });

        //波束跟随 一直跟随模型移动

        //beamWithLig(data.satelliteList[4], palner, 600000);

    //一秒钟波束跳一次 方法

        for (let time of currentTime) {

          var position = palner.position.getValue(time);

          var cartographic = viewer.scene.globe.ellipsoid.cartesianToCartographic(position);

          var ecLat = Cesium.Math.toDegrees(cartographic.latitude);

          var ecLong = Cesium.Math.toDegrees(cartographic.longitude);

          var alt = cartographic.height;

          let eneity;

          if ((time.secondsOfDay - 14437) > 180) {

            eneity = dataFly[0][4].satellite

          } else {

            eneity = dataFly[0][0].satellite

          }

          taskJumpLight(ecLong, ecLat, eneity, time.secondsOfDay - 14437);

        }

        //切换波束操作

        jumpLightFun = window.setInterval(() => {

          let time = (Number.parseInt(viewer.clock.currentTime.secondsOfDay) - 14437) + "";

          if (time.length == 1) {

            time = 0;

          } else if (time.length == 2) {

            time = Number(time.substr(0, 1) + "0")

          } else if (time.length == 3) {

            time = Number(time.substr(0, 2) + "0")

          }

          // time = Number.parseInt(time / 10) * 10 + 10;

          //console.log("time:" + time)

          if (time) {

            for (let entity of entitys) {

              if (entity._name === time) {

                entity.show = true;

              } else if (entity._name) {

                entity.show = false;

              }

            }

          }

        }, 500);

      }

      function computeFlight (source) {

        // 取样位置 相当于一个集合

        let property = new Cesium.SampledPositionProperty();

        for (let i = 0; i < source.length; i++) {

          let time = Cesium.JulianDate.addSeconds(start, source[i].time, new Cesium.JulianDate);

          let position = Cesium.Cartesian3.fromDegrees(source[i].longitude, source[i].dimension, source[i].height);

          // 添加位置,和时间对应

          property.addSample(time, position);

        }

        return property;

      }

    /**

     * @Des 波束跟随

     * @param {卫星对象} sourEntity

     * @param {移动模型} tarEntity

     * @param {波速半径 (可选)} radius

     */

    function beamWithLig (sourEntity, tarEntity, radiusaaa) {

      var isConstant = false;

      //var sourceColor = tarEntity.model.color;

      var tcColor = Cesium.Color.fromAlpha(Cesium.Color.RED, parseFloat(0.5));

      var colors = Cesium.Color.fromRandom({ alpha: 0.4 });

      for (var k = 0; k < 36; k += 3) {

        let beam = Cesium.when(k).then(function (k) {

          let beamEntity = viewer.entities.add({

            polygon: {

              hierarchy: new Cesium.CallbackProperty(function (time, result) {

                var time = viewer.clock.currentTime;

                var position = tarEntity.position.getValue(time);

                if (!Cesium.defined(tarEntity)) {

                  return Cesium.Cartesian3.fromDegreesArrayHeights([]);

                }

                if (!Cesium.defined(position)) {

                  return Cesium.Cartesian3.fromDegreesArrayHeights([]);

                }

                //获取postion进行反向解析

                var cartographic = viewer.scene.globe.ellipsoid.cartesianToCartographic(position);

                var ecLat = Cesium.Math.toDegrees(cartographic.latitude);

                var ecLong = Cesium.Math.toDegrees(cartographic.longitude);

                var alt = cartographic.height;

                //如果是卫星是移动模型 可使用

                // var sourPos = sourEntity.position.getValue(time, result);

                // var cartographic1 = viewer.scene.globe.ellipsoid.cartesianToCartographic(sourPos);

                //卫星固定模型  卫星经纬度(自行修改)

                var sourLon = sourEntity.longitude;

                var sourLat = sourEntity.latitude;

                var souralt = sourEntity.satelliteHeight;

                var r = 600000;//半径

                var color = '#0000FF';

                var finalArr = [];

                //模拟光照效果的若干多边形

                var points = [];

                for (var i = 0; i < 360; i += 30) {

                  var coord = offsetToLongLat([

                    ecLong, ecLat

                  ], [Math.cos(Math.PI * i / 180) * r, Math.sin(Math.PI * i / 180) * r]);

                  points.push(coord[0]);

                  points.push(coord[1]);

                  points.push(alt);

                }

                var array = [sourLon, sourLat, souralt, points[k], points[k + 1], points[k + 2]];

                if (k + 3 == points.length) {

                  array.push(points[0]);

                  array.push(points[1]);

                  array.push(points[2]);

                }

                else {

                  array.push(points[k + 3]);

                  array.push(points[k + 4]);

                  array.push(points[k + 5]);

                }

                return Cesium.Cartesian3.fromDegreesArrayHeights(array);

              }, isConstant),

              perPositionHeight: true,

              outline: false,

              material: colors

            }

          });

          entitys.push(beamEntity);

        })

      }

      function offsetToLongLat (start, offset) {

        var er = 6378137;

        var lat = parseFloat(start[1]);

        var lon = parseFloat(start[0]);

        var dn = parseFloat(offset[1]);

        var de = parseFloat(offset[0]);

        dLat = dn / er;

        var pi = Math.PI;

        var dLon = de / (er * Math.cos(pi * lat / 180));

        return [lon + dLon * 180 / pi, lat + dLat * 180 / pi];

      }

    }

    function taskJumpLight (longitude, latitude, satellite, id) {

      //生成新光束

      var stltPos = [Number(satellite.longitude), Number(satellite.latitude), Number(satellite.satelliteHeight)];

      let coverStyle = {};

      coverStyle.r = 800000;

      coverStyle.ecLong = longitude;

      coverStyle.ecLat = latitude;

      coverStyle.color = '#ff0000';

      var ec = Cesium.Cartesian3.fromDegrees(coverStyle.ecLong, coverStyle.ecLat, 0);

      // 模拟光照效果的若干多边形

      var points = [];

      for (var i = 0; i < 360; i += 1) {

        var coord = offsetToLongLat([coverStyle.ecLong, coverStyle.ecLat], [Math.cos(Math.PI * i / 180) * coverStyle.r, Math.sin(Math.PI * i / 180) * coverStyle.r]);

        points.push(coord[0]);

        points.push(coord[1]);

      }

      //重写光束实体数据

      lightShinePolygon(stltPos, points, coverStyle.color, id);

      function offsetToLongLat (start, offset) {

        var er = 6378137;

        var lat = parseFloat(start[1]);

        var lon = parseFloat(start[0]);

        var dn = parseFloat(offset[1]);

        var de = parseFloat(offset[0]);

        dLat = dn / er;

        var pi = Math.PI;

        var dLon = de / (er * Math.cos(pi * lat / 180));

        return [lon + dLon * 180 / pi, lat + dLat * 180 / pi];

      }

      function lightShinePolygon (stltPos, points, color, id) {

        for (var i = 0; i < points.length; i += 2) {

          var array = [stltPos[0], stltPos[1], stltPos[2], points[i], points[i + 1], 0];

          if (i + 2 == points.length) {

            array.push(points[0]);

            array.push(points[1]);

          } else {

            array.push(points[i + 2]);

            array.push(points[i + 3]);

          }

          array.push(0);

          var polygonBeam = viewer.entities.add({

            name: id,

            polygon: {

              hierarchy: Cesium.Cartesian3.fromDegreesArrayHeights(array),

              perPositionHeight: true,

              outline: false,

              material: Cesium.Color.fromAlpha(Cesium.Color.fromCssColorString(color), 0.3)

            }

          });

          polygonBeam.show = false;

          entitys.push(polygonBeam);

        }

      }

    }

    期待批评指导!

    //飞行数据

    dataFly[0] = [

      { longitude: 142.7, dimension: 21.0, height: 0, time: 0, satellite: data.satelliteList[4] },

      { longitude: 132.4, dimension: 5.4, height: 50000, time: 20, satellite: data.satelliteList[4] },

      { longitude: 121.5, dimension: -22, height: 70000, time: 60, satellite: data.satelliteList[4] },

      { longitude: 170, dimension: -28.15, height: 70000, time: 100, satellite: data.satelliteList[4] },

      { longitude: -153, dimension: 0, height: 100000, time: 180, satellite: data.satelliteList[7] },

      { longitude: -130.5, dimension: 30, height: 70000, time: 280, satellite: data.satelliteList[7] },

      { longitude: -92, dimension: -1.4, height: 70000, time: 320, satellite: data.satelliteList[7] },

      { longitude: -50.2821, dimension: 10.0, height: 50000, time: 360, satellite: data.satelliteList[7] }];

    //飞行时序  36s    

    let currentTime = [

      { dayNumber: 2459137, secondsOfDay: 14437 },

      { dayNumber: 2459137, secondsOfDay: 14447 },

      { dayNumber: 2459137, secondsOfDay: 14457 },

      { dayNumber: 2459137, secondsOfDay: 14467 },

      { dayNumber: 2459137, secondsOfDay: 14477 },

      { dayNumber: 2459137, secondsOfDay: 14487 },

      { dayNumber: 2459137, secondsOfDay: 14497 },

      { dayNumber: 2459137, secondsOfDay: 14507 },

      { dayNumber: 2459137, secondsOfDay: 14517 },

      { dayNumber: 2459137, secondsOfDay: 14527 },

      { dayNumber: 2459137, secondsOfDay: 14537 },

      { dayNumber: 2459137, secondsOfDay: 14547 },

      { dayNumber: 2459137, secondsOfDay: 14557 },

      { dayNumber: 2459137, secondsOfDay: 14567 },

      { dayNumber: 2459137, secondsOfDay: 14577 },

      { dayNumber: 2459137, secondsOfDay: 14587 },

      { dayNumber: 2459137, secondsOfDay: 14597 },

      { dayNumber: 2459137, secondsOfDay: 14607 },

      { dayNumber: 2459137, secondsOfDay: 14617 },

      { dayNumber: 2459137, secondsOfDay: 14627 },

      { dayNumber: 2459137, secondsOfDay: 14637 },

      { dayNumber: 2459137, secondsOfDay: 14647 },

      { dayNumber: 2459137, secondsOfDay: 14657 },

      { dayNumber: 2459137, secondsOfDay: 14667 },

      { dayNumber: 2459137, secondsOfDay: 14677 },

      { dayNumber: 2459137, secondsOfDay: 14687 },

      { dayNumber: 2459137, secondsOfDay: 14697 },

      { dayNumber: 2459137, secondsOfDay: 14707 },

      { dayNumber: 2459137, secondsOfDay: 14717 },

      { dayNumber: 2459137, secondsOfDay: 14727 },

      { dayNumber: 2459137, secondsOfDay: 14737 },

      { dayNumber: 2459137, secondsOfDay: 14747 },

      { dayNumber: 2459137, secondsOfDay: 14757 },

      { dayNumber: 2459137, secondsOfDay: 14767 },

      { dayNumber: 2459137, secondsOfDay: 14777 },

      { dayNumber: 2459137, secondsOfDay: 14787 },

      { dayNumber: 2459137, secondsOfDay: 14797 },

    ]

     

     

  • 相关阅读:
    qt中qmake的详解
    教程:从零开始 使用Python进行深度学习!
    win10系统下搭建Python开发环境和TensorFlow深度学习环境(CPU版)
    怎么选择视觉光源颜色
    pycharm安装及设置中文
    新建DataSet和DataTable,并从中提取数据到文本
    网站服务基础面试
    TCP、UDP数据包大小的限制
    TCP的三次握手与四次挥手理解及面试题(很全面)
    zabbix服务深入
  • 原文地址:https://www.cnblogs.com/Linlearn/p/13754320.html
Copyright © 2011-2022 走看看