Cesium 点击实体显示可随地图移动的弹框

发布时间:2024年01月11日

在这里插入图片描述

实体数据加载到地图上之后,使用点击事件拾取实体获取实体信息

 clickPop() {
      let _this = this;
      // 实体的点击事件
      _this.drawHandler = new Cesium.ScreenSpaceEventHandler(
        viewer.scene.canvas
      );
      _this.drawHandler.setInputAction(function (click) {
        let pickedObject = viewer.scene.pick(click.position);
        // 判断一下在添加点的时候给点绑定的标识在不在
        // 来判断点击的是哪种类型的点,根据不同的类型显示不同的弹框
        if (
          pickedObject &&
          pickedObject.hasOwnProperty('id') &&
          pickedObject.id &&
          typeof pickedObject.id == 'object' &&
          pickedObject.id.hasOwnProperty('layerId') &&
          pickedObject.id.layerId.indexOf('*') == -1 &&
          pickedObject.id.layerId.indexOf('monitor') == -1 
        ) {
          let tempId = pickedObject.id.layerId.split('-')[1];// 截取之前拼接的标识符
          let param = {
            deviceId: tempId,
            dataSources: pickedObject.id.dataSources || '',
          };// 向后端发请求
          getOneDeviceData(param).then((res) => {
            if (res.code == 200 && res.message == 'success') {
              let { result } = res;
              if (result) {
                  let tempHtml = `
                  <div>
                    <div class="cesium-popup-closer" οnclick="closePop()">
                      <i
                        class="ivu-icon ivu-icon-md-close ttt"
                        style="color: #ffffff; font-size: 25px"
                      ></i>
                    </div>
                    <div class="point-title">${pickedObject.id.deviceName}</div>
                    <div class="polygon-main">
                     // ...
                     // 这个里面写的就是你弹框中要显示的内容
                     // 可以先在页面上写好结构和样式然后移植过来
                    </div>
                  </div>`;
                  // 这里的经纬度高度一般都要和你添加的点位置一致,不然地图放大的时候可能会有偏移
                  let optionsw = {
                    position: [lng, lat],// 经纬度位置
                    alt: alt,// 高度
                    content: tempHtml,
                    offsetWidth: -330, // 横向偏移的像素值
                    offsetHeight: 490, // 纵向偏移的像素值,这两个值根据你弹框的背景来调整
                    id: 'opto2',
                  };
                  _this.pointMap(optionsw);
               }
            }
          });
        }
      }, Cesium.ScreenSpaceEventType.LEFT_CLICK);
    },

计算弹框位置的函数

    pointMap(options) {
      let optionsDom = document.querySelectorAll(`.cesium-popup`);
      if (optionsDom.length > 0) {
        for (let i = 0; i < optionsDom.length; i++) {
          optionsDom[i].remove();
        }
      }
      let phtml =
        `<div   id='${options.id}'  class='temp-box' >` +
        options.content +
        `</div>`;
      var div = document.createElement('div');
      div.innerHTML = phtml;
      if (viewer) {
        viewer.container.append(div);
      }
      this.addlayer(div, options.id);
      if (viewer) {
        viewer.scene._postRender.addEventListener(() => {
          if (viewer) {
            let windowCoord = Cesium.SceneTransforms.wgs84ToWindowCoordinates(
              viewer.scene,
              Cesium.Cartesian3.fromDegrees(...options.position, options.alt)
            );
            //这里要注意,如果弹框被移出屏幕外的时候,是计算不到位置的,如果不加这句话会报错
            if (!windowCoord) return;
            let x = windowCoord.x - options.offsetWidth;
            let y = windowCoord.y - options.offsetHeight;
            div.style.cssText = `
          position:absolute;
          left:0;
          top:0;
          width:300px;
          height:350px;
          transform:translate3d(${Math.round(x)}px,${Math.round(y)}px, 0);
      `;
            div.classList.add('cesium-popup');
          }
        });
      }
    },

添加弹框的函数

    addlayer(div, id) {
      if (window.layerCollection.has(id)) {
        window.layerCollection.get(id).push(div);
      } else {
        window.layerCollection.set(id, [div]);
      }
    },

关闭弹框的函数

    closePop() {
      let optionsDom = document.querySelectorAll(`.cesium-popup`);
      if (optionsDom.length > 0) {
        for (let i = 0; i < optionsDom.length; i++) {
          optionsDom[i].remove();
        }
      }
    },

注意一点,这个弹框的关闭函数会在页面初始化的时候绑定到window上,不然写在原生html标签里面的函数无法触发

window.closePop = this.closePop;
文章来源:https://blog.csdn.net/Y13349887034/article/details/135517775
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。