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 },

]

 

 

 

 

posted @ 2020-09-30 14:18  我等你,你等风来  阅读(2934)  评论(1编辑  收藏  举报