cesium实现动态圆扩散扫描效果

效果如下


主要调用如下方法:

mapMixin._c_add_rotate_circle([120.952811,31.957272,1000],circlePng,800,'run_circle')   // 添加动态圆扫描
mapMixin._c_add_run_circle({position:[120.952811,31.932272,1000],minR:100,maxR:1000,deviationR:1,img:circlePng1})   // 添加动态圆扩散
mapMixin._c_add_run_point({positions:[120.942811,31.932272,1000],minR:100,maxR:1000,deviationR:1,img:circlePng1})   // 添加动态圆点

主要代码如下

<template>
  <div class="mapBox">
    <div id="cesium" ref="cesium"></div>
  </div>
</template>

<script>
import circlePng from "@/assets/images/cesium/circle红.png";
import circlePng1 from "@/assets/images/cesium/circle蓝1.png";
export default {
  data() {
    return {
      viewer:null,
      tilesets:null
    }
  },
  mounted() {
    this.mapInit();
  },
  methods: {
    mapInit() {
      Cesium.Camera.DEFAULT_VIEW_RECTANGLE = Cesium.Rectangle.fromDegrees( 90, -20, 110, 90); //西南东北,默认显示中国
      this.viewer = new Cesium.Viewer("cesium", {
        animation: false, //是否显示动画控件
        homeButton: false, //是否显示home键
        geocoder: false,// 查询
        baseLayerPicker: false, //是否显示图层选择控件
        timeline: false, //是否显示时间线控件
        fullscreenButton: false, //是否全屏显示
        scene3DOnly: true, //如果设置为true,则所有几何图形以3D模式绘制以节约GPU资源
        infoBox: false, //是否显示点击要素之后显示的信息
        sceneModePicker: false, //是否显示投影方式控件  三维/二维
        navigationHelpButton: false, //是否显示帮助信息控件
        imageryProvider: new Cesium.UrlTemplateImageryProvider({
          url: "http://map.geoq.cn/ArcGIS/rest/services/ChinaOnlineStreetPurplishBlue/MapServer/tile/{z}/{y}/{x}",
        }),
        terrainProvider: new Cesium.CesiumTerrainProvider({ 
          url: "http://data.marsgis.cn/terrain"
        }),
        skyAtmosphere:false,
        // orderIndependentTranslucency: false,
        contextOptions: {
          webgl: {
            alpha: true,
          },
        },
      });
      // 设置基本属性
      this.viewer.scene.sun.show = false; 
      this.viewer.scene.moon.show = false;
      this.viewer.scene.skyBox.show = false; //关闭天空盒,否则会显示天空颜色
      this.viewer.scene.undergroundMode = true; 
      this.viewer.scene.globe.show = true; 
      this.viewer.scene.backgroundColor = new Cesium.Color(0, 0, 0, 0);
      this.viewer.scene.screenSpaceCameraController.minimumZoomDistance = 1000;
      this.viewer.scene.screenSpaceCameraController.maximumZoomDistance = 5600000;
      if (Cesium.FeatureDetection.supportsImageRenderingPixelated()) {
        //判断是否支持图像渲染像素化处理
        this.viewer.resolutionScale = window.devicePixelRatio;
      }
      this.viewer.scene.fxaa = true;
      this.viewer.scene.postProcessStages.fxaa.enabled = true;
      // 隐藏版权
      this.viewer._cesiumWidget._creditContainer.style.display = "none";

      this.viewer.scene.camera.setView({
        destination: Cesium.Cartesian3.fromDegrees(
          120.952811,31.854272,
          6000
        ),
        orientation: {
          heading: Cesium.Math.toRadians(0),
          pitch: Cesium.Math.toRadians(-40),
          roll: Cesium.Math.toRadians(0), //heading、pitch和roll就是镜头相对于xyz轴的角度,比如pitch为-90°而另外两个为0时,就是90°向下俯视地球。
        },
      });
      mapMixin.viewer = this.viewer
      mapMixin._c_add_rotate_circle([120.952811,31.957272,1000],circlePng,800,'run_circle')   // 添加动态圆扫描
      mapMixin._c_add_run_circle({position:[120.952811,31.932272,1000],minR:100,maxR:1000,deviationR:1,img:circlePng1})   // 添加动态圆扩散
      mapMixin._c_add_run_point({positions:[120.942811,31.932272,1000],minR:100,maxR:1000,deviationR:1,img:circlePng1})   // 添加动态圆点
    },
  },
  }
</script>
<style lang='scss'>
.mapBox{
  width: 100%;
  height: 100%;
  #cesium{
    width: 100%;
    height: 100%;
    padding:20px;
    box-sizing: border-box;
  }
  .cesium-selection-wrapper,.cesium-selection-wrapper-visible{
    display: none!important;
  }
}
</style>

 

 

 方法代码如下:

// 添加动态圆this._c_add_rotate_circle([120.952811,31.932272,1000],run_circle,1500,'Prevention_run_circle')
    _c_add_rotate_circle: function(position,img,r,type){
      var rotation = Cesium.Math.toRadians(30);
      function changeR1(){
        rotation -= 0.05;
        return rotation;
      }
      this.viewer.entities.add({
        id:type+this._m_uuid(),
        name : 'Red plane with black outline',
        position: Cesium.Cartesian3.fromDegrees(position[0],position[1],position[2]),
        ellipse: {
          semiMinorAxis: r,
          semiMajorAxis: r,
          height: 20,
          stRotation:new Cesium.CallbackProperty(changeR1, false),
          material: new Cesium.ImageMaterialProperty({
            image: img,
            repeat: new Cesium.Cartesian2(1.0, 1.0),
            transparent: true,
          }),
        },
      });
    },


// 添加动态圆let data = {id:this.drawGeometryList.length+1,name:'危险区域',position:cartesian,text:'',minR:100,maxR:100,deviationR:0}
    _c_add_run_circle: function(item){
      // 平面圆 动态变大
      var data = { id: 1, minR: item.minR, maxR: item.maxR, deviationR: item.deviationR };
      let r1 = data.minR
      function changeR1() {
        // 自动动态扩大
        r1 = r1 + data.deviationR; //deviationR为每次圆增加的大小
        if (r1 >= data.maxR) {
          r1 = data.minR;
        }
        return r1
      }
      var circle = this.viewer.entities.add({
        id:item.id,
        name: item.name,
        position:Cesium.Cartesian3.fromDegrees(item.position[0], item.position[1], item.position[2]),
        ellipse: {
          semiMinorAxis: new Cesium.CallbackProperty(changeR1, false),
          semiMajorAxis: new Cesium.CallbackProperty(changeR1, false),
          height: 20,
          material: new Cesium.ImageMaterialProperty({
            image: item.img,
            repeat: new Cesium.Cartesian2(1.0, 1.0),
            transparent: true,
            // 颜色逐渐透明
            // color:new Cesium.CallbackProperty(function () {
            //   if(data.minR != data.maxR){
            //     var alp=1-r1/data.maxR;
            //     return Cesium.Color.WHITE.withAlpha(alp)  //entity的颜色透明 并不影响材质,并且 entity也会透明哦
            //   }
            // },false)
          }),
        },
        label: { 
          text: item.text,
          font: '500 15px Helvetica',
          showBackground: false,
          backgroundColor: Cesium.Color.fromCssColorString("#40d0da"),
          pixelOffset: new Cesium.Cartesian2(0,0),
        },
      });
      return circle
    },



    // 添加扩散点
    _c_add_run_point: function(item){
      let point = this.viewer.entities.add({
        id:item.draw_id,
        position:Cesium.Cartesian3.fromDegrees(item.positions[0], item.positions[1], item.positions[2]),
        show:true,
        ellipse:{
          semiMinorAxis :50,
          semiMajorAxis :50,
          height:10,
          material:Cesium.Color.fromCssColorString("#07e0e8").withAlpha(0.8)
        },
        label: { 
          text: item.dec,
          font: '500 15px Helvetica',
          showBackground: true,
          backgroundColor: Cesium.Color.fromCssColorString("#02a9ff"),
          pixelOffset: new Cesium.Cartesian2(0,-30),
        },
      });
      this.addCircleRipple({
        position:Cesium.Cartesian3.fromDegrees(item.positions[0], item.positions[1], item.positions[2]),
        deviationR:1,//差值 差值也大 速度越快
        eachInterval:1000,//两个圈的时间间隔
        imageUrl:item.img,
        maxR:200,
        type:item.draw_id
      });
      return point
    },

    addCircleRipple: function(data){
      var r1=0,r2=0;
      function changeR1() { //这是callback,参数不能内传
        r1=r1+data.deviationR;
        if(r1>=data.maxR){
          r1=0;
        }
        return r1;
      }
      //第一个圆先跑
      this.viewer.entities.add({
        id:data.type+this._m_uuid(),
        description:"LIGHT_POINTS",
        position:data.position,
        show:true,
        ellipse:{
          semiMinorAxis :new Cesium.CallbackProperty(changeR1,false),
          semiMajorAxis :new Cesium.CallbackProperty(changeR1,false),
          height:10,
          material:new Cesium.ImageMaterialProperty({
            image:data.imageUrl,
            repeat:Cesium.Cartesian2(1.0, 1.0),  //指定图像在每个方向上重复的次数,默认为Cesium.Cartesian2(1.0, 1.0),{Cartesian2}类型
            transparent:true,// 默认为false,当图像具有透明性时设置为true(例如,当png具有透明部分时)
            color:new Cesium.CallbackProperty(function () {
              var alp=1-r1/data.maxR;
              return  Cesium.Color.WHITE.withAlpha(alp)
              //entity的颜色透明 并不影响材质,并且 entity也会透明
            },false)
          })
        }
      });
      //第二个圆开始跑
      setTimeout( ()=> {
        function changeR2() { //这是callback,参数不能内传
          r2=r2+data.deviationR;
          if(r2>=data.maxR){
            r2=0;
          }
          return r2;
        }
        this.viewer.entities.add({
          id:data.type+this._m_uuid(),
          description:"LIGHT_POINTS",
          position:data.position,
          show:true,
          ellipse:{
            semiMinorAxis :new Cesium.CallbackProperty(changeR2,false),
            semiMajorAxis :new Cesium.CallbackProperty(changeR2,false),
            height:10,
            material:new Cesium.ImageMaterialProperty({
              image:data.imageUrl,
              repeat:Cesium.Cartesian2(1.0, 1.0),
              transparent:true,
              color:new Cesium.CallbackProperty(function () {
                  var alp=1-r2/data.maxR;
                  return  Cesium.Color.WHITE.withAlpha(alp)
                  //entity的颜色透明 并不影响材质,并且 entity也会透明
              },false)
            })
          }
        });
      },data.eachInterval)
    },

  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值