准确获取overlay,点击地图判断是否在overlay内部

removeGroundOverlay(e) {
    let isOut = 1;
    const stationSign = document.querySelectorAll('.station-sign');
    stationSign.length && stationSign.forEach((station) => {
      if (station.contains(e.originalEvent.target)) {
        isOut = 0;
        console.log(station.childNodes[0].childNodes[1].childNodes[5]);
        // 若点击了overlay中触发其他事件的元素
        if (station.childNodes[0].childNodes[1].childNodes[5].contains(e.originalEvent.target)) {
          console.log("comp", JSON.parse(station.childNodes[0].getAttribute('id')));
          emitter.emit('rendGroundChart', JSON.parse(station.childNodes[0].getAttribute('id')))
        }
      }
    })
    if (isOut) {
      // 查找所有 Overlay
      const overlays = this.#map
        ?.getOverlays()
        ?.getArray()
        ?.slice(0)
        ?.filter((item) => item.element.className === "station-sign")
        ?.forEach((item) => {
          this.#map.removeOverlay(item);
      });
    }
  }

以下是渲染overlay的逻辑‘

  addStationOverlay(feature, res) {
    const coor = feature.getGeometry().getCoordinates();
    let stationSign = document.createElement('div');
    stationSign.classList.add('station-sign-item');
    stationSign.innerHTML = `
    <div class="top">
      <div class="head"><span>${feature.get('name')}(${res.station_num})</span></div>
      <div class="body">
        <div class="title">${res.stationSignTitle}:</div>
        <div class="content">${res.description}${res.unit}</div>
      </div>
      <div class="link">
        <div class="title">站点实况</div>
        <img src="${imageUrl('map-tool/arrow-right.png')}" />
      </div>
    </div>
    <div class="bottom">
      <div class="rect"></div>
      <div class="circle"></div>
    </div>
    `;
    // 手动给overlay中的元素增加属性,这样就可以在获取到overlay的同时,也能获取到相关的数据
    // 理论来说应当可以直接给overlay本身添加自定义属性,但是翻了翻搜索,官网也打不开,暂且如此
    const id = document.createAttribute('id');
    id.value = JSON.stringify({
      stationId: res.station_num,
      name: feature.get('name'),
      feature: feature,
      res: res
    });
    stationSign.setAttributeNode(id);
    let stationSignOverlay = new Overlay({
      type: 'shipArea',
      element: stationSign,
      positioning: 'bottom-center',
      stopEvent: false,
      offset: [0, 5],
      position: coor,
      className: 'station-sign',
      zIndex: 4,
    });
    this.map.addOverlay(stationSignOverlay);
  }

以下是overlay 由于数据变化进行的重画,options是新的对overlay的设置

refreshStationOverlay(option) {
    const stationSign = document.querySelectorAll('.station-sign');
    stationSign.length && stationSign.forEach(async (station) => {
      console.log("comp", JSON.parse(station.childNodes[0].getAttribute('id')));
      const { feature, res } = JSON.parse(station.childNodes[0].getAttribute('id'));
      // params 是数据请求的参数
      let newRes = await apiGetStationInfo(params);
      station.childNodes[0].innerHTML = `
        <div class="top">
          <div class="head"><span>${feature.values_.name}(${res.station_num})</span></div>
          <div class="body">
            <div class="title">${option.stationSignTitle}:</div>
            <div class="content">${newRes.data[0].pr}${option.unit}</div>
          </div>
          <div class="link">
            <div class="title">站点实况</div>
            <img src="${imageUrl('map-tool/arrow-right.png')}" />
          </div>
        </div>
        <div class="bottom">
          <div class="rect"></div>
          <div class="circle"></div>
        </div>`;
    });
  }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值