基于Cesium 风力图实现

import CanvasWindy from '@/cesiumsdk/cesiumWindy'
let globalExtent = []
 creatWindy() {
      axios.get('data.json').then(({ data }) => {
        const resizeCanvas = () => {
          windycanvas.width = window.innerWidth
          windycanvas.height = window.innerHeight
          if (windy) {
            windy._resize(windycanvas.width, windycanvas.height)
          }
        }

        const params = {
          viewer: viewer,
          canvasWidth: window.innerWidth,
          canvasHeight: window.innerHeight,
          speedRate: 5000,
          particlesNumber: 10000,
          maxAge: 120,
          frameRate: 10,
          color: '#ffffff',
          lineWidth: 1
        }

        handler.setInputAction(() => {
          this.getCesiumExtent()
          windy.extent = globalExtent
          windy.redraw()
        }, Cesium.ScreenSpaceEventType.WHEEL)

        let windycanvas = document.createElement('canvas')
        windycanvas.setAttribute('id', 'windycanvas')
        windycanvas.style.position = 'fixed'
        windycanvas.style.pointerEvents = 'none'
        windycanvas.style.zIndex = 10
        windycanvas.style.top = 0
        document.body.appendChild(windycanvas)
        resizeCanvas()
        window.onresize = resizeCanvas

        params.canvas = windycanvas
        windy = new CanvasWindy(data, params)
        //windy.removeLines()
      })
    },
    getCesiumExtent() {
      var canvaswidth = window.innerWidth,
        canvasheight = window.innerHeight - 50

      var left_top_pt = new Cesium.Cartesian2(0, 0)
      var left_bottom_pt = new Cesium.Cartesian2(0, canvasheight)
      var right_top_pt = new Cesium.Cartesian2(canvaswidth, 0)
      var right_bottom_pt = new Cesium.Cartesian2(canvaswidth, canvasheight)

      var pick1 = viewer.scene.globe.pick(viewer.camera.getPickRay(left_top_pt), viewer.scene)
      var pick2 = viewer.scene.globe.pick(viewer.camera.getPickRay(left_bottom_pt), viewer.scene)
      var pick3 = viewer.scene.globe.pick(viewer.camera.getPickRay(right_top_pt), viewer.scene)
      var pick4 = viewer.scene.globe.pick(viewer.camera.getPickRay(right_bottom_pt), viewer.scene)
      if (pick1 && pick2 && pick3 && pick4) {
        //将三维坐标转成地理坐标---只需计算左下右上的坐标即可
        var geoPt1 = viewer.scene.globe.ellipsoid.cartesianToCartographic(pick2)
        var geoPt2 = viewer.scene.globe.ellipsoid.cartesianToCartographic(pick3)
        //地理坐标转换为经纬度坐标
        var point1 = [(geoPt1.longitude / Math.PI) * 180, (geoPt1.latitude / Math.PI) * 180]
        var point2 = [(geoPt2.longitude / Math.PI) * 180, (geoPt2.latitude / Math.PI) * 180]
        // console.log(point1,point2);
        //此时说明extent需要分为东西半球
        if (point1[0] > point2[0]) {
          globalExtent = [point1[0], 180, point1[1], point2[1], -180, point2[0], point1[1], point2[1]]
        } else {
          globalExtent = [point1[0], point2[0], point1[1], point2[1]]
        }
      } else {
        globalExtent = []
      }
      return globalExtent
    },

体验地址:47.94.102.38:1463/dist/#/

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小白学过的代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值