根据接口返回数据实现实时无人机飞行

在业务场景中,往往是通过后端返回实时坐标数据进行无人机飞行,因此本文章是基于mock一个后端业务数据进行场景模拟,废话不多说,上代码


mock坐标及时间数据

export const time=[
  {
    "position": [120.272422, 37.568514],
    "time": "2025-02-23T00:00:00.000Z"
  },
  {
    "position": [120.250618, 37.558637],
    "time": "2025-02-23T00:00:31.185Z"
  },
  {
    "position": [120.234721, 37.572175],
    "time": "2025-02-23T00:01:03.562Z"
  },
  {
    "position": [120.25341, 37.584348],
    "time": "2025-02-23T00:01:35.894Z"
  },
  {
    "position": [120.234184, 37.60188],
    "time": "2025-02-23T00:02:08.440Z"
  },
  {
    "position": [120.253303, 37.622301],
    "time": "2025-02-23T00:02:40.796Z"
  },
  {
    "position": [120.293475, 37.622046],
    "time": "2025-02-23T00:03:14.397Z"
  },
  {
    "position": [120.288856, 37.610219],
    "time": "2025-02-23T00:03:47.061Z"
  },
  {
    "position": [120.270596, 37.596604],
    "time": "2025-02-23T00:04:19.231Z"
  },
  {
    "position": [120.290682, 37.58239],
    "time": "2025-02-23T00:04:51.641Z"
  },
  {
    "position": [120.300349, 37.594051],
    "time": "2025-02-23T00:05:24.015Z"
  },
  {
    "position": [120.310553, 37.587582],
    "time": "2025-02-23T00:05:56.413Z"
  }
]

具体业务飞行代码

getPosition(data) {

      let positions = data.map((item, index) => {
        return [...item["position"], 600 + index * 100 * Math.random()];
      });

      // positions = positions.flat(2);

      return positions;
    },
    //加载无人机
    initDrone() {
      //初始化飞行时间
      let startTime = time[0].time
      let startJulianDate=Cesium.JulianDate.fromDate(new Date(startTime))
      let stopTime = time[time.length - 1].time
      let stopJulianDate=Cesium.JulianDate.fromDate(new Date(stopTime))
      window.$viewer.clock.startTime = startJulianDate
      window.$viewer.clock.stopTime = stopJulianDate
      window.$viewer.clock.currentTime = startJulianDate;
      window.$viewer.clock.clockRange = Cesium.ClockRange.LOOP_STOP,
        // window.$viewer.clock.clockStep = Cesium.ClockStep.SYSTEM_CLOCK_MULTIPLIER;
        window.$viewer.clock.multiplier = 1;

      //时间抽样
      var property = new Cesium.SampledPositionProperty();


      let positions = this.getPosition(time);
      console.log(positions, 'positions')
      positions.forEach((item, index) => {
        // stopTime = startTime + 5000 * index

        let timeStemp= time[index].time
        console.log(item, 'item')
        console.log(new Date(startJulianDate), 'startJulianDate')

        property.addSample(Cesium.JulianDate.fromDate(new Date(timeStemp)), Cesium.Cartesian3.fromDegrees(item[0], item[1], item[2]))
      })
      //设置插入时算法

      property.setInterpolationOptions({
        interpolationAlgorithm: Cesium.LagrangePolynomialApproximation,
        interpolationDegree: 0.0001,
      })
      console.log(property, 'property')

      let drone = window.$viewer.entities.add({
        name: "无人机",
        position: property,
        availability: new Cesium.TimeIntervalCollection([
          new Cesium.TimeInterval({
            start: Cesium.JulianDate.fromDate(new Date(startTime)),
            stop: Cesium.JulianDate.fromDate(new Date(stopTime))
          }),
        ]),
        orientation: new Cesium.VelocityOrientationProperty(property),
        polyline: {
          positions: Cesium.Cartesian3.fromDegreesArrayHeights(positions.flat(2)),
          width: 6,
          material: new Cesium.PolylineGlowMaterialProperty({
            glowPower: 0.5,
            taperPower: 1.0,
            color: Cesium.Color.YELLOW.withAlpha(0.5),
          }),
        },
        path: {
          material: new Cesium.PolylineGlowMaterialProperty({
            color: Cesium.Color.YELLOW.withAlpha(0.5),
            glowPower: 0.2,
          }),
          width: 10,
          leadTime: 0,
          resolution: 1,
          trailTime: 0.1,
        },
        model: {
          uri: "/model/GLB/CesiumDrone.glb",
          minimumPixelSize: 64,
          maximumScale: 20000,
        },
      });

      window.$viewer.trackedEntity = drone;
    },

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值